G.729语音编码算法在TriMedia TM1300 DSP上的实现
杭州海康威视数字技术有限公司 陈军科
摘要:介绍了ITU语音编码算法G.729的原理和TM1300 DSP处理器的特性,描述了G.729算法在TM1300上的优化、实现。
关键词:G.729, CS-ACELP,TM1300,VLIW,并行。
一、G.729编码器介绍
G.729是国际电信联盟(ITU,International Telecommunication Union)于1996年推出的采用共轭结构-代数码激励线性预测(CS-ACELP, Conjugate-Structure Algebraic-Code- Excited Linear-Predication)技术的具有8kbit/s码率的语音编码算法建议,该算法是以语音编码方案中的码激励线性预测(CELP,Code Excited Linear Predication)技术为基础提出的,其原理如图1所示。
G.729是一种单声道语音信号的压缩编码算法,模拟信号经过话带滤波器后,按8KHz的频率采样并转换成16bit的线性PCM信号(即128kbit/s的码流),这就是图中所示的G.729编码器的输入语音信号。G.729编码器以10ms的输入帧(80个采样点)为单位进行编码。G.729编码器的输出为8kbit/s的码流,因此其压缩比高达16:1。而经G.729解码器还原后的声音质量却达到了相当高的水准,其主观平均得分(MOS,Mean Opinion Score)在4分以上(MOS最高得分为5分),属于良好级别,人的耳朵几乎察觉不到声音有失真的情况,音质与码率为64kbit/s的G.711编码标准相近,而占用的带宽仅为G.711的1/8。另外G.729编码算法的延时较小,在15ms左右。
虽然G.729具有较低的码率、较高的还原音质和较小的延时等优点,但是由于其存在算法复杂度大和数据存储量大的固有缺陷,在早期并没有得到广泛的实际应用。后来随着超大规模集成电路VSLI工艺的进步,极大地推动数字信号处理器(DSP)技术的发展,各大厂商纷纷推出了各具特色的高性能DSP,也大大降低了实现G.729语音编码算法的成本。目前,G.729已经广泛应用于诸如IP电话、会议电视、数字音视频监控等领域。
二、Trimedia TM1300处理器
TM1300处理器是Philips公司推出的一款32位性能优良的多媒体处理芯片,特别针对数字视频和音频应用进行了优化,集成了视频输入/输出接口、音频输入/输出接口、IIC接口、PCI接口、SDRAM控制器等外围设备接口,极大地简化了外围电路的设计,提高了系统的稳定性、可靠性,降低了系统的总体成本。因此TM1300处理器在音视频处理卡、多媒体嵌入式设备中得到了广泛的应用。
TM1300处理器超强的的多媒体处理性能得益于其核心CPU、多媒体操作指令集和存储器体系结构的设计。TM1300的核心是32位的超长指令字结构(VLIW,Very-Long Instruction Word)的处理器,内部有11种共27个执行单元,在每一个时钟周期内最多可以同时安排5个执行单元进行5个操作,如图2所示。
TM1300的指令
TM1300有一整套专门针对多媒体运算的DSP操作指令,每一个操作可以执行多个算术运算,比如操作UIFIR8UU(a,b)包括4个乘法运算和1个加法运算,这使TM1300具有强大的多媒体数据处理能力。而这些DSP操作指令都可以在C程序中直接调用,大大方便了编程。TM1300处理器内部含有128个通用寄存器,这些寄存器不是分段的,所有操作都能使用这些寄存器。TM1300使用32位线性寻址,寻址能力达到4GB,同时为了解决高速VLIW CPU和低速外存SDRAM之间的数据交换瓶颈,TM1300内部集成了16KB的高速数据缓存和32KB的高速指令缓存(CACHE),以确保VLIW CPU的全速运行。TM1300的二进制运行代码以压缩的格式存放在SDRAM和指令CACHE中,压缩的代码一方面可以提高指令CACHE的命中率,另一方面可以减少指令CACHE与SDRAM之间的数据交换。指令CACHE中有一个专门的指令解压机构,它负责解压缩指令并以224位的数据位宽向VLIW CPU提供指令。而其数据CACHE是双端口的,其数据位宽达64位,并且VLIW CPU与缓存之间是以CPU的运行频率交换数据的。
TM1300处理器的音频输入单元(AI)外接A/D转换器,支持1个或2个声道的音频输入采样,每个采样点可以设为8位或16位,可以工作在主模式或从模式,支持标准立体声IIS格式和左对齐格式,采样的数据通过双DMA通道直接存放在SDRAM中,通过中断方式通知CPU,减轻了CPU的负担。
三、G.729在TM1300上的优化、实现
国际电信联盟ITU在推出G.729编解码器算法的建议的同时,给出了G.729算法的一种软件参考实现,也给出了一组测试向量,用以验证软件的正确性。该软件采用移植性较好的ANSI C语言编写的,因此可以在许多硬件平台上编译、运行。但是由于软件采用的是16位定点运算,而且没有针对任何硬件平台做任何优化,也没有考虑并行运算,所以要充分发挥32位的TM1300 CPU的强劲性能,降低实现成本,必须经过大量的优化工作。代码优化过程是一个不断调整改造程序、利用测试向量验证正确性和查看系统资源消耗(主要指CPU占用率和所需内存)的过程,我们主要做了下列优化工作。
1、参考软件采用的是16位定点运算,而TM1300是32位的处理器,因此我们把2个
16位的音频采样数据合成一个32位的数据,把绝大部分程序改造成32位定点运算的程序。
2、参考软件中包含了一组用函数实现的基本操作,包括16位加法、减法、乘法、取饱和、左移、右移等函数,从程序运行的角度看,这些基本函数效率十分低,而且不利于提高程序的并行度。我们利用TM1300的DSP操作指令把大部分这种函数改成单操作指令。如原来的16位加法函数:
Word16 add(Word16 var1,Word16 var2)
{
Word16 var_out;
Word32 L_somme;
L_somme = (Word32) var1 + var2;
var_out = sature(L_somme);
return(var_out);
其中sature()又是‘取饱和’函数,把32位带符号整数转换成16位带符号整数。利用TM1300的DSP操作指令,我们把它改成下面这样一个宏定义:
#define add(var1, var2) ((Word16)DSPIDUALADD((var1), (var2)))
3、充分利用TM1300的128个通用寄存器,函数的临时变量尽量不要使用数组,而是直接用单个整数,因为TM1300编译器把数组编译成内存方式的变量,而单个整数的临时变量则用寄存器来保存,这样不但提高了运行速度,也有利于提高数据CACHE的命中率。
4、通过调整程序的流程来尽量提高程序的并行度,特别是耗时的函数,如改变循环的次数、步长等。TM1300的软件开发工具SDE中包含有测试函数并行度的工具,可以查看单个函数的并行度。我们知道TM1300的最高并行度为5,即1个时钟周期执行5个操作,经过我们的优化,G.729编码器的几个重点函数的并行度达到了4.2以上。
5、在C语言程序中,直接调用TM1300的汇编指令,特别是针对多媒体运算的DSP操作,尽量选用能并行执行的操作。
6、充分使用TM1300的2个高速缓存:指令CACHE和数据CACHE,提高CACHE的命中率。对于程序,在不影响并行度的前提下,使程序尽量小,避免程序的大范围跳转,这样可以提高指令CACHE的效率;TM1300的数据CACHE是以64字节为单位的,即每次从SDRAM读入数据或把数据调出数据CACHE,至少是64个字节,因此在许多地方,我们对数据的存放位置进行了重新调整,使读入CACHE的数据能被CPU充分利用。
通过上述优化措施,我们花比较低的代价在TM1300 DSP上实现了G.729编码器算法。在DSP主频为175MHZ、SDRAM频率为140MHZ的TM1300硬件平台上,G.729编码器完成实时语音编码的CPU占用率为8%左右,并且通过了所有测试向量的验证。
参考文献
1、ITU-T Recommendation G.729, Coding of Speech At 8 kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)
2、TriMedia TM1300 DataBook
|