项目:G.729A语音编解码混合仿真与测试系统
项目简介
本项目是一个基于ITU-T G.729A标准的语音信号编解码仿真平台。当前主要脚本使用MATLAB编写,旨在模拟和验证CS-ACELP(共轭结构代数码本激励线性预测)的核心算法流程。该系统不依赖外部音频文件,而是内置了语音信号生成机制,能够模拟从信号产生、编码压缩、传输模拟到解码重建的完整通信链路,并提供了丰富的信号分析与可视化功能。
本仿真程序特别适合用于理解G.729A标准的算法原理,包括线性预测分析、基音搜索机制以及合成分析法(Analysis-by-Synthesis)的具体实现。
功能特性
- 内置语音信号仿真:无需外部录音,程序自动生成包含浊音(脉冲串)和清音(噪声)特征的合成语音信号,并通过模拟声道滤波器进行处理。
- 完整编解码流程模拟:涵盖预处理、LPC分析、开环/闭环基音搜索、代数码本搜索(简化版)、激励生成及合成滤波。
- 模拟量化环境:实现了LSF参数的转换与模拟量化处理,以及基音增益的限制。
- 多维度可视化分析:提供时域波形对比、残差信号分析、频谱包络对比以及编码参数(基音周期、LSF)的轨迹跟踪。
- 结果导出:支持将重建后的语音信号保存为WAV文件。
系统要求
- MATLAB R2016b 或更高版本
- Signal Processing Toolbox(信号处理工具箱)
使用方法
- 确保MATLAB当前工作目录包含
main.m 文件。 - 直接运行
main 函数。 - 程序将执行约0.2秒时长的语音信号仿真处理。
- 运行结束后,控制台将输出全局信噪比(Global SNR)及平均分段信噪比。
- 系统会自动弹出一个综合分析窗口,展示波形和频谱图。
- 生成的重建语音将保存为
output_speech_g729a.wav。
main.m 实现逻辑详解
该脚本是系统的核心驱动程序,其执行流程严格遵循G.729A的处理框架:
1. 系统初始化与信号生成
- 设置采样率为8000Hz,帧长为10ms(80个样本),子帧长为5ms(40个样本),LPC阶数为10。
- 构造合成语音信号:使用120Hz的脉冲序列模拟浊音激励,叠加随机噪声,并通过截止频率为300Hz-3000Hz的巴特沃斯带通滤波器,模拟经过声道的语音信号。同时对信号进行归一化处理。
2. 帧级处理循环(编码端)
程序对生成的语音信号进行分帧处理,每一帧包含以下步骤:
- 预处理(高通滤波):输入信号通过特定的G.729高通滤波器,去除低频干扰。代码中手动管理了滤波器的状态变量,以保证帧与帧之间的连续性。
- 线性预测分析(LPC):
* 利用汉明窗对预处理后的信号加窗。
* 计算自相关系数,并调用Levinson-Durbin算法求解LPC系数。
* 执行带宽扩展(Bandwidth Expansion)。
* 将LPC系数转换为线谱对(LSF),执行模拟量化(保留两位小数),再转换回LPC系数用于后续处理。
3. 子帧级处理循环(编码与解码核心)
每一帧被分为两个子帧,执行所谓的“合成分析”过程:
- 感知加权滤波:根据量化的LPC系数构建加权滤波器 W(z),生成目标信号(Target Signal),以利用人耳的听觉掩蔽效应。
- 开环基音搜索:在粗略范围内(20-143样本)基于自相关最大化原理估算基音周期 T_op。
- 闭环基音搜索(自适应码本):在开环基音附近的小范围内进行精细搜索,确定最佳基音延迟(Pitch Lag)和基音增益(Pitch Gain),并构建自适应码本向量。
- 固定码本搜索(CS-ACELP模拟):计算目标信号与自适应分量的残差,搜索固定码本脉冲及其增益,以逼近残差信号(代码中使用简化的多脉冲贪婪算法思路)。
- 局部解码与状态更新:
* 组合自适应码本和固定码本生成激励信号。
* 更新激励信号的历史缓冲区,供下一帧自适应码本搜索使用。
* 通过合成滤波器(1/A(z))重建语音信号。
4. 后处理与评估
- 后处理:对合成的语音帧进行简单的幅度增益补偿。
- 性能计算:逐帧计算分段信噪比(SegSNR),并记录LPC系数和基音周期用于后续绘图。
5. 可视化与输出
脚本运行结束时会生成包含四个子图的图形窗口:
- 时域对比:原始语音与重建语音的波形重叠显示。
- 误差分析:显示编码过程产生的残差误差信号。
- 频谱分析:对比最后一帧原始信号与重建信号的频谱,并叠画LPC频谱包络。
- 参数轨迹:双Y轴图表,同时显示基音周期变化和前三阶LSF系数的演变过程。
关键算法与函数分析
实现了G.729标准定义的各种系数的高通滤波器(Direct Form II)。为了确保分帧处理时的波形连续,该函数显式地接收并更新滤波器的状态(Input/Output History)。
手动实现了Levinson-Durbin递归算法。利用Toeplitz矩阵求解Yule-Walker方程,从自相关序列中推导出线性预测系数(LPC),不依赖MATLAB的高级LPC工具箱函数,更贴近底层C算法实现。
执行粗略的基音搜索。通过计算不同延迟下的自相关值,在[20, 143]的样本范围内寻找相关性最强的延迟作为初步基音周期。
实现自适应码本搜索。在开环基音的基础上,使用“合成分析”法在小范围内搜索最佳闭环基音延迟。它从激励历史缓冲区中提取向量,计算最佳增益(包含增益限幅逻辑),并选择使加权均方误差最小的延迟值。
- algebraic_codebook_search
(注:代码中体现了接口和逻辑框架)该模块旨在寻找固定码本脉冲。它接收去除基音分量后的残差目标,使用贪婪算法或多脉冲搜索策略来确定脉冲的位置和幅度,模拟CS-ACELP中的代数码本机制。