基于LPC算法的语音信号采集与重构系统
项目简介
本项目实现了一个基于MATLAB的语音信号线性预测编码(Linear Predictive Coding, LPC)分析与合成系统。该系统能够完成从语音信号采集、预处理、LPC特征参数提取、最佳预测阶数分析到信号重构的全过程。通过图形化展示,系统直观地反映了LPC算法对语音频谱包络的拟合能力以及预测阶数对重建质量的影响,适用于语音信号处理的教学演示与算法研究。
主要功能特性
- 多源信号获取:支持麦克风实时录音、WAV文件读取以及内部生成的合成测试信号。
- 标准化预处理:自动进行8kHz重采样、单声道转换、去直流及预加重处理。
- LPC核心算法:内置手写实现的Levinson-Durbin递推算法,不依赖额外工具箱函数直接求解预测系数。
- 智能阶数选择:通过计算预测误差能量与AIC(Akaike Information Criterion)准则,自动分析并推荐最佳LPC阶数。
- 信号重构:基于线性预测残差作为激励源,利用合成滤波器重构语音,并采用重叠相加法(Overlap-Add)恢复时域波形。
- 全方位可视化:提供原始/重构波形对比、LPC谱包络拟合图、阶数误差分析曲线以及残差信号自相关分析。
系统要求
- MATLAB R2016a 或更高版本
- Audio Toolbox(用于麦克风录制与音频文件读写)
- Signal Processing Toolbox(用于基础信号处理函数)
使用方法
- 启动MATLAB,将工作目录切换至项目所在文件夹。
- 运行
main 函数。 - 根据命令行提示选择输入源:
* 输入
1:启动麦克风录制3秒语音。
* 输入
2:弹出文件选择窗口,选择本地WAV文件。
* 输入
3(或直接回车):生成内置的合成元音测试信号。
- 等待程序处理,处理完成后系统将自动播放重构后的语音,并弹出四个分析图表窗口。
详细实现逻辑与代码分析
本项目的主要逻辑流程严格遵循 main.m 文件的执行顺序,具体包含以下模块:
1. 信号获取与标准化
程序首先根据用户输入确定信号源。若选择麦克风,则以8kHz采样率、16位深度录制3秒;若选择文件,则读取后重采样至8kHz并转为单声道;若选择测试信号,则调用辅助函数生成含基频谐波的元音模拟信号。所有信号在进入后续处理前均通过除以最大绝对值进行归一化处理。
2. 预处理
为了补偿语音信号高频部分的衰减,使频谱更平坦以便于LPC分析,系统采用一阶高通滤波器(系数 $alpha=0.97$)对信号进行
预加重。随后定义分帧参数,帧长设为25ms,帧移设为10ms。
3. 模型阶数选择分析
在全信号处理前,程序选取信号中间部分的稳定浊音帧进行阶数分析:
- 对该帧加汉明窗。
- 循环计算从1阶到20阶的LPC模型。
- 对于每个阶数,利用Levinson-Durbin算法得到预测误差能量。
- 计算简化版的AIC值($AIC = ln(E_p) + 2p/N$)。
- 寻找AIC最小值的索引作为最佳预测阶数(设定最小下限为8阶),用于后续的全程分析。
4. LPC分析与重构(Analysis & Synthesis)
程序对预加重后的信号进行分帧处理,对每一帧执行以下操作:
- 加窗:应用汉明窗减少频谱泄漏。
- 自相关计算:计算当前帧的自相关序列。
- 系数求解:调用自定义的
my_levinson 函数计算LPC预测系数 $A(z)$ 和增益。 - 残差计算(编码):使用预测系数构成的分析滤波器对当前帧进行滤波,提取预测残差(激励信号)。
- 信号重构(解码):使用全极点合成滤波器($1/A(z)$),以计算出的残差为激励,重建语音帧。
- 重叠相加:将重构帧按时间位置叠加到输出缓冲区中,并统计窗函数的叠加权重。
循环结束后,通过除以叠加的窗函数权重消除分帧带来的幅度调制影响,最后经过去加重滤波器恢复原始语音的频谱特性。
5. 结果可视化
系统绘制以下四组图表:
- 语音信号重构对比:展示原始波形、LPC重构波形以及两者之间的时域误差。
- LPC谱包络分析:选取典型帧,对比FFT计算的原始频谱与LPC全极点模型计算的平滑谱包络。
- LPC预测阶数分析:双轴图表展示预测误差能量随阶数增加的下降趋势,以及AIC准则值的变化曲线,标出系统选定的最佳阶数。
- 残差信号分析:展示全时域的残差信号波形及其自相关函数,后者呈现出明显的峰值,验证了残差中保留的基音周期信息。
关键算法实现细节
Levinson-Durbin 递推算法
代码中包含一个名为
my_levinson 的辅助函数,完全手动实现了Levinson-Durbin递归过程,其核心步骤如下:
- 初始化0阶预测误差为 $R(0)$。
- 进行 $p$ 次迭代,每次通过当前误差能量和相关向量计算反射系数 $k$。
- 利用 $k$ 更新预测系数向量 $a$,公式为 $a_{new} = a_{old} + k cdot a_{flipped}^*$。
- 更新预测误差能量 $E$,公式为 $E_{new} = E_{old} cdot (1 - |k|^2)$。
残差激励重构
本系统的重构策略采用了
残差激励(Residual Excitation)。与简单的声码器使用白噪声或脉冲串作为激励不同,本系统在重构时直接使用了分析滤波器输出的残差信号。这意味着如果LPC阶数足够高且计算精度足够,重构信号将非常接近原始信号(波形保留),这主要用于验证LPC逆滤波和合成滤波的可逆性及算法实现的正确性。
测试信号生成
辅助函数
generate_test_signal 通过生成周期性的脉冲串(模拟声带震动,基频120Hz)来构建合成元音信号,用于在没有外部音频源时的系统功能测试。