2.2 进行C语言优化
基于G.729标准的声码器最终在定点TMS320C5416上实时实现。在定点TMS320C5416内,浮点数是通过将小数点固定在特定位置来表示的,这是定点TMS320C5416的局限之一。为了区分小数的不同值域,使用了Q-格式。不同的Q-格式在于小数点的位置不同,因此整数域也不同。当两个数相乘时,会产生一个特殊的符号位。如:两个Q4数相乘, 需要附加一个左移的操作以去除这个多余的符号位,乘积应该是一个Q9格式的。如果DSP中的FRST位被置位,这个去除多余符号位的移位操作能够自动完成。对于16位数的乘法运算,应该得到32 位的乘积。但是,由于只需要16位的积,该32位乘积中只有高16位被存储下来,积的低16位被丢弃。为了达到高准确性,在连续的乘法运算过程中(如卷积),应该一直保持32位的计算结果,只对最终的计算结果进行丢弃低16位的截短操作。为了达到更高的准确性,在这一操作过程中会使用到一种双重精度格式, 这种格式仅仅出现在使用单精度不够,而又不必要使用32位精度的时候。两个32位数相乘,只需要32位的乘积,而不是64位,不过注意到TMS320C5416是16位的,所以在双重精度格式中,32位整数分为高位字和低位字。高、低位字中都含有符号位,以进行快乘运算。其格式如下:
L_32=hi_word<<16+lo_word<<1
Hi_word=L_32>>16
Lo_word=L_32-hi_word>>1
当累加器中的数值超过一定范围时将会产生溢出。在G.729算法标准中, 累加器的值被限定在80000000~7FFFFFFF之内——即最小负数和最大正数。不过在TMS320C5416中,如果将PMST寄存器中的OVM置位,则溢出会得到自动处理。
2.3 内联指令的应用和C程序中嵌入汇编语句
由于语音编码的特点,编解码函数都是由一些基本的加减乘除简单函数组织而成,这些函数定义在BASIC OP.C和OPER_32B.C两个文件中,如果能够对这些简单函数进行内联指令(intrinsic)的优化,就能达到事半功倍的效果。内联指令是汇编指令的直接映射,具有很高的效率。例如:
#define muh_ r(varl,var2) _mpylir(varl,var2)
#define L_ add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_ muh(var1,var2) _smpy(var1,var2)
在C程序中嵌入汇编语句的方法比较简单,只需在汇编语句的左右加上一个引号,然后用小括弧将汇编语句括住,并在括弧前加上ASM标识符,例如ASM(“汇编语句”)。采用这种方法一方面可以在C程序中实现用C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断使能或屏蔽、读取状态寄存器和中断标志寄存器等;另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语言以优化程序。而采用这种方法的缺点是比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。采用这种方法需要注意以下几点:
(1)不要破坏C环境,因为C编译器并不检查和分析嵌入的汇编语句。
(2)汇编语句不要改变C程序中变量的值,不要在汇编语句中加入汇编器而改变汇编环境。
在简化算法的基础上,使用CCS提供的C优化器进行C语言优化,同时还使用内联函数和汇编优化。
3 G.729在TMS320C5416上的实现
3.1 TMS320C5416的体系结构和应用
TMS320C5416(以下简称C5416)是TI公司最近推出的一款高性价比的通用l6位定点DSP芯片,它的内核CPU基本组成与TMS320C54X系列一样。C5416的单指令周期为6.25 RS,每秒执行的指令数为160×106,指令系统丰富并具有很多多功能指令,使用了6级指令流水线结构,这些都很适合实现低时延的G.729声码器。采用一个40bit ALU、128K×16bit片内RAM(包括64KB的片内DARAM和64KB的片内SARAM)、3个独立的l6bit数据内存总线、1个程序内存总线、3个MCBSP、6信道DMA控制器、1个8/l6位并行增强主机端口接口及2个l6bit计时器。
在TMS320C5416中通过PCM3002进行语音信号的A/D和D/A转换,PCM3002使用两个串行通道,一个用于控制内部寄存器,另外一个用于数据传输。在系统板TMS320C5416中默认的语音信号的抽样率是48kHz,通过修改PCM3002的内部控制寄存器,设定PCM3002信号的抽样率。为了满足G.729编码的要求,PCM3002信号的抽样率为8 000Hz。为了充分利用DSP进行信号处理,通过使用MCBSP和DMA把抽样的数据送入DMA的缓冲区中,当缓冲区满时产生一次中断,DSP把DMA的缓冲区中的数据读入DSP中进行处理,然后把处理过的数据送入DMA发送缓冲区。
3.2 G.729在TMS320C5416的实现
G.729的处理过程中采用块处理技术如图3所示。按照G.729标准,每块(帧)由80个样本组成,最初80个样本被存起来,处理过程中有两个操作是同时进行的。在处理块L中数据的同时,存储L+1块的数据。