基于经典噪声估计算法的语音增强系统
项目简介
本项目是一个基于MATLAB开发的语音增强系统,专注于对比和实现语音信号处理领域中几种经典的噪声功率谱密度估计算法。系统核心架构基于短时傅里叶变换(STFT)和逆变换(ISTFT)框架,能够对带噪语音进行频域分析,实时跟踪背景噪声,并结合维纳滤波(Wiener Filtering)技术实现语音降噪。
项目不仅提供了针对非平稳噪声(如突发噪声)的鲁棒估计方案,还集成了详细的性能评估指标计算和多维度的可视化分析功能,适用于研究噪声估计算法的特性及其在助听器或前端语音处理中的应用。
功能特性
- 多算法对比:实现了三种经典的噪声估计算法(MS、MCRA、IMCRA)并在同一框架下进行对比。
- 鲁棒的信号处理框架:基于重叠相加法(Overlap-Add, OLA)的STFT/ISTFT实现,支持汉宁窗(Hann Window)和50%的帧移。
- 自适应信号生成:支持读取外部wav文件;若读取失败或无文件,系统会自动生成包含谐波语音、白噪声及突发噪声的合成测试信号。
- 语音增强:利用IMCRA算法估计的噪声谱,通过维纳滤波算法对带噪语音进行增强处理。
- 性能评估:计算输入与输出信号的信噪比(SNR)和分段信噪比(SegSNR)。
- 可视化分析:提供时域波形、语谱图、单频点噪声跟踪曲线及平均噪声谱密度的详细对比图表。
系统要求
- MATLAB R2016a 及以上版本
- Signal Processing Toolbox(推荐,用于重采样和窗函数处理)
使用方法
- 准备环境:确保MATLAB的工作路径包含项目源码。
- 配置输入:
* 默认尝试读取名为
noisy_input.wav 的文件。
* 如果该文件不存在,系统将自动进入模拟模式,生成时长3秒、采样率16kHz的合成带噪信号。
- 运行项目:直接运行
main 函数。 - 查看结果:
* 控制台将输出处理进度及SNR/SegSNR评估结果。
* 处理后的增强语音将保存为
enhanced_output.wav。
* 系统将弹出一个综合图形窗口,展示波形对比、语谱图及算法跟踪性能。
代码实现逻辑详解
本项目的所有核心逻辑均集成在 main.m 文件中,具体实现流程如下:
1. 信号准备与参数初始化
程序首先定义了全局信号处理参数,包括16kHz采样率、512点帧长(32ms)、256点帧移和汉宁窗。
在信号输入环节,代码采用了容错设计:尝试读取外部音频文件,若采样率不匹配则自动重采样;若读取失败,则通过正弦波合成纯净语音(含基频和谐波),并叠加高斯白噪声和特定时间段的突发噪声(Burst Noise),构建非平稳噪声环境。
2. 算法状态初始化
在进入处理循环前,系统为三种算法分配了内存空间用于存储噪声谱估计结果,并调用各自的初始化函数(
init_MS,
init_MCRA,
init_IMCRA)来设置算法特定的参数(如平滑因子、缓冲区大小、统计阈值等)。
3. 主处理循环(STFT域处理)
主循环按照帧为单位处理信号,核心步骤包括:
- 分帧与加窗:提取当前帧信号并应用汉宁窗,同时保留纯净信号帧用于后续的真实噪声谱计算对比。
- FFT变换:计算当前帧的功率谱和相位。
- 噪声估计更新:
*
Minimum Statistics (MS):调用
step_MS,基于最小值统计原理,更新噪声功率谱估计。
*
MCRA:调用
step_MCRA,基于最小值控制递归平均算法更新估计。
*
IMCRA:调用
step_IMCRA,执行改进型MCRA算法,该结果被选定用于后续的实际增强步骤。
- 语音增强:采用维纳滤波(Wiener Filtering)增益函数。利用IMCRA估算的噪声谱,计算先验信噪比增益,并将其作用于带噪信号的幅度谱上。
- ISTFT重构:结合原始相位和增强后的幅度谱,进行逆傅里叶变换,并通过Overlap-Add方法重建时域信号。
4. 性能评估与文件输出
处理结束后,代码对重构信号进行归一化处理以消除窗函数叠加带来的增益影响。随后,系统调用评估函数计算全带信噪比(SNR)和分段信噪比(SegSNR),并输出增强后的音频文件
enhanced_output.wav。
5. 可视化模块
代码最后生成一个包含六个子图的综合分析窗口:
- 时域波形:对比带噪输入和增强输出的波形。
- 语谱图:分别展示带噪信号和增强后信号的时频分布,直观反映降噪效果。
- 噪声跟踪性能:选取特定频点(如1000Hz),绘制真实噪声功率随时间的变化,并叠加MS、MCRA、IMCRA三者的跟踪曲线,展示算法对突发噪声的响应速度。
- 平均噪声谱:对比三种算法在所有帧上的平均噪声估计值与真实噪声谱的差异。
关键算法实现细节
代码中包含或调用了以下算法的具体实现逻辑:
Minimum Statistics (MS)
该算法基于“语音谱能量在频带内会有间歇性低谷”的假设。
- 递归平滑:使用平滑因子(alpha=0.85)对即时功率谱进行平滑。
- 最小值搜索:在长度为L(100帧)的缓冲区内搜索最小值。
- 偏差补偿:代码实现了一个简化的偏差补偿因子(Bc),用于修正由于取最小值导致的系统性低估。
MCRA (Minima Controlled Recursive Averaging)
该算法利用信号在频率和时间上的相关性来控制平滑参数。
- 参数设定:定义了频域平滑参数、似然比更新参数和噪声更新递归参数。
- 状态管理:维护了用于频率平滑的汉明窗系数和用于存储局部最小值的变量。
- 平滑机制:通过计算平滑功率谱来辅助语音存在概率的判断(虽然具体更新逻辑在代码片段末尾被截断,但初始化结构表明了其依赖于频域平滑和递归平均的机制)。
IMCRA (Improved MCRA)
虽然具体的辅助函数代码未完整展示,但在主循环中被明确调用。该算法通常作为MCRA的改进版,用于提供更准确的先验信息,主程序选择使用IMCRA的输出进行最终的维纳滤波增强,暗示了其在系统设定中具有最高的性能预期。