基于DSP的G.729语音编解码器设计
图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级流水线结构,可以并行执行多条指令,并在一定条件下可以实现零开销循环处理。
评论