一种G.729语音编解码算法的优化和实现方案
出处:黄 冰,杨召青,吕治国 发布于:2011-06-21 10:37:41
摘 要: 通过分析G.729语音编解码算法和TMS320VC5416的原理,提出了有效优化算法的方案,降低了算法的复杂度,把优化的G.729算法在TMS320VC5416的系统板实现,完成对输入语音或数据的压缩、存储及回放。
多媒体信息技术和网络技术的飞速发展,语音通信技术也在不断地进行更新。语音压缩编码技术在语音通信技术中占据了重要的地位。人们希望用尽可能低的码率获得尽可能好的合成语音质量。在日常的语音通信中,有将近一半的时间是空闲的而没有讲话,始终用一个速率进行语音编解码是对信道资源的一种浪费,于是非连续传输/舒适噪声生成(DTX/CNG)技术应运而生。这种技术实现了变速率语音编解码。 语音编码技术质量的评价可分为主观评价和客观评价。主观评价方法是人对语音质量的真实反映。采用主观测试也是对语音系统的一种可靠的评估。
1 G.729编解码算法的原理
G.729编码方案是电话带宽的语音信号编码的标准,对输入语音性质的模拟信号用8kHz、采样,16比特线性PCM量化。G.729A是ITU推出的语音编码标准G.729的简化版本。语音信号的波形编码力图使重建语音波形保持原始语音信号的波形形状。这类编码器通常将语音信号作为一般的波形信号来处理,它具有适应能力强、语音质量好等优点,但所需用的编码速率高。参数编码通过对语音信号特征参数的提取及编码来降低编码速率,力图使重建语音信号尽可能保持原语音的语意,而重建信号的波形同原语音信号的波形可能会有相当大的差别。这种算法克服了原有波形编码器与声码器的弱点,而结合了它们各自的长处,在4kb/s~16kb/s速率上能够得到高质量合成语音,而在本质上也具有波形编码的优点。G.729所描述的CS-ACELP声码器采用的CELP声码器就属于这类编码器。
CELP是近10年来成功的语音编码算法。CELP语音编码算法用线性预测提取声道参数,用一个包含许多典型的激励矢量的码本作为激励参数,每次编码时都在这个码本中搜索一个的激励矢量,这个激励矢量的编码值就是这个序列的码本中的序号。CELP已经被许多语音编码标准所采用,美国联邦标准FS1016就是采用CELP的编码方法,主要用于高质量的窄带语音保密通信。在编码端,主要进行有线谱对(LSP)参数的量化、基音分析、固定码本搜索和增益量化四个步骤。编码器首先对输入信号(8kHz采样16bit PCM信号)进行预处理,然后对每帧语音信号进行线性预测,得到LPC系数,并把LPC参数转换成LSP参数,对LSP参数进行矢量量化。在接下来的基音分析中,每一帧先搜索到基音时延T的一个候选时延,然后依据候选时延搜索每一帧的基音时延。解码器在每一子帧内,对LSP系数进行内插,并把它们变换成LP系数后,依次进行激励生成、语音合成和后处理工作。
2 算法优化和DSP应用改进
G.729语音编解码系统要求实时性高,需在有限的时间内对外部输入的信号完成指定处理,即信号处理的速度必须大于等于输入信号更新的速度,因此需要进行算法的优化改进。对C语言编写的代码进行优化,同时使用内联指令,又在C程序中嵌入汇编语句,尽量提高信号处理的速度。
DSP是一种独特的,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是值得称道的两大特色。
2.1 算法的优化改进
首先在算法上进行改进,如图1所示,采用一种结合WD-LSP函数并结合次部分码本快速搜索的CS-ACELP语音编码算法,同时采用基于声学心理模型的知觉加权滤波器,使语音编码在不降低语音质量的情况下降低计算复杂度。WD-LSP函数主要用于区分UV-V/S-V的边界。其原理是:如果函数值大于给定的极限值η,则开环基音延迟Top重新估计,否则,开环基音延迟Top用前一帧自适应码本延迟来更新。在第i帧Fi的WD-LSP函数和用于确定开环基音延迟Top的算法如下:
其中LSPi(k)是在第i帧中的k阶LSP系数;wk是加权系数,它用于增强UV-V/S-V边界的WD-LSP函数。为了获取wk,一个包含23 014个UV-V边界和9 519个S-V边界的大型数据库用于估计delta-LSP在UV-V/S-V边界的平方根值(RMS)。因此,WD-LSP用于检测VU-V/S-V边界非常敏感。η是一个设为0.01的极限值。整个计算可节省21%的计算量,经过这种算法前后语音信号如图2所示。
2.2 进行C语言优化
C语言是一种成功的系统描述语言,用C语言开发的UNIX操作系统就是一个成功的范例;同时C语言又是一种通用的程序设计语言,在国际上广泛流行。世界上很多着名的计算公司都成功的开发了不同版本的C语言,很多的应用程序也都使用C语言开发的,它是一种很有发展前途的程序设计语言。C是中级语言。它把语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作, 而这三者是计算机基本的工作单元。
基于G.729标准的声码器终在定点TMS320C5416上实时实现。在定点TMS320C5416内,浮点数是通过将小数点固定在特定位置来表示的,这是定点TMS320C5416的局限之一。为了区分小数的不同值域,使用了Q-格式。不同的Q-格式在于小数点的位置不同,因此整数域也不同。当两个数相乘时,会产生一个特殊的符号位。如:两个Q4数相乘, 需要附加一个左移的操作以去除这个多余的符号位,乘积应该是一个Q9格式的。如果DSP中的FRST位被置位,这个去除多余符号位的移位操作能够自动完成。对于16位数的乘法运算,应该得到32 位的乘积。但是,由于只需要16位的积,该32位乘积中只有高16位被存储下来,积的低16位被丢弃。两个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信号的抽样率。为了充分利用DSP进行信号处理,通过使用MCBSP和DMA把抽样的数据送入DMA的缓冲区中,当缓冲区满时产生中断,DSP把DMA的缓冲区中的数据读入DSP中进行处理,然后把处理过的数据送入DMA发送缓冲区。
3.2 G.729在TMS320C5416的实现
G.729的处理过程中采用块处理技术如图3所示。按照G.729标准,每块(帧)由80个样本组成,初80个样本被存起来,处理过程中有两个操作是同时进行的。在处理块L中数据的同时,存储L+1块的数据。
G.729的解码也是按帧进行的,主要是对符合G.729协议的码流进行解码,得到相应的参数,根据语音产生的机理,合成语音。解码过程主要分为:参数解码;后滤波处理,在G.729软件仿真时发现运算量较大的部分是LSP系数的矢量量化与激励码本(自适应码本和固定码本)的搜索,这两个部分的运算量大约占全部编解码运算量的60%以上。所以在优化过程中,着重对固定码本Acelp_Code_A()、分数基音分析pitch_fr3()、开环基音分析pitch_ol_fast()、增益量化Qua_gain()等占据绝大多数运算量的函数进行了优化;仅仅简化算法不能满足实时要求,还使用了CCS提供的C优化器进行C语言优化,同时还可以使用内联函数和汇编语句。经过以上处理后,输出的信号满足通信要求。通过分析优化前后这些主要模块的速度对照表(如表1所示),可以看出各个主要模块的优化效果是比较明显的。一帧语音信号经过处理前后幅频图(如图4所示),可以看出语音信号经过处理后保持良好的语音质量。
系统运行主要分为四个过程:语音存储,数据编码压缩,数据解压缩,语音回放。将输入的语音数据首先进行抗叠滤波,然后进行模数转换,经DSP采集并存入RAM中,即是语音存储过程;接着运行编码程序,将前面存储的信息进行压缩并存储,这是编码过程;然后进行解码,并将数据存回原来的位置;DSP执行输出指令,将解码后的数据送到数模中,实现模拟输出。
用C5416终实时实现了G.729声码器,用该声码器分别实时播放纯语音文件、语音加背景音乐文件。对重建语音质量的主观测试结果表明,恢复语音保留了很好的说话人特征,合成语音的清晰度和自然度均较好。该声码器性能测试数据如下:编解码一帧平均时钟周期数为1 010 350,CPU时钟频率为160MHz,所以编解码一帧需要7.31ms时间;。以上数据表明,G.729编解码器在C5416上实时实现的技术,可以很好地应用在电话会议、多媒体通信以及采用宽带语音编码的通信系统中。
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,//domainnameq.cn,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
- 揭秘嵌入式 MCU:浮点数据处理难点及应对策略2025/6/20 15:19:07
- 嵌入式通信 UART 大揭秘:经典面试题深度剖析2025/6/12 16:35:20
- 深度解析:STM32 ADC 自身误差来源大揭秘2025/6/6 16:08:32
- 嵌入式数模电中 MOS 管经典知识2025/5/26 16:26:08
- EMMC和NAND闪存的区别2025/4/30 16:52:00