基于DSP的G.729语音编解码器设计
扫描二维码
随时随地手机看文章
摘要:设计了基于DSP的G.729语音编解码器,并针对G.729算法标准源码代码效率低、执行时间长的不足,从算法精简、代码优化等方面进行了优化。优化后的算法在保证了高质量语音输出的同时,提高了编码效率,实现了对语音信号的实时处理。最后对系统性能进行了测试,结果满足设计要求。
关键词:G.729;DSP;语音编码;算法优化
0 引言
语音信号处理是现代通信研究的重要内容之一,语音压缩编码作为其关键技术,如今已得到了极大的发展。G.729是国际电信联盟(ITU)于1996年提出的采用共轭结构代数码激励线性预测(CS-ACELP)的语音编码算法,由于其具有低速率、低延时、高质量等优点,被广泛应用于数字通信系统,如IP电话、视频会议、移动通信等。数字信号处理器(DSP)价格低廉,并具有强大的运算能力,用它来实现G.729算法具有很大的现实意义。近年来,国内外研究基于DSP的G.729语音编码算法的学者很多,但随着无线通信系统用户越来越多,以及DSP在结构、性能上的巨大变化,怎样使该算法在DSP上最高效的实现,依然是一个很重要的课题。
本文首先对G.729算法进行了分析,然后结合DSP的特点,分别进行了系统的硬件和软件设计。该系统不但满足G.729算法要求,还可以作为其他语音编译码平台;在此基础上,本文针对ITU提供的标准源码代码效率低、执行时间长等不足,提出了算法的具体优化技术,并对优化结果进行了比较分析。结果表明,优化后的算法在保证语音质量的同时,提高了编码效率,实现了对语音信号的实时处理。
1 ITU-T G.729原理分析
ITU-T G.729算法以自适应预测编码技术为基础,采用矢量量化、合成分析和感觉加权等技术。其编码速率达到8 Kb/s,合成语音质量不低于32 Kb/sADPCM的水平。
该算法要求输入信号为8 kHz取样、16 b线性PCM信号。在编码器端,每80样点为一帧(每帧再分为两个子帧),分析并提取语音信号各种参数(LPC滤波器系数、自适应码书和固定码书的编号、自适应码字增益和固定码字增益),把这些参数进行80 b编码发送。
在解码端,把收到的比特流恢复成参数编码,解码后得到各个参数,用自适应码书编号从自适应码书中得到自适应码字,用固定码书编号从固定码书中得到固定码字,分别乘以它们的增益,按点相加后构成激励序列。激励LPC综合滤波器重构语音(综合滤波器由LPC系数构成)。重构语音信号在输出前经过后置处理,包括长时后置滤波、短时综合滤波和高通滤波。
2 系统硬件设计
系统硬件结构图如图1所示。其中DSP芯片采用TI公司的TMS320VC5416,音频接口采用16位音频编解码芯片TLV320AIC23,SRAM和FLASH分别采用芯片CY7C1041CV33和SST39VF400。此外,系统还配有电源芯片、电压转换芯片、CPLD(EPM3128ATC100)等。
系统编码流程为:由音频接口芯片TLV320AIC23将模拟信号转换成8K×16 b/s的数字信号,采样后的数字信号通过多通道缓冲串口McB-SP0传送到DSP的内部缓冲区,当缓冲区内的数据积累到一帧(80×16 b)时启动编码程序,编码完成后将8 Kb/s的压缩码流通过数字接口(Mc-BSP2)输出至信道。
系统解码流程为:由McBSP2将信道发送来的数字码流接收至DSP的内部接收缓冲区,然后经DSP进行解码处理,解码后的数字语音通过Mc-BSP0发送给TLV320AIC23,经过D/A转换恢复出原始语音信号。由此,该系统最终实现了语音的采集、编码、发送和接收、解码、播放的功能。[!--empirenews.page--]
3 系统软件设计
系统软件部分主要包括音频接口模块、数字接口模块、CPLD控制模块及语音处理模块等。音频接口模块主要完成对TMS320VC5416的多通道缓冲串口McBSP0、McBSP1的配置及对音频接口芯片的初始化等;数字接口模块作为与外部信道的接口,在输出语音码流的同时提供帧同步与位同步信号,设计的重点在于McBSP2的配置,尤其是其内部采样率发生器的配置;CPLD控制模块完成TMS320VC5416各个控制信号和地址线的逻辑组合,以扩展外围存储器SRAM和FLASH,开发环境为QuartusⅡ。语音处理模块是本设计的核心,将在下面重点介绍。
3.1 语音处理模块软件设计
语音处理模块由DSP完成,软件流程图如图2所示。
系统上电后,首先完成DSP内部寄存器、变量、外围设备、音频编解码芯片的初始化,当McBSP有数据输入时,McBSP产生一个事件报告DMA控制器,触发DMA通道以后台形式将数据传输到接收缓冲区;接收缓冲区每收到一定单元的数据,触发DMA中断,CPU响应该中断进入中断服务程序,提取数据,完成数据的编码或解码处理;然后再将处理后的数据送至发送缓冲区,由DMA传送给多通道缓冲串口。
编解码算法采用G.729算法,ITU为G.729算法提供了标准C源代码,并采用模块化设计,具有可读性强、便于维护等优点,但该算法复杂度较高,而DSP芯片资源有限,处理延时很大。在实际应用中,语音编解码器对算法实时性要求非常高,因此必须对原始代码进行算法精简和代码优化,这也是本文的重要工作之一。
3.2 编解码算法优化
G.729算法是经过长时间不断的研究与讨论,最终制定出的一个标准算法,对算法本身再进行大幅度优化是很困难的。不过,可以在算法的细节和具体实现方法上进行精简。
3.2.1 码本搜索算法精简
在10维LSP量化码本搜索中,需要找到一个码矢量,使得它与输入矢量的均方误差最小,如式(1)所示。
在ITU提供的标准算法中,程序每次搜索时,先计算完本次的均方误差,然后再与之前的最小值进行比较。实际上,如果本次未计算完的均方误差已经大于之前保存的最小值时,可以直接停止本次计算进入到下一次计算中,这样能节省大量乘和累加运算。
[!--empirenews.page--]
图3是该算法精简后的流程图。
实验证明,在10帧语音信号的编码过程中,这部分算法优化后平均可减少15 000次左右的L_mac运算的调用。
3.2.2 去除不必要的溢出判断
使用CCS中的profiler工具对ITU提供的标准C源码进行分析,结果表明,该算法大部分运算都集中在basic_op.c文件中的L_add()、L_mult()等几个基本函数上。进一步分析发现,这些函数在溢出判断上花费了大量的时间,而实际运算中真正会产生溢出的地方非常少。因此,为了进一步提高代码效率,在完全不会产生溢出的地方用简单的基本运算取代函数的调用,这样即能大大缩短运算时间,还能节省调用函数的开销。例如:
这段程序中,由于-215≤a[i]≤215-1,-215≤b[i]≤215-1,那么a[i]*b[19-i]显然不会超出区间[-231,231-1],即这一部分不会产生溢出问题,因此这里的L_mult函数便可简单替换为:
这虽是一段极小的程序,但经过这样简单的置换后却能减少数十个时钟周期。在整个代码中类似的例子很多,优化后的效果非常明显。
3.2.3 循环优化
对循环的优化一直是代码优化的重点,一般的循环优化包括:循环合并、循环展开、循环内部的指令尽可能移到循环外等。这些方法在文献中有详细的介绍,这里就不再赘述。TMS320C54X系列芯片采用6级流水线结构,可以并行执行多条指令,并在一定条件下可以实现零开销循环处理。[!--empirenews.page--]
所谓零开销循环是指处理器在执行循环时,不用在循环终止的判断、循环的跳转及循环计数器的递减上额外花费时间。但这就要求编译器必须知道初始值、更新和结束条件;循环体内部不能调用函数;循环体内不能包含break语句;循环表达式中不能含有随循环体中的条件变化而变化的循环变量;循环计数应该递减等。为了实现零开销循环,本文对标准C代码进行了大量优化,如在文件Qua_lsp.c中有如下循环:
优化前后本段代码所消耗的时钟周期数对比见表1。
3.2.4 使用DSPLIB库优化
TMS320C54X系列提供的通用数字信号处理算法库(DSPLIB库)包含有50多个通用的信号处理程序,全部由汇编语言编写,并可由C语言调用,方便C语言与汇编语言混合编程。在计算量大、对实时性要求又高的G.729中调用DSPLIB库函数,对于提高代码效率具有很大的意义。
DSPLIB几乎包括了当前已经成熟的数字信号处理的大部分算法。如:FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。
3.2.5 指针寻址
在G.729算法中包含了大量数组元素的存取操作,ITU提供的标准代码直接对数组进行操作,使得浪在地址计算上的时间开销很大。若对数组采用指针寻址方式,可节省很多时间。而通常情况下数组又都应用在循环内部,指针寻址方式更加凸显出了它的必要性。
除了以上几种优化方法外,使用内联函数,合理利用暂存器,使用宏定义等也都对代码的优化起到很好的作用。
4 测试结果及性能分析
利用CCS提供的性能分析工具(profiler)对优化前后的代码进行分析,在TMS320VC5416上实现一帧数据编码所用的时间分别为96 ms与8 ms,其中TMS320VC5416的CPU时钟频率为160 MHz。对几个主要函数优化前后的运行时间进行比较,对比如表2所示。
分析结果表明,优化后的时间比优化前大大缩短,并严格控制在了10 ms以内,保证了系统的实时性。同时,将原始语音和重建语音的语音波形进行对比,如图4所示。观察对比波形可知,编码前后语音波形差别很小,重建语音基本保持了原始语音的信息。通过主观听觉测试,重建语音清晰易懂,质量较高,MOS主观评分在4.0以上,并且整个系统运行稳定。
5 结语
本文实现了基于DSP的语音编译码器设计,该设计对ITU提供的G.729源代码进行了算法精简和代码优化,优化后的代码具有编码效率高、占用资源少、实时性强等优点。与源代码相比,它的编码效率提高了10倍以上,克服了源代码难以应用在实时语音通信系统的缺点。
目前,该设计已经应用在本实验室的语音通信实验系统中,与传统语音实验系统相比,为学生提供了更先进的语音编码实验,模块化的软件设计也更适合学生的参与。同时,该系统采用通用的DSP硬件平台,具有可扩展性强的特点,可实现多种语音编码算法,为学生自主性学习提供了良好的条件。