G.729A语音编解码仿真系统
项目简介
本项目是一个基于ITU-T G.729A标准的语音编码与解码全流程仿真平台。G.729A属于共轭结构代数码本激励线性预测(CS-ACELP)算法,能在8kbps的低比特率下提供高质量的语音服务。
本仿真程序使用MATLAB编写,详细展示了语音信号处理的核心流程。虽然完整项目背景涉及C与MATLAB混合编程,但当前的MATLAB实现主要侧重于算法逻辑验证、波形分析以及核心模块(如LPC、基音搜索、合成滤波)的演示。系统包含一个完整的"编码-解码"闭环链路,并内建了信号生成功能,无需外部语音文件即可运行测试。
功能特性
- CS-ACELP核心算法仿真:实现了线性预测分析、LSP转换、开环与闭环基音搜索、代数码本搜索等核心步骤。
- 合成语音生成:不依赖外部文件,代码内部自动生成一段带有基音变化的模拟元音信号(脉冲串激励 + 共振峰滤波),用于验证算法对时变信号的跟踪能力。
- 帧与子帧处理架构:严格遵循G.729标准时序,采用10ms(80采样点)帧长和5ms(40采样点)子帧长的处理结构。
- 完整的编解码链路:模拟了从模拟信号 -> 编码参数提取 -> 参数结构体传输 -> 解码重建 -> 语音合成的全过程。
- 可视化分析:提供原始语音与合成语音的时域波形对比、误差信号分析以及语谱图对比,自动计算并输出信噪比(SNR)。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(信号处理工具箱)
使用方法
- 确保MATLAB环境已安装并配置好信号处理工具箱。
- 直接运行主脚本。
- 程序将自动执行以下步骤:
* 生成2秒长的测试语音信号。
* 逐帧进行G.729A编码处理。
* 逐帧利用编码参数进行解码合成。
* 在控制台输出输入信号信息及最终的信噪比(SNR)。
* 弹出一个包含三个子图的窗口,展示波形对比和语谱图分析结果。
详细实现功能说明
本节详细描述代码实际执行的逻辑流程,分为信号生成、编码器、解码器及辅助模块四个部分。
1. 信号生成与初始化
程序首先定义了8000Hz的采样率,并生成了一段模拟语音。
- 基音模拟:构建了一个从120Hz线性下降到100Hz的基音轨迹。
- 激励源:利用正弦波相位生成脉冲串,模拟声带振动。
- 声道模拟:使用一个全极点滤波器(共振峰滤波器)对激励源进行滤波,产生具有元音特征的语音波形。
- 归一化:将生成信号幅度归一化到0.9,防止处理过程中的溢出。
2. 编码器 (Encoder) 实现逻辑
编码器按帧(80样点)处理信号,具体流程如下:
使用高通滤波器去除信号中的低频干扰或直流分量,这里简化为去直流滤波器实现。
- LPC分析 (Linear Prediction Analysis)
* 对预处理后的信号加Hamming窗。
* 计算自相关函数,并使用Levinson-Durbin递归算法求解LPC系数(10阶)。
* 应用带宽扩展(Lag windowing模拟),利用因子
gamma_bw 平滑LPC谱。
将LPC系数转换为线谱对(LSP)频率,实际上使用了线谱频率(LSF)表示。*注意:本代码直接传输未量化的LSF值,省略了标准中的矢量量化(VQ)步骤。*
- 感知加权 (Perceptual Weighting)
构建感知加权滤波器 $W(z)$,对信号进行滤波以突出共振峰区域,利用人耳掩蔽效应优化量化噪声分布。
- 子帧处理 (Subframe Processing) - 每帧包含2个子帧
*
开环基音搜索:在感知加权信号上进行粗略的自相关搜索,确定基音周期的大致范围。
*
闭环基音搜索 (自适应码本):在开环基音值附近进行精细搜索,计算最佳分数基音延迟和基音增益,并对增益进行限幅(0到1.2之间)。
*
固定码本搜索 (代数码本):计算目标向量(去除了自适应码本贡献后的残差),通过简化的搜索算法寻找残差中绝对值最大的4个脉冲位置,并不使用标准中复杂的深度优先树搜索。
*
参数打包:将LSF、基音周期、基音增益、固定码本脉冲和固定码本增益存入模拟的数据流结构体中。
3. 解码器 (Decoder) 实现逻辑
解码器利用编码阶段生成的参数结构体恢复语音:
从数据流中读取LSF参数,并将其转换回LPC多项式系数。为简化流程,LPC系数在整帧内保持不变,未实现子帧间的插值。
* 利用历史激励缓冲区和解码得到的基音周期,重建自适应码本向量。
* 结合固定码本矢量(脉冲位置)与增益,计算当前子帧的总激励信号。
* 更新解码端的激励历史缓冲区。
利用恢复的LPC系数构建合成滤波器 $1/A(z)$,将总激励信号通过滤波器还原为语音波形。
代码实现了一个简单的一阶去加重滤波器
[1 -0.7],用于提升合成语音的主观听感,去除了标准中复杂的长时/短时后滤波。
4. 核心算法函数说明
代码内部通过内嵌函数实现了模块化封装:
pre_process:执行预处理高通滤波,维护滤波器状态。perc_weight:实现感知加权滤波,公式为 $A(z/gamma_1) / A(z/gamma_2)$。levinson (MATLAB内置):用于求解Yule-Walker方程,获得线性预测系数。pitch_ol_search:开环基音搜索实现,通过遍历20到140的延迟范围寻找自相关最大值。pitch_cl_search:闭环基音搜索实现,在局部范围内利用最小二乘法同时确定最佳延迟和增益,并构建自适应码本向量。find_fixed_code:简化的代数码本搜索,寻找残差信号中能量最大的4个点作为脉冲位置,并计算对应的最佳增益。synthesis_filter:全极点合成滤波器,核心还原模块。