基于卡尔曼滤波的语音增强系统
项目介绍
本系统实现了一个基于卡尔曼滤波(Kalman Filter)算法的语音增强方案。项目旨在从受到加性高斯白噪声干扰的语音信号中提取纯净语音,提升信号的信噪比(SNR)和整体感知质量。该系统通过对语音信号进行短时平稳性处理,结合线性预测分析(LPC)建立语音的自回归(AR)模型,并将其转化为状态空间表达方式。在卡尔曼滤波的递归迭代过程中,系统能够动态追踪语音信号的状态演变,在有效抑制噪声的同时,较好地保留语音的时间包络和频谱特征。
功能特性
- 信号模拟与噪声注入:系统支持生成包含多频率分量的模拟语音信号,并根据预设的信噪比添加高斯白噪声,为算法验证提供标准输入。
- 短时平稳化处理:采用分帧、加窗技术,利用汉明窗(Hamming Window)减少频谱泄露,确保每一帧信号在分析时满足平稳性假设。
- 自适应LPC分析:内置手动实现的莱文森-德宾(Levinson-Durbin)递归算法,针对每一帧含噪语音实时计算线性预测系数。
- 状态空间建模:将LPC系数构建为伴随矩阵形式的状态转移矩阵,建立符合语音产生机理的状态空间方程。
- 递归卡尔曼滤波:在帧内进行样本级的预测与更新,动态计算卡尔曼增益,实现时域上的最优线性估计。
- 鲁棒性检查:包含LPC极点稳定性校验与径向收缩处理,防止滤波器因系数估计偏差产生失真或发散。
- 时频多维评估:提供时域波形图、语谱图对比以及精确的信噪比(SNR)增益计算功能。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 基础配置:无需特殊工具箱,核心算法均采用标准函数与手动逻辑实现。
实现逻辑说明
系统主程序按照以下流程串行执行:
- 参数初始化:定义采样率(8000Hz)、帧长(20ms)、重叠率(50%)及LPC阶数(12阶)。初始化含噪信号,计算测量噪声方差R。
- 预处理:将连续语音切割成相互重叠的帧,并逐帧施加汉明窗。
- 递归估计循环:
- LPC建模:对每一帧含噪信号进行自相关分析,通过Levinson-Durbin算法求解LPC系数,提取残差方差作为过程噪声Q的权重。
- 状态初始化:每一帧开始时初始化状态向量x与误差协方差矩阵P。
- 迭代滤波:在帧内部循环中,首先执行预测步(状态预测与协方差预报),随后根据当前观测样本计算卡尔曼增益,最后完成更新步(状态校正与协方差更新)。
- 信号重构:采用重叠相加法(Overlap-Add),将每一帧处理后的时域样点重新拼接,抵消窗函数的影响并保证信号的连续性。
- 性能度量:通过计算残差噪声能量,得到增强前后的信噪比提升分贝值,并生成直观的对比图表。
关键算法与实现细节剖析
算法核心:卡尔曼滤波器构建
系统将语音建模为p阶自回归过程。状态向量包含了当前及过去p-1个采样点的信息。状态转移矩阵F由LPC系数构成,测量矩阵H被设定为[1, 0, ..., 0],意味着每次观测仅对应状态向量中的第一个元素。这种建模方式使得卡尔曼滤波器能够利用语音的短时相关性,将噪声分配到预测残差中,从而提取出隐含的纯净信号状态。
LPC系数计算细节
内部函数手动实现了自相关法。通过计算信号序列的自相关函数,构建并求解Yule-Walker方程。为确保增强系统的稳定性,程序对求解出的极点进行了模长检测,若极点位于单位圆外,则通过径向收缩(Radial Consolidation)法将其移至单位圆内,从而保证合成语音不会由于反馈过强而产生突发能量。
噪声与增益控制
测量噪声协方差R直接由输入噪声能量决定,而过程噪声协方差Q则由LPC预测残差能量动态更新。这意味着对于清音或噪声较大的段落,卡尔曼增益倾向于更小的观测修正值;而对于信噪比较高、预测准确的元音段落,滤波器则能更精确地追踪语音细微特征。
重叠相加法(OLA)
为了消除分帧处理带来的边缘效应,程序在信号合成阶段不仅合并了各帧的滤波结果,还利用重叠区域的叠加特性抵消了汉明窗造成的幅度衰减,确保输出语音平滑且无明显点击声。
使用方法
- 首先下载或将程序脚本导入至MATLAB工作路径。
- 直接运行主函数(main),系统将自动生成一段模拟语音图像,并模拟加入5dB的噪声。
- 运行结束后,MATLAB将弹出两个图形窗口:
- 窗口1展示“原始纯净语音”、“含噪语音”与“增强后语音”的时域波形对比。
- 窗口2展示含噪信号与增强后信号的语谱图,用于观察频谱细节的恢复情况和噪声抑制效果。
- 在命令行窗口(Command Window)中可查看具体的信噪比提升数据(SNR Improvement)。