摘要:G.729.A在TMS320C6201DSP上的实现方法及提高G.729.A编码器的运行速度的优化方法和编程技巧。并介绍了该编码器的测试结果。
关键词:ITU-T G.729.A IP电话 编码器
最近几年,IP电话技术突飞猛进,已从当初PC到PC的机连接方式发展到IP电话网关方式,通过IP电话网关可以将PBX与因特网连接起来,从而实现普通话机通过因特网进行通信。因此,IP电话网关是近年来计算机和通信领域中研究的一个热点。IP电话网关的一个最主要性能指标是它的处理密度(即能同时算是的话路数)。而IP电话网关的处理密度主要取决于它所使用的语音编解码器处理一帧数据的延迟大小。目前,IP电话所遵循的标准是H.323,而H.323标准首选语音编码器是ITU-T G.729.A。ITU-T G.729.A是用于语音和其它声音信号的压缩编解码算法建议,它是G.729的简化版本,编码速率为8Kbps,并且有很高的语音质量。但是,该编码器的算法复杂,一帧语音的处理延迟较大,在很大程度上影响IP电话网关的处理密度。因此,为了提高IP电话网关的处理密度,本文在实现ITU-T G.729.A语音编解码器时,采用了目前性能较好的DSP,即TMS320C6201;针对TMS320C6201并行性和流水等特点,深入研究了在TMS320C6201上实现G.729.A的编解码器的编程技巧;归纳出一系列减少编解码器处理延迟的优化方法。采用这些优先方法和编程技巧,可以将ITU-T G.729.A的每帧编码运行时间减少到0.47毫秒(按TMS320C6201工作在200MHz计算),从而可以实现单片TMS320C6201能同时处理20路路语音。这一指标已到达了国际上非常先进的水平;而且,该编解码器已成功地运用在笔者开发的IP电话网关中。
1 G.729.A编解码器的算法
1.1 编码算法
ITU-T G.729.A标准采用一种称为"共轭结构代数码本激励线性预测"(Conjugate Structure Algebraic-Code-Excited Linear-Prediction,CS-ACELP)算法来对语音信号进行编码。
在开始编码之前,先要对输入的模拟信号进行电话带滤波,然后以8kHz频率对其进行采样,再将其转换为16位线性PCM码,作为编码器的输入。
编码器处理语音的单位是帧,1帧为10毫秒语音,包括80个声音样本(采样频率为8kHz)。编码器对每一帧语音信号进行分析,抽取出其中的CPLD模型的参数(线性预测滤器参数),自适应和固定码本索引和增益),对这些参数进行编码和传送。其编码过程如图1所示。
在预处理阶段,输入信号经高通滤波并乘以比例因子,然后对每一帧预处理之后的信号进行一次线性预测分析,计算出线性预测滤波器系数,其中,线性预测滤波器系数定义为:。这些系数被转化成线谱对(LSP,Line Spectrum Pairs)并用可预测二阶矢量量化法量化成18位。使用合成分析搜索过程选定激励信号,使得原始信号和重构信号之间的误差在感觉加权失真测量中最小。
对每个子帧(5毫秒,包括40个样本)求出其激励参数(固定和自适应码本参数)。本帧的量化和未量化的线性插值系数。每一帧根据感觉加权语音信号估计出开环基音延迟。多面手对每一子帧进行以下操作:将线性预测残差通过加权合成滤波器的冲击响应h(n),使用目标信号x(n)和冲击响应h(n)在开环基音延迂回通过周围搜索,并进行闭环基音分析(得出自适应码本延迟和增益)。第一个子帧的基音延迟编码为8位,第二个子帧采用差分方法编码为5位。通过减去(滤波后的)自适应码本贡献来更新目标信号x(n),新目标x’(n)在固定码本搜索中使用以找到最优激励。固定码本激励使用一个17位的代数码本。自适应和固定码本的献增益被矢量量化为7位(对固定码本增益使用移动平均预测方法)。最后,得到的激励信号被用来更新滤波器状态。所有这些参数最后封装到80位的压缩数据帧中。
1.2 解码算法
解码算法
解码器算法框图如图2所示。
首先,从压缩比特流中取得各参数的索引,再从这些索引中得出一帧语音的编码器参数,包括LSP系数、2个部分基音延迟、2个固定码本向量、2套自适应和固定码本延迟,这些参数被用来生成激励信号并合成滤波器参数。LSP系数经插值后,形成每个子帧的LP滤波器。然后,对每个子帧进行如下处理:
·自适应和固定码本向量乘以各自的增益系数得到激励信号;
·激励信号经过线性预测合成滤波器得到重构的语音;
·重构后的语音信号再经过一个后处理阶段,包括基于长时和短时合成滤波器的自适应滤波器,然后再经过高通滤波器并乘以相应的比例因子。
2 ITU-T G.729.A编解码器实现的关键技术
2.1 ITU-T G.729.A编解码器实现的硬件平台
ITU-T G.729.A编解码器实现平台是笔者开发的一种集成式IP电话网关。这种集成式IP电话网关的设计思想是以PC机为基础,集成了市场通用板卡,如LSI/C6200DSP资源卡、Dialogic的语音卡和网关等,并以这些板卡为硬件平台,按照相关协议,开发出一套IP网关软件。集成式IP电话网关的硬件基本结构如图3所示。其中G.729.A编解码器是由LSI/C6200资源卡上的TMS320C6201 DSP来实现。
TMS320C6201 DSP是美国TEXAS INSTRUMENT公司生产的目前处理速度最快的定点数字信号处理器,TMS320C6201 DSP采用VLIW(Very Long Instruction Word)体系结构,其工作频率最高可达200MHz,内部有1600MIPS[4]。另外,TMS320C6201 DSP分别提供了64KB的内部程序RAM和数据RAM,片外存储器可扩展到4GB,可连接SDRAM、SBSRAM和Flash Memory。TMS320C6201 DSP还提供了丰富的外围电路接口,如:Scbus语音总线、MVIP语音总线、HOST接口以及JTAG口等。
2.2 ITU-T G.729.A软件模块的设计
G.729.A编解码器运行的硬件平台是TMS320C6201DSP,支持SPOX。SPOX是一种功能很强的实时操作系统。在SPOX操作系统的调度下,可对多路语音进行适时的语音压缩和解码。G.729.A编解码器件主要由调度及命令解释模块、G.729.A数据压缩与解压缩模块和接口模块三部分组成。 (1)调度及命令解释模块
该模块主要用于解释HOST发来的各种命令,如发送或接收编解码数据,查询编解码状态以及启动、停止编解码操作等,该模块不直接与HOST打交道,而是以SPOX提供的服务方式,通过接口功能模块间接地实现与HOST之间数据交换。同时在SPOX的支持下,完成对多路语音编解码的适时调度。
(2)G.729.A数据压缩与解压缩模块
该模块是ITU-T G.729.A编解码器的核心模块,在很大程序上影响编解码的性能。该模块实现了ITU-T G.729.A全部功能。该部分已单独形成一个TMS320C6201函数库,可与其他任何部分连接。 (3)接口模块
该模块主要实现TMS320C6201与HOST以及与语音卡之间的数据交换,因此该模块分成两部分。一部分主要负责TMS320C6201 DSP与语音卡之间的数据传输,它负责不断地将语音卡采取的语音数据通过语音总线(如SCbus),采取等时通信方式送入到LSI/PCI6200资源卡RAM中,或者是将编解码器解码后的数据经SCbus总线送给语音卡。另一部分主要负责TMS320C6201 DSP与HOST之间的数据交换,一方面要将压缩后的语音信号由PCI总线送往HOST;另一方面将HOST解包的码流分类后读入编解码器。编解码器与HOST之间的数据交换采用中断方式进行同步。
2.3 ITU-T G.729.A标准在TMS320C6201上实现的关键技术
处理密度是衡量IP电话网关性能好坏的一个重要指标。而一个IP电话网你在硬件平台确定的情况下,其处理密度主要取决于它所采用的编解码器的语音编码处理延迟,即代码的执行速度。如何提高G.729.A语音编码的执行速度是G.729.A编解码器实现的关键技术问题之一。这此,归纳出一系列编程技巧和优优方法,较好地解决了这一难题。
(1)G.729.A标准中规定的算法都是基本算法。因此,在实现时,可以用快速算法。例如,相关系数的计算,在G.729.A标准中使用一种最基本的计算方法,如果采用快速的傅里叶变换技术或采用分解因子的计算方法,就可以加快计算速度。 (2)算法中有很多FIR和IIR运算,如:共振峰滤波器、听觉加权滤波器、联合滤波器等,在设计这些滤波器时,使用较大数组来放滤波器的系数。这样,每计算一次输出,不需系数更新移位,从而可以减少内存操作次数,因此可以通过牺牲存储器空间来提高代码的执行速度。如:共振峰滤波器是十阶滤波器,常规的实现方法是设置一个长度为10元素的一维数组来保存最近的10个共振峰样本点。滤波器每输出一个样本点,该数组就需更新一次。对于一个子帧40个样本点,就需进行40次更新操作。如设置长度为70元素的一组数组,就可以免去更新操作。可以很大程度地操作代码的运行速度。
(3)多使用指针,尽量减少变量之间的反复拷贝操作。
(4)用查询静态表的方法来代替动态的计算,从而减少计算延迟。例如,在设计cos()函数时,程序在初始化时就生成一个512项的cos()函数表。当需要计算cos()函数值时,可以采用查表方式来代替动态计算。
(5)内存单元的合理分配。TMS320C6201 DS的片内存储器有64KB数据存储器。由于TMS320C6201从片内存储器读入一个字比从片外存储器读入一个字快14倍,因此在编程时,尽量将经常使用的数据分配在片内存储器中。
(6)G.729.A在TMS320C6201上定点实现时,数据精度也是一个关键问题。在定点信号处理芯片上实现某些浮点算法时,可以采取定点数来表示浮点数,这样可以加快运行速度,但可能导致运算精度不够。解决的方法是在精度要求比较高的地方,可以将计算的中间变量用32位表示,甚至用40位表示。
(7)充分利用TMS320C6201的编译器和优化工具来优化C和线性汇编代码,并合理地选择优化参数。有关速度的优化参数是:-o3、-pm、-mt、mi等。并尽量用TMS320C6201的线性汇编或汇编语音来实现G.729.A编解码器的算法。
(8)充分利用TMS320C6201的特点来编写代码。如流水功能,8个功能单元并行操作功能,32位字读写功能以及Intrinsics的使用等,例如:对多重循环,如最内层循环次数少而较简单,可把最内层循环展开,以便外循环做流水线;对一些简单循环而前后没有因果关系,合并这些循环也有利于做流水线。
3 性能测试
分别用二种测试工具对G.729.A编解码器的处理延迟作了测试。第一种测试工具是C6X Simulator(TMS320C6201的仿真软件),测试条件是假设所有代码装在TMS320C6201片同的程序存储器中;因此,称之为Non cache测试模式。另外一种测试方式是采用TI公司的C6X的EVM卡(评估卡),测试条件是将TMS320C6201片内64KB RAM作为Cache使用;因此称之为cache模式。二种测试模式的测试结果如表1所示。
表1 G.729.A编解码的时钟数
测试项目 C6 仿真器(非缓冲模式) C6 评估板(非缓冲模式)
编码(每帧) 86720 cycles 91650 cycles
解码(每帧) 34120 cycles 37310 cycles
从表1可以看出,如果TMS320C6201工作在频率为200MHz,即每Cycles的周期为0.5毫秒,可以算出G.729.A编码一帧(30毫秒)的延迟时间是0.43~0.46毫秒。因此说,单片TMS320C6201可以同时处理大约20路G.729.A编码(当前国际最高水平是22路);而且,编解码的结果都严格地通过了G.729.A提供的测试矢量的测试,实际播放音质也很好。
ITU-T G.729.A语音信号压缩编解码技术集成了众多低速率语音编解码的优点,大大提高了低速率编解码的语音质量,但算法较复杂。而TMS320C6201 DSP是目前最快的定点数字信号处理器,如果在编写程序时,能充分利用上述关键技术,就可以充分发挥TMS320C6201的功能,大大减少G.729.A编解码的处理延迟,并能保持良好的语音品质。将该编解码应用在该IP电话网关中,在很大程度上提高了IP电话网关处理密度,改善了IP电话网关的性能。因此说,本文实现的G.729.A编解码器有很大的应用价值。
转载地址:http://www.voipchina.cn/technology/2004-03-20/36516.shtml