网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C5000文章 >> C54X系列 >> 文章正文
  [组图]G.729在DSP应用中代码优化研究         ★★★ 【字体:
G.729在DSP应用中代码优化研究
作者:互联网    文章来源:本站原创    点击数:    更新时间:2007-1-21    

摘 要:对G.729编解码算法和TMS320C54x的原理进行了介绍,并介绍了如何实现该算法和优化代码。

  关键词:G.729;编码器;解码器;优化;TMS320C54x

 

Research of Code Optimization Based on G.729 for DSP A pplication

 

LIU Weichao, LI Fuhai

 

(College of Electrical and Information Engineering, Hunan University, Changsha,410082, China)

 

  AbstractThis paper contains the description of Encode and d ecode algorithm for the G.729 and the principle of the TMS320C54x,and introduce s how to realize the algrithmand optimize code

  KeywordsG.729encoderdecoderoptimizeTMS320C54x

 

1G.729编解码算法简介

  G.729ITU组织于1995年正式批准的,命名为G.729建议。该建议采用共轭结构[CD2]代数码激励线性预测(CSACELP)算法,其带宽约4 kHz,工作速率为8 kb/sMO S4.0左右,语音质量同32 kb/sADPCM相当。因此,G.729被广泛应用于DSVD、数字卫星系统、电视会议、可视电话、IP电话及各种多媒体通信系统中。

1.1编码器

  编码器是基于码激励线性预测(CELP)编码模型的,采样率为8 kHz,每10 ms对应80个采样点为1帧。编码器原理如图1所示。

 

 

 

 

 

 

  语音信号先进入预处理模块,信号经过高通滤波和信号幅度衰减后,再作为后续模块分析的信号。每10 ms帧将进行一次LP分析以计算出LP滤波器参数,这些参数被转换为LSP参数,并利用预测式两级矢量量化将其量化为18 b。激励信号应用分析合成(ABS)搜索算法进行选择。在该算法中,依据感觉加权失真测度使原始与重建语音信号间的误差最小。这是通过用感觉加权滤波器对误差信号滤波来完成的,滤波器系数由未量化LP滤波器推得。感觉加权的数目通过自适应以提高效果,使输入信号具有平坦的频响。

  激励参数(固定和自适应码书参数)5 ms(40样点)子帧确定一次。量化和未量化的LP滤波器系数应用到第二子帧,采用了插值LP滤波器系数(量化和未量化的)。一个开环基音延迟每10 ms帧基于感觉加权语音信号估算一次,然后以下操作每子帧重复一次。使LP残差通过加权合成滤波器W(z)/A(z)滤波算得目标信号X(n)。这些滤波器的初始状态,是通过对L P残差与激励间的误差进行滤波来更新的。这与通常的方法即从加权语音信号中减去加权合成滤波器的零输入响应是等价的。算得加权合成滤波器的冲击响应h(n),然后进行闭环基音分析(以寻找自适应码书和增益),利用目标信号X(n)和冲击响应h(n),在开环基音延迟值附近搜索,采用1/3精度的分数基音延迟,基音延迟再第一子帧编码为8 b,而在第二子帧采用5 b编码。自适应码书贡献(经滤波)减去后,目标信号X(n)变为X(n),这个新的目标信号X(n)用在固定码书搜索中以搜索最优激励。一个17 b的代数码书用作固定码书激励。自适应和固定码书的增益用7 b进行矢量量化(MA预测应用到固定码书增益中)。最后,滤波器的记忆值由已确定的激励信号来更新。

1.2解码器

  译码器原理如图2所示。

 

 

 

 

 

 

 

  首先,参数标号从接收到的比特流中提取。这些标号被译码,以获得对应一个10 ms语音帧的编码参数。这些参数是LSP系数,2个分数基音延迟,2个固定码书矢量,2组自适应码书和固定码书增益。LSP系数在每一子帧中进行插值并转化为LP滤波器系数,然后对每5 ms子帧进行如下步骤操作:

  ①自适应码书和固定码书乘以各自增益后相加获得激励。

  ②用LP合成滤波器对激励进行滤波,获得重建语音。

  ③重建语音信号再通过一个后处理级,该后处理级包括一个基于长时和短时合成滤波器的自适应后滤波器和一个能实现高通和比例缩放的滤波器。

 

2TMS320C54x性能简介

  TMS320C54xTI公司推出的高性能16 b定点DSP。因高性能与低功耗使其成为无线和有线通信系统的理想器件。C54x系列DSP采用改进哈佛结构,具有1个程序存储器总线和3个数据存储器总线,17×17 b乘法器,1个供非流水的MAC(乘法/累加)使用的专用加法器,1个比较、选择、存储单元。为C54x配备了双操作码指令集,他是该系列DSP操作灵活和高速度的基础。他的执行速率最高可以达到120 MIPS

 

3代码编写及其优化

  由于G.729算法非常复杂,而TMS320C54x的性能又非常有限,因此,实现语音信息的实时处理必然要求尽可能优化代码和充分利用DSP的性能。通常编写代码的方式有3种:用纯汇编语言编程、用纯C语言编程、混合编程。

3.1用纯汇编语言编程

  TI公司提供了针对开发DSP的汇编语言,用户可以用他进行软件开发。此种方式可以充分利用DSP芯片的硬件资源,其代码效率高,程序执行速度快。但是用DSP芯片的汇编语言编写程序比较繁杂,而且软件的修改和升级较困难。

3.2用纯C语言编程

  C语言的可读性、可修改性、可移植性和可重用性非常好。在用C语言进行DSP软件开发时,一般先在PC机上或工作站上对算法进行仿真,仿真通过后再将程序移植到DSP平台中。然而,由于G.729算法非常复杂,直接编写的C程序通常无法实现对语音实时的处理。例如:实际测试表明,用C语言编程和手写汇编语言编程之间的效率相差几倍甚至几十倍。因此,有必要对程序进行优化。优化的方法通常有如下几种:

3.2.1快速算法

  与直接算法相比,快速算法通常放弃了概念上的清晰度,转而追求程序上的高效率,典型的例子如DCTFFTDCT(离散余弦变换)是另一种常用的正交变换,以一个直接的32×32DCT变换为例,共需做1 024次乘法和992次加法。而采用了Lee提出的快速DCT变换方法后,对于同样的输入条件,只需做384次乘法和432次加法。适当采用快速算法,可极大的提 高代码运行效率。

3.2.2计算表格化

  为了提高算法的运行效率,减少运行时计算的时间开销,应尽可能把一些运行时计算的参数做成查找表或常数数值,从而将运行时的计算转化为编译时的计算。这不仅适用于一些比较规整的参数表,对于一些比较耗时的计算(如浮点除)也同样适用。

3.2.3数组指针化

  在C语言程序中,对数组的寻址是非常耗时的,特别是对多维数组。因此,在设计中 首先降低数组的维数,再进一步使之指针化。

3.2.4减少判断转移

  DSP多采用流水线法,如TMS320C54x就采用了6级流水线结构,频繁的转移指令将使流水线难以发挥作用。另外,DSP的大多数指令为周期指令,但转移指令通常要耗费较多的机器周期。因此,应该尽可能减少程序中的转移分支。事实上,通过对程序流的分析,许多判断转移可以用简单的条件组合来实现。例如将程序if (sum>32 767)sum=32 767优化成sum= min(sum,32 767)

3.3混合编程

  混合编程就是将C语言和汇编语言结合起来,充分发挥两者的优点和DSP性能的一种编程方法。混合编程主要有如下3种方法:

3.3.1独立编写C和汇编程序

  这种方法在实际工程应用较多,首先分别独立编写C和汇编程序,然后将他们加入到同一个工程文件中,再利用集成开发环境对他们进行编译链接,最后生成可执行代码。通常FFTFIRIIR等的程序一般采用汇编语言编写,而主程序则可采用C语言,这样只需在C程序中定义这些程序为外部调用即可。采用这种方法必须遵循有关的调用规则,有了这些规则,C和汇编函数之间的接口就变得很方便:C程序既可以调用汇编程序,也可以访问汇编程序中定义的变量;汇编程序也可以调用C函数或访问C程序中定义的变量。但用户必须维护各汇编模块入口和出口代码,计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。

3.3.2直接在C程序中嵌入汇编语句

  在C程序中嵌入汇编语句的方法比较简单,只需在汇编语句的左右加上一个引号,然后用小括弧将汇编语句括住,并在括弧前加上asm标识符即可,即asm(“汇编语句”)。采用这种方法一方面可以在C程序中实现用C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断使能或屏蔽、读取状态寄存器和中断标志寄存器等;另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语言以优化程序。而采用这种方法的缺点是比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。

  采用这种方法需要注意:

  ①不要破坏C环境,因为C编译器并不检查和分析嵌入的汇编语句。

  ②插入跳转语句和标号会产生不可预测的结果。

  ③汇编语句不要改变C程序中变量的值。

  ④不要在汇编语句中加入汇编器选项而改变汇编环境。

3.3.3手工优化和修改C程序编译生成的汇编程序

  采用这种方法通常需要对C编译器非常了解,而且在修改汇编程序时要避免与程序的其他部分发生冲突。通常采用如下方法进行修改:在集成开发环境中选择View菜单下的MixedSource/ASM选项,可看到交*列表的汇编程序;在所生成的语句中,每个C语句的下面就是C编译器对该C语句编译所生成的汇编语句,通过查看交*列表的汇编程序,可以对某些编译不是很优但却是比较关键的汇编语句进行修改。注意,修改汇编语句时切勿破坏C环境。

 

4结语

  由于G.729算法的复杂性,而TMS320C54x有限的性能,因此,通常采用纯C语言编程是无法 实现对语音的实时处理的。而采用纯汇编语言编程,虽然能够达到实时的要求,但是其开发周期过长。在实际情况下,主要是采用混合编程,主函数通常采用C程序编写,因为这样编译器会帮助初始化一些状态值,既准确又耗时少,一些用来存储数据的结构体用C语言定义,因为用汇编定义时会非常麻烦,对于那些耗时多、运算密集的模块则要用汇编编写,这样既能保证程序的结构化和可读性,又能保证代码的高效。

 

参考文献

 

1TMS320C54x Application GuideTexas Instruments,1996

2TMS320C54x Code Composer Studio Tutorial . Texas Instrument , 2000

3]戴明桢,周建江.TMS320C54x DSP结构、原理及应用[M.北京:北京航空航天大学出版社,2001

4Deitel H M,Deitel P J. C How to Program Second EditionM.Prentice Hall1994

5ITUT Recommendation G.729. Coding of Speech at8 kb/s.Using ConjugateStructure AlgebraicCodeexcited Linearprediction (CSACELP), 1996

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号