G.729ab

2024-07-19

G.729ab(通用6篇)

G.729ab 篇1

在VoIP媒体网关设备中,语音压缩编码是其关键技术之一。在ITU-T发布的应用于VoIP的语音压缩编解码标准中,G.729是应用较为广泛的一种。G.729采用“共轭结构代数码本激励线性预测编码”(CS-ACELP)算法[1],算法帧长为10 ms,编码后速率为8 Kb/s。G.729有两个附件:附件A给出一种低复杂度的算法,可应用于多媒体同步语音和数据;附件B在标准算法的基础上增加了静音检测压缩算法以降低平均传输率,包括静音检测(VAD)和舒适噪音产生(CNG)[2]。文献[1]对G.729语音压缩编码算法的具体原理中有详尽的描述,本文的论述重点在算法的汇编语言优化、声码器的DSP硬件接口设计,以及其在媒体网关中的应用。

1 G.729ab编解码核心算法优化

本文选择TI公司的TMS320C6203芯片为核心,实现G.729ab声码器设计。TMS320C62xx系列DSP的集成开发环境Code Composer Studio(简称CCS)支持标准C语言和汇编混合编程的方式编程,为了提高编解码算法的效率,本文对ITU_T的标准G.729ab的C语言原码进行汇编指令优化设计。同时,对于上层编解码器控制函数,采用C语言开发,以提高声码器的可维护性[3]。

C62xx采用6级流水线结构,提供了A,B两组(共32个)通用寄存器,8个功能单元(.L1,.L2,.S1,.S2,.M1,.M2,.D1和.D2),最多同时可以有8条指令处在不同的执行阶段并行[4]。流水线结构是DSP实现高速运算的重要技术。由于不同指令的指令周期不同,需要在多周期指令后插入足够的NOP(空操作)指令,以避免流水线冲突[5]。

在G.729ab的标准C代码中,有大量的循环体。循环控制的关键跳转指令B,需要等待5个指令周期,大量的NOP操作将降低代码的效率。为了提高循环效率,可以合理安排指令顺序,在一个汇编循环体内完成多个C循环的运算的流水线操作。用汇编指令实现如下简单的for循环求信号能量的程序段为例:

如上优化后,循环体LOOP仅为一个周期,在这一个周期中有6条并行运行的指令。其中,内存读取指令LDH需4个周期,故乘法指令SMPY是将向前追溯4个循环周期的内存读取结果相乘。同理,SMPY指令需2个周期,故SADD指令是将2个循环周期之前的相乘结果相加。B0和A1配合用于循环控制,在等待跳转指令B有效的5个延时周期内,依次进行随后的后一循环的取数,前第3个循环的相乘,前一个循环的求和、循环控制和跳转指令,依次类推。上述优化实现了最优循环效率。

本设计优化后核心编解码算法代码完全符合ITU-T G.729ab标准,并通过了ITU-T的所有测试矢量。使用300 MHz主频的TMS320C6203实现声码器,单片可支持31路G.729ab算法。

2 声码器的DSP硬件接口设计

在媒体网关中,声码器的功能是实现PSTN的E1语音信号和数据网分组语音压缩信号之间的编解码转化。利用TMS320C6203片内固化设置的McBSP接口(多通道缓存串行接口)与HPI接口(主处理器接口),可以实现DSP与E1总线、以及数据网上层处理器的连接。结构示意图如图1所示。

TM320C6203通过内置McBSP与EDMA(Enhanced Directory Memory Access,增强型直接内存访问)控制器配合,可实现与E1标准接口的链接。设置McBSP的接收/发送控制寄存器[6](R/XCR),使串口按照标准E1数据格式进行数据收发;设置串口管脚控制寄存器(PCR),控制串口采用外部E1总线的时钟和帧同步信号;设置串口控制寄存器(SPCR),控制串口的R/XINT(收/发中断)由EDMA响应。

TMS320C6203支持16个EDMA通道,其12~15通道可用于响应串口收、发中断[7]。以串口接收数据为例:本设计中设计了乒、乓两个串口数据接收缓存区。串口寄存器中的数据通过EDMA模式缓存到乒缓存区,当乒缓存区满时,EDMA参数重载,控制切换,将数据缓存至乓缓存区,同时给出EDMA中断,通知CPU读取一帧数据。通过McBSP接口发送数据的过程完全类似。

声码器通过DSP的HPI接口与上层处理器连接,实现数据网分组语音压缩信号的收发。在HPI接口中,设计了以太网数据发送/接收缓存区,并为每个缓存区设计了RP(Read Pointer,读指针)和WP(Write Pointer,写指针),用于控制上层处理器和DSP之间的编码数据交互。同时上层处理器通过HPI接口向声码器发送指令,控制通道的打开或关闭。

3 在媒体网关中的应用设计

声码器内部的主控程序采用定时中断方式访问HPI接口,根据上层处理器的指令打开或关闭通道。同时主程序使用轮询方式处理从E1接口来的PCM话音信号;根据相应的通道工作状态设置编解码算法参数,将话音信号压缩编码;编码后的语音数据,通过HPI接口输出到上层处理器,进入数字网络。使用完全类似的轮询处理方式,逆向处理从来自数字网络的编码数据。

由于数字网络属于分组通信,必须有合适的多媒体实时流网络传输协议以保证语音的连贯性。在声码器的HPI接口控制程序中,设计了一个提供给上层处理器的RTP(Real-time Transport Protocol,实时传输协议)接口,用于完成编码和解码数据包的输出和输入及相应的RTP成帧、解帧功能,具体功能设计如下:

RTP打包和发送:RTP包由具有固定格式的包头和数据部分组成[8]。将编码后的语音数据,按照RTP打包参数的要求组织RTP头和RTP净荷。RTP包头中的关键字段为SN(Sequence Number,序列号)和TS(Time Stamp,时间戳)。SN用于对RTP包进行排序。每发送一个RTP数据包,SN加1。TS用于标识RTP数据包中第一个字节采样时的时刻,以语音样本为单位递增;对于语音包和静音压缩包,TS增值一致。另外,RTP包头中的PT(Payload Type,负载类型)字段用于指示RTP净荷的数据编码格式。在RFC3550[6]中规定了标准音频载荷类型: G.729编码对应的PT为18。

由于RTP包头中没有长度字段,故对RTP包进行了外部扩展:将打好的RTP包作为净荷,附加上RTP包数据长度、通道号,组成“以太网数据包”。针对C6203的32位寻址的HPI总线接口,设计以太网数据包格式如图2所示。

RTP包发送:即写“以太网数据包”至“以太网数据发送缓存区”。首先根据该缓存区的读写指针判断剩余空间;如写空间不够,则放弃此次写操作,该数据包同时被丢弃。如写空间足够,则将数据包写入发送缓存区,并更新写指针。上层处理器根据该缓存区的读写指针判断该缓存区内是否有新数据,并进行读操作,以及更新读指针。

RTP包接收、排序和缓存:分组通信需要考虑语音的防抖动处理。本文通过设置静态抖动缓冲区实现去抖动。首先根据“以太网数据接收缓存区” 的读写指针判断是否有新的数据包到来,如果有,则将该数据包根据RTP的SN和TS排列在相应通道的RTP缓存队列中。重复上述过程直至将“以太网数据接收缓存区”中所有的数据包读完,然后更新该缓存区的DSP读指针。对于每个通道的RTP缓存队列,当缓存语音数据到达预先定义的阈值K时,给出标志允许该通道开始进行语音数据解码。如果数据分组有抖动延迟,则解码语音可继续保持K时间单位不被打断。

4 结 语

在纯汇编并行优化的基础上设计了高效的G.729ab声码器;利用TMS320C6203的在片外设McBSP实现了连接PSTN的标准E1接口;设计了用于分组数据收发的RTP协议接口,利用TMS320C6203的HPI接口方式与上层处理器连接,使声码器可灵活应用于媒体网关。

摘要:以TMS320C6203为硬件平台,设计了高速G.729ab多通道声码器。使用纯汇编指令与C语言结合优化编程提高核心编解码算法效率,实时支持最大31个话路语音的G.729ab编解码。利用TMS320C6203的在片外设McBSP提供声码器连接PSTN的标准E1接口,设计了用于分组数据收发的RTP协议接口,利用TMS320C6203的HPI接口方式与上层处理器连接,使得声码器可灵活地应用于媒体网关。

关键词:G.729ab,指令优化,McBSP,RTP接口

参考文献

[1]刘为超,黎福海.G.729在DSP应用中代码优化研究[J].现代电子技术,2005,28(5):59-61.

[2]王伟,王伟达,郭恒业.G.729A语音压缩算法分析及DSP实现[J].计算机工程与应用,2007(8):99-102.

[3]廖延娜,陈新富,孙健,等.一种多通道联合声码器及其实现方法:中国,03114586[P].2005-01-26.

[4]卞红雨,纪祥春.TMS320C6000系列DSP的CPU与外设[M].北京:清华大学出版社,2007.

[5]Texas Instruments Incorporated.TMS320C62xDSP CPU and instruction set reference guide[M].Texas:Texas In-struments,2006.

[6]Texas Instruments Incorporated.TMS320C6000DSP multi-channel buffered serial port(McBSP)refercend guide[M].Texas:Texas Instruments,2006.

[7]Texas Instruments Incorporated.TMS320C6000DSP en-hanced direct Memory access(EDMA)controller reference guide[M].Texas:Texas Instruments,2004.

[8]SCHULZRINNE H,CASNER S,FREDERICK R.RTP:a transport protocol for real-time applocations,RFC3550[S].New York:Columbia University,2003.

G.729算法的一种优化改进 篇2

G729算法是由ITU-T的第15研究小组提出的, 并在1996年3月通过的sKbps的语音编码算法。G.729语音压缩标准为Conjugate-structure Algebraic code ExcitedLinear Prediction (CS-ACELP) [1], 是基于CELP模式所发展出来的技术, 其所使用的语音时框为10 ms, 而每一时框有80个取样值。在每10ms的时间内, 语音讯号会被分析, 并基于CELP的架构, 取出其特性参数, 然后编码成80个位元, 最后原本的语音讯号会被转换成一连串的参数值传送到接收端, 达到了语音压缩的目的。

由于G729编解码器具有很高的语音质量和很低的延时, 而且在有随机比特误码、发生帧丢失和多次转接等情况下有很好的稳定性, 被广泛应用在数据通信的各个领域。

2 优化改进

根据2/8守则, 80%的运算时间会用在20%的代码中, 为了使优化更高效, 重点对这占大概20%部分的代码进行优化。首先给出算法的各函数的运行轮廓, 如表1所示。

2.1 溢出检查的代价

从表中可以看出, 大部分的运算, 都集中在以L_开头的几个函数中, 通过讲一步的分析代码可以发现, G.729的大部分运算都集中在源文件basic_op.c[2]里, 在basic_op.c有个溢出标志位overflow, 很多基本函数多对其判断浪费了很多时间。我们分析表中运算量最大的几个函数, L_mult、L_add和L_sub只是进行简单的加减乘法运算, sature是从32位整型到16位整型的类型转换, L_mac是直接调用L_add和L_mult实现的, L_msu是直接调用L_sub和L_mult实现的[3]。这几个函数CPU占用率的总和为51.85%。

以L_add为例, 它的实现代码如下:

我们看到, 大部分是为了检查溢出而进行的判定操作, 在终端上转换为汇编代码后, 按最短路径执行时, 需要执行7条指令, 最长路径需要执行16条指令。再加上因为函数调用而导致的额外代码开销和指令跳转时的取值等待时间, 以及函数内部因为跳转导致的取值等待时间, 调用L_add的代价实在不小。而如果L_add在整个算法中的执行时间占到了11.12%时, 每减少一条指令的执行, 对算法的性能提升都是巨大的。

不进行溢出检查的L_add如下:

只需要一条语句即可, 这个可以用内联或宏语句来实现, 这样可以省去函数调用的开销, L_add的性能也会大大提升, 使得算法的性能也大大提升, 其他几个函数也有同样的效果。可以说, 整个算法中将近一半的运算量都是为了进行溢出检查。

2.2 定位不必要的溢出检查

溢出检查是必须的, 在实验中我们发现, 发生溢出的可能性虽然不高, 但也不小, 而且对于音质来说, 是至关重要的。如果直接去掉所有的溢出检查, 编解码后的语音几乎听不清。如何确定在什么地方不需要进行溢出检查是我们优化工作的关键。

本文提出一种基于统计的方法, 以精确定位不会发生溢出的调用, 并用宏语句替换函数调用的方法进行优化。这样不但节省了溢出检查, 还节省了函数调用的开销。

首先我们跟踪所有对这6个函数的调用, 然后对每个函数的调用计数, 统计它被各函数调用的次数和发生溢出的次数, 记录所有溢出发生时的调用者, 并计数出溢出发生的概率。这样, 在没有发生溢出的调用函数里, 就可以省去溢出检查, 达到优化的目的。

以Ladd为例, 首先设置一个函数标识符栈, 初始化为空, 在每个调用函数 (简单起见, 视basic_op.c源文件之外的所有函数为调用函数) 进入函数体时, 将本函数的标识符入栈, 退出函数体时将标识符出栈, 这样保证栈顶一直为L_add的直接调用者。然后还需要在全局为L_add设置一个二维数组计数器, 第一维是以L_add的调用函数标识符为索引, 第二维分别记录L--add被该函数总的调用次数和发生溢出的次数。这样在L_add每次被调用时, 通过栈顶查找到它的直接调用者, 然后调用次数计数器加1, 在发生溢出时溢出计数器加1。运行结果如表2所示。

从表2中我们看到, 在所有的调用中, 可能发生溢出的调用次数占总调用次数的比率, 除了Ladd达到34.2%外, 其它几个函数的比率都特别低。而且在可能发生溢出的调用函数中, 真正发生溢出的概率也特别低。

在此分析基础上, 我们的优化方案是:在以上可能出现溢出的地方, 调用带溢出检查的函数版本 (即原版本) , 在其它地方, 使用无溢出检查的宏语句代替函数调用。下表总结了优化方法, ●表示使用它的带溢出检查版本, ○表示使用无溢出检查的宏语句。

2.3 优化方案

在此分析基础上, 我们的优化方案是:在以上可能出现溢出的地方, 调用带溢出检查的函数版本 (即原版本) , 在其它地方, 使用无溢出检查的宏语句代替函数调用。表3总结了优化方法, ●表示使用它的带溢出检查版本, ○表示使用无溢出检查的宏语句。

L_mac和L_msu需要单独处理, 在每个相关的调用函数中, 如果调用了L_mac或是L_msu, 或是L_msu, 则L_mac使用相应的L_mult和L_add的组合版本, L_msu使用相应的L_mult和L_sub的组合版本。

对于上表中没有出现的其它调用函数, 将他们对于L_mac、L_msu、L_mult、L_add、L_sub、sature的调用都使用相应的无溢出检查的宏语句代替。

3 优化测试

优化工作完成后, 为了验证优化结果是否满足系统的要求, 需要进行测试。我们的测试平台是:CPU2.80GHz、内存512 M, Windows XP系统。测试优化结果需要分两个方面来进行:处理能力的测试和语音质量的测试。下面就来介绍这两个方面的测试。

3.1 处理能力测试

测试的方法是在上面提到的测试平台上运行G.729语音编解码程序对一个语音文件进行处理, 在编解码程序的开始之处和结束之处采集系统时间, 两者之差即为处理该段语音数据所需要的时间。该语音文件是利用Windows自带的录音机录制的, 其内容为”我叫吴秀枝, 现在攻读硕士”, 总共有1 176个帧。测试结果见表4。

由表4可以看出, 在未作任何优化之前, 处理一帧所需要的时间为37.26, 在代码优化之后, 处理时间缩短了一半, 性能提高近150%, 达到了本文优化的预期目标。

3.2 语音质量测试

目前评价语音质量的主流方法是MOS得分法, 因此在对系统进行语音质量测试的时候也是使用该方法。这里不再列举出每个测试者对各个小项 (整体印象、努力程度、理解程度等) 打分的情况, 只列出每个测试者对系统打的MOS分 (各个小项目的平均分) 。系统MOS得分情况如表5。

由表5可以看出由于网络和系统的延迟, 各个小组的MOS得分不一致, 但总平均分是3.6。MOS得分为3.6已经符合系统合格的语音质量要求了。

4 优化总结

这种统计的优化方法, 理论上, 对于我们预先选取的音频数据的所有溢出都能得到检查, 也就保证了优化后的算法的编解码效果与未优化的效果完全一致。但是对于其它数据, 则不可能保证这些, 也就可能导致优化后的算法的编解码效果与未优化的有差别。

在实验中, 我们得出, 优化后的算法性能得到了很大程度地提高, 语音质量几乎达到未优化之前的水平, 仅凭听觉无法区分。而且统计结果具有一定的普遍性, 因此该优化方案具有较强的现实意义。

本文的这种优化方法的最大优点, 是不需要对G729算法本身有多少了解, 而且还有很强的可移植性, 非常具有现实意义。

参考文献

[1]张拥军.VoIP中语音压缩编解码器的研究与实现[J].安徽电子信息职业技术学院学报, 2007, 6 (4) :102~103

[2]王炳锡.语音编码[M].西安:西安电子科技大学出版社, 2003:233~256

[3]Telecommunication standardization sector of itu, c729E[Z].G.729Implementers Guide, ITU—T, 2002

G.729ab 篇3

语音通信是现代多媒体通信中的一个重要的组成部分,语音压缩又是实现低速率语音通信的关键技术。国际电信联盟(ITU)于1996年提出了一种共轭结构代数码激励线性预测(CS-ACELP)的语音编码算法-G.729。该算法在8kbits码率下具有较好的语音编码质量,而且延时较短,因此在IP电话、移动通信、多媒体网络通信以及各种手持设备中具有广泛应用。G.729A是在G.729基础上进行了一部分简化,使得编码的复杂度降低,对硬件的要求更低,而编码质量并没有明显降低[1]。本文先简要地介绍了G.729A算法和C55x DSP的功能特点,然后具体介绍了G.729A在C55x DSP上的实现,并在C代码级和汇编级对算法作了优化,最后在DSP上实时的实现此算法。

2 G.7 29 A语音编解码算法

G.729A语音编码器的输入是采样率为8k Hz的16位精度的线性PCM码,G.729编码器对语音信号按帧进行处理,每帧的长度是10ms。由于另外需要5ms的下一帧信号进行前视线性预测编码,所以算法的延时为15ms[2]。编码器的原理框图如图1所示。首先对输入信号进行预处理,接着对每帧进行线性预测(LP)分析以获得线性预测系数(LPC),线性预测系数转换成线谱对(LSP)后经两级矢量量化,并在余弦域上对线谱对系数进行内插。激励信号的选择依据是在分析合成的搜索过程中,使实际语音与合成语音之间经感觉加权后的误差能量最小,感觉加权滤波器的系数由线性预测滤波器获得。每帧又分为两个5ms的子帧,每个子帧需要独立的激励参数(包括自适应和固定码本参数)。为减少自适应码本搜索的复杂度,需要先估计一帧感知加权语音信号的开环基音周期,之后对每个子帧分别进行闭环基音分析,在开环基音附近搜索寻找自适应码本的基因延迟和增益[3]。然后进行固定码本搜索,固定码本是代数结构的,这减少了搜索的复杂度,G.729A中还使用了深度树优先的搜索方法,使搜索的复杂度进一步降低,这也是G.729A算法复杂度降低的主要原因之一。固定码本搜索完毕后,对固定码本的符号和位置进行编码,并对量化后的自适应码本和代数码本的增益进行编码。最后,更新滤波器状态[4]。

相对于编码器,G.729A的解码器比较简单,首先将输入的参数(线性预测系数、自适应码本矢量、增益等)进行译码后重构语音,然后进行短时滤波器等后处理过程[5]。

3 TMS320C55x芯片结构特点

TMS320C55x是TI公司推出的C5000系列的最新一代的16位定点DSP内核,具有低功耗、高效率、代码密度高等优点,完全兼容C54x系列,内部集成了大量的SRAM,并且通过EMIF接口可以外扩SDRAM,为完成复杂的语音算法提供了可能。C 5 5 x包含两个M AC单元以及四个4 0位加法器,增加了总线宽度,具有12条独立的总线,这些特性使芯片处理数据的速度得到很大的提高[6]。

C55x处理器采用变长指令结构,指令长度的范围是1-6个字节。C 5 5 x处理器内核可分为四个处理单元:I单元、P单元、A单元和D单元,各单元分别负责取指、控制、运算功能。C55x内部有两段流水线,一段是读取流水线,负责取指令;第二段是执行流水线,是一条长达7级的流水线,指令在这条流水线上执行[7]。

4 G.729A语音编解码算法的的优化

4.1 C代码的移植

国际电信联盟提供了定点和浮点两种版本的G.729A的C源代码,由于C55x是16位定点DSP处理器,所以实验中选用的是16位定点的C代码。在实现过程中我们采用的方法步骤是:首先移植C代码到C55x平台,然后在C代码级和汇编级进行代码的优化工作[8]。

国际电信联盟提供的G.729A的C代码是在通用处理器开发的,然而通用处理器一般是32位的,而且没有DSP处理器中的一些专用指令,如乘加指令,该指令可以在一个周期内完成一次乘法和加法的运算。为了能在通用处理器上进行类似DSP的编程,国际电信联盟提供的16位定点的C代码中包含了一个BASIC.C的文件,该文件中的函数模拟实现了绝大部分的16位DSP处理器的运算指令。移植的工作就是用DSP处理器的指令来替代这些模拟函数,这步工作可以通过使用内在函数来完成[9]。内在函数是C55x的C编译器提供的一系列与DSP基本运算指令相对应的函数,编译后直接嵌入代码,没有额外的函数调用开销,BASIC.C文件中的函数都有对应的内在函数,所以移植工作比较简单。

4.2 代码的优化

由于设计G729A这样复杂而且实时性有苛刻要求的应用程序来说,程序的可读性是其次,首要目标是快速、高效。因此,为了能够达到所要求的实时处理的目的,必须对现有的程序进行优化。对程序的优化可以从三个方面进行:算法的优化、C程序的优化和汇编的优化。G.729A是在G.729基础上对算法的复杂度进行了简化,所以本文主要是对代码进行优化,以达到在DSP上实时实现的目的[10]。

1、C语言级优化

(1)去除不必要的溢出保护

在G.729A的定点C语言程序中,所有运算之后都要检验结果是否溢出,尤其在一些基本运算中使用频繁,因此,所需执行的溢出检验次数很多。而在实际的运算中,并不是所有的运算都存在溢出,我们只需在程序中确实有可能出现溢出的地方加入溢出保护。一般情况下,可以通过对数据值所处范围进行分析,发现是否有溢出的可能,对于不容易确定的地方,可以使用大量典型的实际语音样本进行仿真测试,检查是否出现溢出[11]。

(2)基本运算函数代码优化

源代码的基本运算函数一共有40个左右,这些函数从C语言的角度来实现数字运算和保证运算精度,尽管可读性很好,但是运行效率过于低下,由于函数调用非常频繁,因此,有必要对这些函数进行优化。

(3)使用宏定义

在G.729A标准的定点C语言程序中,所有基本运算都是以调用子函数的形式执行的。这样做虽然对程序的规范化设计有好处,但也在很大程度上降低了程序的运算效率。我们可以将这些基本运算由子函数调用改为宏定义,这将去掉函数调用的开销,加快运算速度,程序的运算效率明显提高,这样做虽然会增大代码量,但还是在C55x芯片存储空间的可接受范围内。

(4)用指针调用函数和结构体

在C语言程序中,函数调用往往产生大量代码。当程序调用一个函数时,它首先把函数传递给寄存器或堆栈。如果函数参数很多,则调用开销会很大,此外,还需大量堆栈空间。最坏的情况是函数参数传递的是结构体,编译器在调用函数时必须首先复制整个结构体到堆栈。此外,若函数返回的是结构体,调用程序保留堆栈空间,传递结构体地址给函数,调用函数,然后函数返回,最后,调用程序还要清除堆栈,并将返回的结构体复制到另一个结构体。代码和堆栈的开销将是惊人的,特别是对于资源有限的DSP[12]。为了避免这种开销,应禁止传递结构体,一般用结构体指针替代,如果结构体是不可修改的,则可用常量结构体指针替代。

(5)使用函数的直接插入

对函数采用直接插入,一方面可以节省函数调用的开销,另一方面一旦函数直接插入,C5 5x开发平台的C优化器可对函数以及函数的上下文代码进行优化[13]。但对函数的直接插入会增加代码长度,特别是当插入的函数在多个地方被调用时,因此,对一些小的、调用不太频繁的函数,在代码量允许的范围内,可以采取直接插入。

经过C语言级优化,可以在一定程度上提高程序的执行效率,但由于C代码固有的缺点,使其效率远远不如手工汇编,而且用C语言实现对硬件的控制也比较困难,因此,C语言一般只用于算法不太复杂,对实时性要求不严格的场合,像G.729A这样较复杂、对实时性又有一定要求的算法,仅仅C语言级的优化是远远不能满足实际的需要,必须进行汇编级的优化。

2、汇编级优化

(1)使用内部函数

C 5 5 x开发平台的C编译器认识许多内部函数,例如,实现饱和加、饱和减、归一化等内部函数。内部函数可以方便地实现需若干C语句才能实现的功能。它是一种非常有效的优化方法,它的调用格式和普通C函数一样,但在编译时C编译器会将内部函数用对应的汇编指令代替[14]。

(2)高效地优化循环体

G.7 2 9 A最耗时的代码段都出现在循环体内,循环体优化的好坏直接影响最后的优化结果。C55x提供了专用的硬件循环指令,可以有效提高循环效率。为了进一步优化循环体内的指令,需要使用循环展开、循环拆分、循环合并等方法。

(3)减少流水线的延迟

C 5 5 x的流水线是受保护的,当指令间存在冲突时,流水线会自动插入延迟(Stalls)来保证代码执行结果的正确性,但是这却增加了额外的开销。为了避免流水线冲突,需要在写代码时考虑C55x流水线的结构,防止出现指令间的冲突。例如可以通过指令重排序来减少指令间的数据相关冲突。

(4)使用C55x的特殊指令

C 55 x为了提高DSP运算的能力,提供了一些专用的指令,比如双乘加运算、硬件循环指令、条件执行指令。另外,还有MAX、MIN、ADDSUB2CC等指令都在G.7 2 9 A的优化过程中使用。运用这些专用指令,不仅提高了代码的运行速度,而且减少了代码量,让代码更加简洁易懂。

(5)溢出的处理

在G.729A标准的定点C语言程序中对溢出的处理很繁琐,严重的影响了代码的效率,在汇编代码中通过对溢出标志位OVM(当OVM=1时,如果发生溢出,目的累加器置成正的最大值或负的最大值)的灵活运用,可以有效地消除原来那些繁琐的处理,提高程序的运行效率。

最后,使用以上的优化方法对G.729A算法进行优化。下表列出的是对同一组语音数据进行编码和解码处理,主要程序模块优化前后的处理一帧数据平均执行时间对比如表1所示。

3、Matlab仿真实现

I T U-T给出的G.7 2 9 A语音编码算法是用C语言实现的,程序虽然采用模块化的处理,但是程序的编制仍较为复杂,而且用C语言进行绘图和仿真有很大的局限性,不利于对G.72 9A算法的结果进行分析。而Ma t l a b具有强大的科学计算能力、简便的绘图功能、可视化的仿真环境,并包含信号处理工具箱、通信工具箱以及小波分析工具箱等等,更适合对语音信号进行分析处理[15]。

图3所示的是一段发音的原始语音信号和经过G.729A处理后的语音信号对比图,图4是该语音信号的局部波形比较图。从图3可以看出,整体来看采用G.729A处理的语音信号和原始语音信号差距比较细微,波形大致保持一致,但在某些细节部分能看出明显的不同。截取其中一段语音信号来进行分析,从图4可知,经G.7 29 A处理后的语音信号幅度有变化,高频细节有损失,语音信号波形有钝化,但不影响通话质量。

5 结束语

本文介绍了G.7 2 9 A算法的基本原理,以及所用DSP芯片的结构特性,并重点介绍了源代码在C代码级和汇编级的优化问题,最终达到优化算法的目的。G.729A编解码标准和DSP的结合可形成性价比很高编解码系统,可应用于IP电话、卫星通信、多媒体通信等领域,具有很高的应用前景。

摘要:本文主要是对G.729A语音编解码算法和定点数字信号处理芯片TMS320C55x的研究,提出了简化算法和优化代码的方案。结果表明,得到了预期的8Kb/s的低码速率、较低的算法延时和极高的语音音质。

G.729ab 篇4

一、线性预测编码(LPC)原理[1]

线形预测的基本思想是语音信号的每个取样值s(n)可以由过去若干个取样值的线形组合来逼近,通过使实际语音信号取样值和线形取样值之间的均方误差最小来决定唯一一组的线形组合的加权系数(预测器系数),传送信息就由原来的直接传送语音信息变成只需要传送其预测器系数,大大降低语音速度。

线形预测滤波器使用过去P个样本值来预测当前的采样值s(n):

二、线性预测的求解

常见方法有自相关法、协方差法[2]。两者都分成两步,先计算相关矩阵,再求解一组线形方程。其差别在于自相关法由于使用窗函数来截取,人为地平滑了s(n),从而引来误差,所以求得的预测系数精度不高;而斜方差法由于没有限制s(n)的长度,又不采用窗函数,所以精度高,但却没自相关法稳定。下面介绍下自相关法。

假定s(n)在0≤n≤N-1以外为零(N长加窗截取)。截取序列为:s(0),s(1),…,s(N-1);

自相关序列估计定义为

r(i)的这种估计值保留了信号s(n)自相关序列的特征,满足偶函数的特征,常采用递推算法求解,常见的有莱文逊-杜宾(Levinson-Durbin)[3]

三、基于G729标准的matlab实现

在编码进行之前,要先加入两个预处理功能:信号定标和高通滤波[4]。所得到的滤波器给出为:

短期分析和合成滤波器是建立在10阶线性预测(LP)滤波器的基础上。

LPC分析窗由两部分组成:第一部分是一半海明窗,第二部分是四分之一周期的余弦函数。这个窗给出为:

在LPC的分析中有5ms是预留时间,它意味着要从未来的语音帧中预取40个样点。这样转化为在编码级中有5ms的超额算法延迟。LP分析窗从过去的语音帧中加入120个样点,从现在的语音帧中加入80个样点,从未来的语音帧中加入40个样点。

是用来计算自相关函数:

再用Levinson-Durbin算法计算得出。其matlab程序为:

%按照指定的要求分帧

加窗后得到的如图

四、结语

LPC提供了一组简洁的语音信号模型参数,能较精确地表征了语音信号的频谱幅度,有效的降低语音信号的数码率,实现有效的语音合成,而分析它们所需的运算量相对来讲却不是很大,成为语音信号处理的有力工具。而1996年ITU-T G.729协议是现代通信广泛采用的标准,利用matlab来实现能直观看出效果,为在DSP上实现打下良好基础。

参考文献

[1]、《语音编码》,王炳锡,西安电子科技大学出版社,2003.4.

[2]、《数字语音-语音编码实用教程》,李昌立吴善培,人民邮电出版社2004.11.

[3]、拉宾纳L R,谢弗R W.语音信号数字处理[M].北京:科学出版社,1983.

G.729ab 篇5

G.729A是ITU-T制定的使用共轭代数码本激励线性预测 (CS-ACELP) 的语音编码标准G.729的简化版本, 改进后的算法复杂度降低很多, 而语音质量下降很少, 而且两者在编解码器的比特流完全兼容, 可以互通。所以在降低复杂度的应用中, 经常用G.729A来代替G.729。但当G.729A应用于一些对硬件要求比较苛刻的领域时, 其编码复杂度还是比较高。

从整个G.729A编码器功能实现来看, 编码器的功能模块主要有预处理、自相关运算和加窗、LPC系数求解、LPC和LSP的互变换、感觉加权、基音搜索 (开环基音分析和闭环基音搜索) 、固定码本搜索、自适应码本和固定码本增益的计算和量化, 存储器的更新等方面。

通过对各个模块运算量的分析, 编码器的运算峰值主要集中在LPC和LSP的互变换、基音搜索和固定码本搜索这3个部分, 占用了60%以上的时间, 而基音搜索占其中一半左右, 因此降低基音搜索的计算量可以有效地改善其复杂度, 本文主要从开环基音分析和闭环基音搜索两个方面进行优化改进, 来达到降低复杂度的目的。

1 开环基音分析

1.1 开环基音分析过程

开环基音分析每80帧进行一次, 首先进行开环基音分析搜索得到最佳开环延时Top, 在后续的自适应码本搜寻中, 将第一子帧的基音延时T1的搜寻范围限定在Top周围小范围的延时值内 (六个样点) , 而第二子帧的延时T2的搜寻范围又在第一子帧选择的延时的周围, 最终求得两子帧的基音延时。G.729中第一级搜索的方法是通过寻求加权语音信号xw (n) 的最大自相关系数来进行计算的, 相关系数的表达式如下:

R (L) =n=079xw (n) xw (n-L) L=20, 21, , 143 (1)

由于相关系数的求解对每个L均独立, 且上述相关系数求解的目的是为了进行比较, 求出最大值, 最后再将最大值归一化, 因此, 适当降低累加次数对最终结果影响不大, G.729A将累加次数从80次降低到40次, 粗化搜索后的表达式如下:

R (L) =n=039xw (2n) xw (2n-L) L=20, 21, , 143 (2)

为了避免基音的倍频, G.729和G.729A将L的取值范围分为三组, 分别选择其中最大的做归一化处理, 最后得到选择的延时L即最佳开环延时。

1.2 开环基音分析的优化

G.729和G.729A采用的搜索都是对L∈ (20, 143) 逐个进行的, 对应的基音频率为55Hz到400Hz, 而G.729A只是对每次搜索而进行的相关运算减半, 降低了精度但是运算量仍比较大, 本文对其采用的方法进行改进, 将抽取引入到本算法中的开环基音分析中, 使其在保持一定搜索精度的同时降低运算量。其具体实现步骤如下。

①对感觉加权后的语音信号xw (n) 进行4∶1抽取, 抽取前用1kHz截止频带的3阶椭圆低通滤波器对加权信号进行滤波, 最终获得抽样信号x4w (n) 。

ΗL=0.0357081667-0.0069956244z-1+0.0357081677z-2+0.0357081667z-31-2.34036589z-1+2.011900119z-2-0.614109218z-3 (3)

②针对抽样信号x4w (n) 在L∈ (5, 35) 范围内进行逐个搜索, 通过下面的表达式计算其相关最大值粗略估计出其基音周期:

R (L) =n=019x4w (n) x4w (n-L) L=5, 6, , 35 (4)

同时为了避免出现倍频, 在3个范围内寻找, 范围i=1∶20, 21, …, 35;范围i=2∶10, 11, …, 19;范围i=3∶5, 6, …, 9。保留最大的R (t1) (i=1, 2, 3) , 与G.729一样, 计算归一化值为:

R (ti) =R (ti) n=019x4w (n-ti) i=1, 2, 3 (5)

在三个归一化值内, 将较低范围的时延值优先选出。这是通过较长时延值加权完成的, 其方法如对G.729最佳开环时延确定的方法一致, 选择其中Lop为作为下一步搜索的index。

③针对原来的感觉加权后的语音信号xw (n) , 在L∈ (4*index-3, 4*index+3) 范围内逐个搜索, 选择使式 (1) 最大的L即为寻找的时延, 则L即为开环基音的预测值。

由于进行了信号的抽取, 在第二步将搜索的点数降低为原来的1/4, 同时每次需要进行比较判距的乘加数也因为抽取而降为原来的1/4, 虽然在第一步有4∶1信号抽取的计算和第三步进行7次搜索的计算, 但总体上大大降低了搜索运算量。G.729A与G.729相比搜索点数相同, 只是每次计算的步长为2, 搜索运算量降低了一半。如表1所示, 其中改进算法的搜索运算量只包括第二步31个点和第三步7个点的搜索。

本文通过仿真分析验证此方法的可行性:开环基音分析是每帧10ms进行一次, 在这里选取一段话音的某一30ms加权语音信号, 选取最后10ms为当前分析帧, 图1表示的是加权语音信号4:1抽取前后的对比, 从图中可以看出语音信号依然保持着抽取前的主要信息;图2表示的是对抽取前后的加权语音分别进行开环基音估计的对比, 其中搜索范围分别被分成了三段, 从图中可以看出语音自相关后的峰值基本保持一致。按上述搜索过程进行分析对比, 抽取后的加权语音依然能够准确地搜索出基音延时。以在范围i=2∶40, 41, …, 79和i=2∶10, 11, …, 19中的搜索为例, 两者分别在52点和index=13点间隔处取得最大值, 而且后者还要在 (4*index-3, 4*index+3) 即 (49, 55) 之间进行补充搜索, 可以看出52点也恰好在此范围内, 此方法在降低搜索复杂度的前提下依然可以准确地搜索到所需要地基音延时。

2 闭环搜索

2.1 闭环搜索过程分析

从G.729A CS-ACELP语音压缩算法的框图中提取CELP模型的自适应码本闭环搜索的示意图如图3所示。

其中, 合成滤波器Η (z) =1A (z) 和感觉加权滤波器W (z) =A (z) A (z/r) 采用的是基于G.729A改进后的简化参数。在闭环搜索过程中, 找出最佳的基音合成滤波器参数, 可以使话音质量得到显著改善。

设自适应码本的输入为零激励 (即自激励) , 则输出为:

u (n) =βu (n-L) β即为增益GP (6)

则加权合成语音信号为:

x^w (n) -x^0 (n) +k=0nu (k) h (n-k) (7)

其中, x^0 (n) 为加权合成滤波器W (z) H (z) 的零输入响应, h (z) 是它的冲激响应。原始语音信号与合成语音信号之间的加权误差为:

εw (n) =xw (n) -x^w (n) =x (n) -k=0nu (k) h (n-k) (8)

其中, x (n) =xw (n) -x^0 (n) 称为自适应码本的目标信号, 它是原始加权语音信号和加权合成滤波器的零输入响应之差。

在G.729原算法中, 闭环基音搜索的准则就是使原始语音与重构语音之间的方均加权误差最小, 由于每子帧有40个样点, 则加权均方误差为:

Ew=n=039[x (n) ]2-[Ν=039x (n) yL (n) ]2n=039[yL (n) ]2 (9)

其中, yL (n) =βk=0nu (k-L) h (n-k) yL (n) 为延时L的加权合成滤波器的输出。

L的取值范围内 (搜索范围限制在预选值附近) 选择最佳延时L使式 (9) 右边第二项设为R (L) =n=039x (n) yL (n) n=039[yL (n) ]2最大, 即可使加权误差Ew最小。

在G.729A中, 为了简化计算, 搜索时只要使R (L) 的分子最大化就可以了, 即:

R (L) =n=039x (n) yL (n) (10)

可以看出分子分母中都包含了复杂的卷积运算yL (n) =βk=0nu (k-L) h (n-k) , 而要确定最佳码矢需要每子帧频繁地计算复杂的卷积运算, 因此复杂度比较高。

2.2 闭环搜索优化

文中提出一种改进的闭环基音搜索算法, 该算法思想源于Lucio Martins da Silva和Abraham Alcaim提出的对CELP语音编码模型进行的改进。由于CS-ACELP语音压缩算法也是基于CELP模型, 通过对CS-ACELP语音压缩算法闭环基音搜索原理研究分析, 从中提取CELP模型, 从而将其改进思想引入CS-ACELP语音压缩算法中, 从而实现降低自适应码本搜索的运算量, 提高自适应码本的搜索速度的目的。图4即为从图1 CS-ACELP语音压缩算法的框图中提取CELP模型图3的等价变换, 将感觉加权滤波器W (z) =A (z) A (z/r) 的位置调整一下, 得到图4, 这样得到新的加权合成滤波器W (z) Η (z) =A (z) A (z/r) 1A (z) =1A (z/r)

改进的自适应码本搜索算法是通过对图4CS-ACELP语音压缩算法的原始语音CELP模型合成分析模型进行改进来实现的。其原理阐述如下:由于加权合成语音信号为:x^w (n) =x^0 (n) +k=0nu (k) h (n-k) , 等式右边第一项是零输入响应, 第二项是自适应码本激励的响应, 本文将零输入响应提出, 将自适应码本激励的响应的滤波器左移, 则图4等价变换后得到图5。由于合成序列u (n) 的过去值存储自适应码本的缓冲器中, 缓冲器的尺寸为Lmax, 其中-Lmax≤n≤-1, Lmax为最大时延, 其对应的时间间隔小于20ms。总的来说, LPC系数一般一帧语音更新一次, 在G.729A中每10ms进行一次分析, 所以在这个时间间隔内起变化是缓慢的, 而且和合成语音信号时自适应码本所对应的时延L和增益GP也是变化缓慢的, 因此, 可以将用图6模型代替图5模型并不会引起语音质量的下降, 本文通过1A (z/r) 的零输入响应前移, 两个模型也可以看成近似等价的。

通过改进的自适应码本搜索模型中可以看出, 自适应码本在搜索最佳激励时, 候选的码矢量不用经过任何滤波器, 省去了原来复杂的卷积运算。而对固定码本搜索, 改进模型与原始模型中的搜索过程是相同的, 所以并不改变固定码本中的激励矢量对合成语音的作用。

本文通过数学推导来体现验证这一过程。

改进后原始语音信号与合成语音信号之间的加权误差可重新表示为:

εw (n) =x (n) -βu (n-L) (11)

按上述计算方法可得:

Ew=n=039[x (n) ]2-[n=039x (n) u (n-L) ]2n=039[u (n-L) ]2 (12)

要求加权误差Ew最小, 即求R″ (L) 最大

R (L) =n=039x (n) u (n-L) n=039[u (n-L) ]2 (13)

综上所述, G.729, G.729A和改进的算法每子帧自适应码本搜索最佳激励所需要的搜索过程分别是求R (L) 、R (L) ′、R (L) ″的最大值。由于搜索范围限制在预选值附近, 假使每子帧进行L次搜索, 它们分别所需要的乘加运算约为L* (780+780+2) =L*1562、L*780、L* (40+40+2) =L*82。如表2所示。因此可以看出改进算法的引入, 每子帧自适应码本搜索运算都省去了滤波器进行的卷积运算, 从而大大减少了运算量。

3 实验仿真及结论

分别对改进前后算法进行仿真分析。编码算法中输入经过8kHz采样16bit量化的PCM语音信号, 本文采用录有男声“装备指挥技术学院”的一段话音。对解码后的语音质量采用客观和主观两种评价方法, 客观评价采用语音信号的总信噪比, 其表达式表示为:

SΝR=10log10n=1Νs2 (n) n=1Ν[s (n) -s (n) ]2 (14)

式 (14) 中s (n) 和s′ (n) 分别为编码前和解码后的语音信号, N为这段语音的总点数。主观测试采用国际通用的主观评价方法MOS可评分为3.5左右, 满足通信质量的要求。表3分别对比了G.729A和改进算法后的测试结果, 表明采用改进的算法所产生的语音信号质量稍有所下降。

图7为G.729A和改进算法复原的语音波形对比图, 图7上部分为G.729A复原的波形图, 下部分为改进的算法复原的波形图。经过压缩算法处理后的语音波形依然保留原始语音的主要信息。通过试听和对语音信号的波形进行仿真对比和主客观的测试的结果表明, 改进后的算法在编码性能上与原来算法相差不大, 但通过表1和表2可知算法复杂度却大大降低了。

4 结束语

文中在对G.729A基音搜索原理分析研究的基础上, 分别从开环基音分析和闭环基音搜索两个方面进行了改进。通过分析表明改进后的算法在复杂度方面有了很大的降低, 而仿真结果表明改进后的算法与原有语音信号的质量主观区别不是很大, 因此可将此改进算法应用到对复杂度要求比较苛刻的场合去。

摘要:为了进一步降低G.729A复杂度, 提出了一种高效的基音搜索算法。在对基音搜索的两个环节开环基音分析和闭环搜索进行研究的基础上, 分别采用了4:1抽取来减少开环基音分析的搜索范围和改进闭环基音搜索模型的方法。该算法降低了基音搜索时所需要的运算量, 在总体上降低了原算法的复杂度。最后通过仿真实验, 验证了所提方法的有效性。

关键词:G.729A,复杂度,基音搜索

参考文献

[1]ITU-T Recommendation G.729 Annex A:Coding of Speech at 8kbit/susing Conjugate-Structure Algebraic-Code-Excited Linear-Prediction (CS-ACELP) Annex A:Reduced complexity 8kbit/s CS-ACELPspeech codec[Z].1996, 11.

[2]ITU-T Recommendation G.729:Coding of Speech at 8kbit/s UsingConjugate-structure Algebraic-code-excited Linear-Prediction (CS-ACELP) [Z].1996.

[3]Hwang SH.Computational Improvement for 6.729 Standard[J].E-lectronics Letters June 22, 2000, 36 (13) :1163-1164.

[4]王炳锡, 王洪.变速率语音编码[M].西安:西安电子科技大学出版社, 2004.

[5]赵晓群.数字语音编码原理[M].北京:机械工业出版社, 2007.

[6]Alcaim A, Silva L M.Modified CELP model with computationally ef-ficient adaptive codebook search[J].IEEE Signal Processing Let-ters, 1995, 2 (3) :44-45.

G.729ab 篇6

在需要降低复杂度的应用中,经常用G.729A来代替G.729。但当G.729A应用于一些对硬件要求比较苛刻的领域时,其编码复杂度还是比较高[1]。通过对各个模块运算量的分析,自适应码本搜索模块占用了很高的运算量(约30%)[4],因此降低此模块搜索的计算量可以有效地改善其复杂度,本文主要从这个方面进行优化改进,来达到降低复杂度的目的。

1 自适应码本搜索原理[3,4]

自适应码本搜索,目的是确定最佳基音预测增益和基音延时。精确确定语音信号的基音周期比较困难,计算量也比较大。为了降低复杂度,自适应码本搜索采用开环与闭环搜索结合的方式。首先计算开环基音分析,在基音周期附近所有可能的范围内找到一个粗略的估计值,然后通过闭环基音搜索最终确定基音周期。

从G.729A CS-ACELP语音压缩算法的框图中提取CELP模型的自适应码本闭环搜索的示意图如图1所示。

其中合成滤波器采用的是基于G.729A改进后的简化参数。在闭环搜索过程中,找出最佳的基音合成滤波器参数,可以使话音质量得到显著改善。

设自适应码本的输入为零激励(即自激励),则输出为

加权合成语音信号为

其中为加权合成滤波器W(z)H(z)的零输入响应,h(n)是它的冲激响应。原始语音信号与合成语音信号之间加权误差为:

其中称为自适应码本的目标信号,它是原始加权语音信号和加权合成滤波器的零输入响应之差。

在G.729原算法中,闭环基音搜索的准则就是使原始语音与重构语音之间的方均加权误差最小,由于每子帧有40个样点,则加权均方误差为:

在L的取值范围内(搜索范围限制在预选值附近)选择最佳延时L使式(4)右边第二项设为最大,即可使加权误差Ew最小。

在G.729A中,为了简化计算,搜索时只要使右边第二项的分子最大化即可,

可以看出分子分母中都包含了复杂的卷积运算,而要确定最佳码矢需要每子帧频繁地计算复杂的卷积运算,因此复杂度比较高。

2 算法的改进优化

这里提出一种改进的闭环基音搜索算法,该算法思想源于Lucio Martins da Silva和Abraham Alcaim提出的对CELP语音编码模型进行的改进[5]。CS-ACELP语音压缩算法也是基于CELP模型,通过对CS-ACELP语音算法闭环原理的研究分析,从中提取CELP模型,然后将其改进思想引入CS-ACELP语音压缩算法中,从而实现降低自适应码本搜索的运算量,提高自适应码本搜索速度的目的。图2即为从图1CS-ACELP语音压缩算法的框图中提取CELP模型图1的等价变换,将感觉加权滤波器的位置调整一下,得到如下图所示,新的加权合成滤波器

改进的自适应码本搜索算法是通过对图2CS-ACELP语音压缩算法的原始语音CELP模型合成分析模型加以改进来实现的。其原理阐述如下:由于加权合成语音信号为等式右边第一项是零输入响应,第二项是自适应码本激励的响应,在这里将零输入响应提出,将自适应码本激励的响应的滤波器左移,则图2等价变换后如图3所示。由于合成序列u(n)的过去值存储于自适应码本的缓冲器中,缓冲器的尺寸为Lmax,其中Lmax为最大时延,其对应的时间间隔小于20ms。总的来说,LPC系数一般一帧语音更新一次,在G.729A中每10ms进行一次分析,所以在这个时间间隔内起变化是缓慢的,而且和合成语音信号时自适应码本所对应的时延L和增益GP也是变化缓慢的,因此,用图4模型代替图3模型并不会引起语音质量的下降,在这里将通过的零输入响应前移,两个模型也可以看成近似等价的。

图4改进的语音压缩算法模型中的CELP模型(参见右栏)

从改进的自适应码本搜索模型中可以看出,自适应码本在搜索最佳激励时,候选的码矢量不用经过任何滤波器,省去了原来复杂的卷积运算。而对固定码本搜索,改进模型与原始模型中的搜索过程是相同的,所以并不改变固定码本中的激励矢量对合成语音的作用。下面通过数学推导来验证这一过程:

改进后原始语音信号与合成语音信号之间的加权误差可重新表示为:

按上述计算方法可得

综上所述,G.729、G.729A和改进的算法每子帧自适应码本搜索最佳激励所需搜索过程分别是求的最大值。由于搜索范围限制在预选值附近,假使每子帧进行L次搜索,它们分别所需要的乘加运算约为L*(780+780+2)=L*1562、L*780、L*(40+40+2)=L*82。因此可以看出改进算法的引入,每子帧自适应码本搜索运算都省去了滤波器进行的卷积运算,从而大大减少了运算量。

3 仿真分析

分别对改进前后的算法用Matlab进行仿真。编码算法中输入经过8kHz采样16bit量化的PCM语音信号,本文采用录有男声"装备指挥技术学院"的一段话音。对解码后的语音信号进行主客观的评价。客观评价采用语音信号的总信噪比,其表达式表示为

式(9)中s(n)和s'(n)分别为编码前后的语音信号,N为这段语音的总点数。表1分别对比了G.729A和改进算法后的测试结果,表明采用改进后的算法所产生的语音信号总信噪比稍有所下降。

主观测试结果表明,改进前后的算法所复原的语音信号听觉效果变化不大。图5G.729A和改进算法复原的语音波形对比图,上图为G.729A复原的波形图,下图为改进的算法复原的波形图。通过主客观的测试的结果可以看出,改进后的算法在编码性能上与原来算法相差不大,但复杂度却大大降低了。

图5 G.729A和改进算法复原的语音波形对比图(参见下页)

4 结论

本文在分析研究G.729A自适应码本搜索原理的基础上,从降低复杂度的角度进行了改进。分析表明,改进后的算法在复杂度方面有了很大的降低,而仿真结果表明,改进后的算法与原有语音信号的质量主观区别不是很大,因此可将改进算法应用到对复杂度要求比较苛刻的场合去。

参考文献

[1]ITU-T Recommendation G.729 Annex A:Coding ofSpeech at 8kbit/s using Conjugate-Structure Algebraic-Code-Excite Linear Prediction(CS-ACELP)Annex A:Reduced complexity 8kbit/s CS-ACELP speechcodec[S].1996,11.

[2]王炳锡,王洪.变速率语音编码[M].西安:西安电子科技大学出版社,2004.6.

[3]Alcaim A,Silva L M.Modified CELP model withcomputationally efficient adaptive codebook search[J].IEEE Signal Processing Letters,1995,2(3):44-45.

[4]许丽红,阎海鹰,等.G.729 CS-ACELP语音编码算法的优化及其DSP实现[J].上海大学学报(自然科学版)2001.7(1):13-17.

[5]Hwang S H.Computational Improvement for G.729Standard[J].Electronics Letters 2000,36(13):1163-1164.

[6]林裕斌.ITU-T G.729和G.723.1语音编解码之快速演算法[D].台湾:国立成功大学,2002.

【G.729ab】推荐阅读:

上一篇:医学科技查新下一篇:特殊学校

本站热搜

    相关推荐