基于DSP的G.729语音编解码器设计
3.2 编解码算法优化
G.729算法是经过长时间不断的研究与讨论,最终制定出的一个标准算法,对算法本身再进行大幅度优化是很困难的。不过,可以在算法的细节和具体实现方法上进行精简。
3.2.1 码本搜索算法精简
在10维LSP量化码本搜索中,需要找到一个码矢量,使得它与输入矢量的均方误差最小,如式(1)所示。
在ITU提供的标准算法中,程序每次搜索时,先计算完本次的均方误差,然后再与之前的最小值进行比较。实际上,如果本次未计算完的均方误差已经大于之前保存的最小值时,可以直接停止本次计算进入到下一次计算中,这样能节省大量乘和累加运算。
图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级流水线结构,可以并行执行多条指令,并在一定条件下可以实现零开销循环处理。
所谓零开销循环是指处理器在执行循环时,不用在循环终止的判断、循环的跳转及循环计数器的递减上额外花费时间。但这就要求编译器必须知道初始值、更新和结束条件;循环体内部不能调用函数;循环体内不能包含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以上,并且整个系统运行稳定。
本文实现了基于DSP的语音编译码器设计,该设计对ITU提供的G.729源代码进行了算法精简和代码优化,优化后的代码具有编码效率高、占用资源少、实时性强等优点。与源代码相比,它的编码效率提高了10倍以上,克服了源代码难以应用在实时语音通信系统的缺点。
目前,该设计已经应用在本实验室的语音通信实验系统中,与传统语音实验系统相比,为学生提供了更先进的语音编码实验,模块化的软件设计也更适合学生的参与。同时,该系统采用通用的DSP硬件平台,具有可扩展性强的特点,可实现多种语音编码算法,为学生自主性学习提供了良好的条件。
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)