基于DSP的G.729算法优化实现
2012-09-15张正文张永杰
张正文,张永杰,王 耿
(湖北工业大学电气与电子工程学院,湖北 武汉430068)
G.729算法复杂度较大,实时性效果不好,但是随着运算能力很强的DSP快速发展及对各种优化方法的研究,该算法已经成为当前中、低速率语音编码中的主流算法[1].该算法处理的输入信号需是经8kHz采样编码产生16位线性PCM的语音信号,编码处理后输出速率为8kbps的2进制bit流,压缩比例约为16∶1.在DSP利用该算法处理语音信号时,需由通讯模块对语音信号进行采集及必要的处理,如信号放大、A/D等.编码后的bit流经存储传输后可通过相应的解码程序恢复出高质量的语音信号.目前,G.729编译码器已被广泛用于数据通信的各个领域,如 H.323及IP Phone等[2].
1 系统设计
系统总体框架图见图1,语音信号通过线路输入或麦克风输入,经TLV320AIC23芯片采集预处理转换,生成符合G.729算法处理的16位的线性PCM.DSP通过片上MCBSP0对TLV320AIC23芯片进行控制,通过MCBSP1与TLV320AIC23芯片进行数据交换.PC机通过JTAG口将程序烧录进DSP,16位的PCM语音信号通过 MCBSP1进入DSP后经压缩编码算法处理生成bit流,bit流经MCBSP1传至外部通信系统或模块,用于传输或存储,在解码端通过相应的G.729算法解码程序还原语音.若是在单片DSP上验证算法的正确性及重构语音质量的失真度,可将bit流经解码程序解码后将数据回传给TLV320AIC23芯片,经D/A及放大后回放重建语音.
图1 系统框架图
1.1 硬件设计
系统搭载在北京达盛公司DSP实验箱上,该实验板DSP最小系统带有JTAG口,配有配套的数据线及仿真器,且有现成电源及语音输入输出口,故硬件设计主要是TLV320AIC23与DSP的接口设计.TLV320AIC23芯片是TI公司推出的一款高性能立体声音频编解码器芯片,内置耳机输出放大器,支持麦克风及线路输入两种输入方式,且对输入和输出都具有可编程的增益调节[3].TLV320AIC23的ADC和DAC部件高度集成在芯片内部,可以在8~96kHz的频率范围内提供16bit、20bit、24bit和32bit的采样.故语音信号经TLV320AIC23采集后可产生采样率为8kHz的16位线性PCM信号,提供符合算法处理的输入信号.TLV320AIC23的引脚可以分为信号输入输出引脚、控制引脚、数据传输引脚及电源引脚等,其中信号输入输出引脚及电源引脚连接比较简单,参考芯片资料中的典型电路即可连接完成,控制引脚有4个,分别是SCLK、CS、SDIN、MODE,该4管脚主要是用来协调主机DSP对TLV320AIC23的初始化,数据传输引脚有5 个,分 别 是 BCLK、LRCIN、LRCOUT、DIN、DOUT,这些引脚用来与主机DSP进行语音数据的交换.主机DSP的6个多通道缓冲串口引脚也可以分为控制引脚和数据引脚,控制引脚主要是时钟发送接收引脚BCLKX、BCLKR和帧发送接收引脚BFSX、BFSR,数据引脚是BDX、BDR,根据芯片资料及DSP管脚的功能,TLV320AIC23与主机DSP引脚连接设计见图2、图3.
1.2 软件设计
TLV320AIC23芯片的初始化及工作过程都是通过软件控制实现的,DSP接收、处理及发送数据亦是由软件控制.软件设计采用传统的模块化、结构化程序设计思想,程序可分为DSP初始化、MCBSP0与TLV320AIC23芯片通信、MCBSP1与TLV320AIC23芯片的数据交换、G.729编码程序、G.729解码程序等五大模块(图4).
2 编解码程序设计及优化
2.1 编解码程序设计
编码器处理的对象是每一10ms的语音帧,即80个采样点,每一帧信号又均分为2子帧.对每一帧信号,进行分析提取相关模型及激励参数,对参数进行编码即可.为减少运算中的溢出现象,预处理阶段,将输入信号的幅值进行折半处理,并用截止频率为140Hz的高通滤波过滤低频噪声.线性预测分析阶段,先将样点数据加窗再求自相关系数,并进行60Hz带宽扩展修正自相关系数,然后利用所得系数经Levinson–Durbin算法处理即可得到线性预测系数.为便于量化及插值,须将预测系数转换成线谱对,然后用线谱对系数进行量化与插值,最后又将线谱对系数还原成线性预测系数.加权使用的是未经量化的线性预测系数[4].自适应码本分析搜索范围是通过开环基因分析得到的,以减少码本搜索复杂度.自适应码本和固定码本搜索对每一子帧都进行.之后,利用下一子帧更新合成滤波器和加权滤波器的参数,最后对所得参数按照一定顺序编码,具体的bit分配见表1.
图4 软件设计流程总体图
解码过程相对简单.首先将参数提取出来,对每一子帧,将线谱对系数进行插值并转化为线性预测系数;然后将自适应码本和固定码本乘上增益后的激励信号,将激励信号通过线性预测合成滤波器重构语音,加上自适应后滤波和高通滤波等后处理完成语音重建.
表1 压缩编码bit分配表
2.2 算法程序优化
为了实现系统的实时性,需对ITU提供的G.729源代码进行系列优化,优化程度可分算法级、C语言级及汇编器级优化.算法级优化主要可进行以下工作.
其一,取消5ms前瞻:在LP分析阶段,原算法中有5ms数据的前瞻,在运算中可将这5ms的数据全部用0来代替,可节省很多计算量.
其二,开环基因搜索采用粗化搜索方式,即在计算相关系数时,将原算法中的搜索步长增加为2,即将
用
代替,其中,k=20,21,…,143,可节约一半时间,再者由于连续语音数据帧中的基音延时值变化较小,当变化小到一定范围,就可不必搜索,直接用前一帧的值代替.判断的方法是先确定一个比较的阈值η,然后将相关的计算结果与阀值进行比较,只有当计算值大于阈值时才需搜索,其中阈值由一段普通话语音测出.经大量实验,笔者将η设为50 331 604,而每帧的计算值Fi利用线谱对(LSP)系数按公式计算得出:
其中wk取值为0.02,0.04,0.04,0.04,0.04,0.09,0.10,0.05,0.07,0.05,采用 Q15格式表示;lspi(k)是第i帧的第k个系数.
其三,在所有的乘法运算中,舍弃运算结果为0的运算项.
其四,固定码本搜索算法改为脉冲序列重置法:即先将40个可能的脉冲位置依次代入式(1),计算出单个脉冲的贡献值,然后在同一轨道中按照贡献值大小重新排序,选择重置后每个轨道的前四个脉冲位置进行搜索.国外学者Nam Kyu Ha经研究其统计命中率已达95%以上,且该算法搜索次数仅为4×4×4×4×2=512[5].
C语言级及汇编器级优化方式主要有:省略不必要的溢出判断;将性质相同的函数排列在一起,利于编译器将其编译成具有平行运算结构的代码;调用循环时,使循环体尽可能短,并且尽量避免转移判断语句;合并指令数较少的函数,如自相关函数、加窗函数等,可节省对堆栈的操作时间;对于指令数与调用次数都较少的函数,在函数名前加一个关键字inline,编译时比较省时,是一种空间换时间的优化手段.在PC机中,算法实现的软件平台是CCS2.0,可以利用一些基于这个平台的成熟的优化方法,如Intrinsic函数的使用、CCS的C/C++编译器的选项打开,编译时采用Release模式,排除Debug信息等,这些优化方法对提高系统性能的影响较大.
3 试验结果
将优化后的程序通过仿真器与JTAG口下载到DSP中,将自己录制的一段语音通过PC机线路输入给TLV320AIC23输入接口,通过该系统编解码后可以还原失真度尚能接受的重建语音,原始语音与重建语音的波形图见图5、图6.若对编解码程序及系统进行一系列深度优化,效果可达更佳,有待进一步努力.
[1]邹 翼.基于DSP的G_729语音编码的研究与实现[D].长沙:湖南大学图书馆,2009.
[2]陈明义,龚玉蓉.基于TMS320VC5509DSP通信系统的 G.729算法实现[J].信息技术,2007(2):95-96.
[3]Stereo Audio CODEC,8to 96kHz,With Integrated Headphone Amplifier TLV320AIC23Data Manu[J].Texal Instruments,2001(6):22-43.
[4]International Telecommunication Union.Recommendation G.729:Coding of speech at 8kbit/s using conjugate structure algebraic code excited linear prediction(CS-ACELP)[EB/OL].(2007 – 01)http://www.itu.int/rec/T-REC-G.729-200701-I/en.
[5]吕治国.G.729标准码本搜索算法分析及优化[J].电声技术,2008,32(9):46-48.