ITU-T G.729算法及其实时实现
2009-04-21
作者:李锦宇 罗 鑫 王仁华
摘 要:G.729编解码算法,实时实现的G.729系统的软件设计和硬件设计。在ADSP-2181上实现的G.729编解码器,已经通过了ITU-T G.729的全部测试矢量,并且已经在数字语音记录仪和H.323网上多媒体通信系统中得到推广应用。
关键词:G.729协议 ADSP-2181 接口模块 IDMA口
G.729协议[1]是由ITU-T的第15研究小组提出的,并在1996年3月通过的8Kbps的语音编码协议。
G.729协议使用的算法是共轭结构的算术码本激励线性预测(CS-ACELP),它基于CELP编码模型[2]。由于G.729编解码器具有很高的语音质量和很低的延时,被广泛地应用在数据通信的各个领域,如IP phone和H.323网上多媒体通信系统等。
针对实时实现G.729的一些难点,我们提出了解决的方法。目前,我们已经在Analog Device的定点数字处理芯片ADSP-2181上实时实现了符合ITU-T G.729
编解码器的全部功能,该编解码器占用了22MIPS的运算量。我们在ADSP-2181上实现的G.729编解码器,已经通过了ITU-T G.729的全部测试矢量,并且已经在数字语音记录仪和H.323网上多媒体通信系统中进行了推广应用。
1 G.729协议编解码算法介绍
1.1 G.729编码算法介绍
电话线路上的模拟语音信号,经话路带宽滤波(符合ITU-T G.712建议)后,被8kHz采样,量化成16bit线性PCM数字信号输入到编码器。该编码器是基于线性预测分析合成技术,尽量减少实际语音与合成语音之间经听觉加权后差分信号的能量为准则来进行编码的。编码器的结构框图如图1所示,其主要部分有:
·线性预测分析和LPC系数的量化;
·开环基音周期估计;
·自适应码本搜索;
·固定码本搜索;
·码本增益量化。
下面分别描述这五部分的主要技术。
·线性预测分析与LPC系数的量化
首先对信号进行加线性预测分析窗,分析窗由两部分组成。第一部分是半个汉明窗,第二部分是四分之一个余弦信号。将加窗后的语音信号通过Levinson-Durbin算法获得线性预测滤波器系数ai,i=1……10。由于线谱对参数比线性预测系数具有更好的内插特性和量化特性[3], G.729将LPC参数转换成相应的线
谱对参数,最后对线谱对参数进行量化。
·开环基音分析
为了减少自适应码本搜索的复杂度,需要计算开环基音Top,使自适应码本搜索在开环基音值附近进行。基音值的范围在18~145个样本点之间。
·自适应码本搜索
G.729对每个子帧进行闭环基音搜索,它通过最小化原始语音信号和重构语音信号的加权均方误差来进行闭环基音搜索。对子帧1的闭环基音T1的搜索是局限在开环基音Top的一个小范围内,对子帧2的闭环基音T2的搜索是局限在闭环基音T1的一个小范围内。这样可以减少基音搜索的复杂度。
·固定码本搜索
G.729固定码本矢量含有四个非0脉冲,每个脉冲的幅度要可以是+1或-1。通过最小化加权语音信号和加权重构语音信号的均方误差来进行固定码本的搜索。
·增益量化
G.729对自适应码本增益和固定码本增益采用二级共轭结构码本进行矢量量化。在码本搜索时,采用预搜索策略,使得运算量只为全搜索算法的1/4。
1.2 G.729解码算法介绍
G.729的解码也是按帧进行的,主要是对符合G.729协议的码流进行解码,得到相应的参数,根据语音产生的机理,合成语音。解码的方框图如图2所示,其主要部分为:参数解码;后滤波处理。
G.729解码过程如下。
·参数解码
首先解码得到线谱对参数,并将线谱对参数转换为线性预测系数。然后解码出基音周期,获得自适应码本矢量v(n)。解码出固定码本矢量的四个脉冲的位置和符号,计算出固定码本矢量c(n)。解码出固定本预测增益gc和固定码本增益,接着得到激励信号。最后将激励信号
u(n)输入到线性预测合成滤波器中,计算出重构语音。
·后滤波处理
后滤波处理主要是自适应后滤波。自适应后置滤波器是由三个滤波器级连而成:长时后置滤波器Hp(z),短时后置滤波器Hf(z),频谱倾斜补偿滤波器Ht(z),后面接着进行一个自适应增益控制过程。后置 滤波器的系数每一个子帧更新一次。后置滤波能够有效地改善合成出的语音质量。
2 G.729编解码器的实现
我们在Analog Device的定点数字处理芯片ADSP-2181[4][5]上实时实现了符合ITU-T G.729的全部功能,进行编解码总共用了22MIPS(ADSP-2181处理速度为33MIPS)。实时实现了G.729的编解码功能,主要有以下的难点。
·数据在DSP中的安排。在DSP中只要是声明的变量,DSP的连接程序就会分配数据空间。如果我们象C语言编程那样定义局部变量,就会浪费大量的存储空间。
·数据精度的处理。在16位的定点信号处理芯片上实现一些浮点算法时,为了使运算速度加快,往往要针对定点芯片的特点,用定点数来表示浮点数。虽然速度提高了,但是很可能导致运算精度不够。
·有限计算资源的利用。ADSP2181只有33MIPS,而且不能使所有的MIPS都用来实现G.729的编解码功能。
·DSP高速运行时,DSP与主机的数据交互。
·语音信号和编解码缓冲区的维护。这些缓冲区至少都有两者要去存储,如语音信号缓冲区, 一方面语音编码模块要调用,另一方面采集中断程序也要调用它。而在语音编码模块调用的过程中,该缓冲区不应该被其它模块所改变,所以中断程序不应该此时去存储这个缓冲区,这就存在着矛盾。
2.1 软件设计
软件设计主要包括三个部分。
· 命令解释器
命令解释器主要是用于解释主CPU发来的各种命令,如发送或接收编解码数据、查询编解码状态以及启动、停止编解码操作等。该模块不直接与主CPU打交道,而是通过接口功能模块,间接实现与主CPU的数据信息交换。
· G.729数据引擎
我们在ADSP-2181上完成了G.729的实时编/解码工作。
ADSP-2181不仅包含了ADSP-2100系列的基本结构(三个运算单元、数据地址发生器和一个程序序列器),还含有两个串行口、一个16位的内部IDMA口,一个8位的BDMA口、一个可编程定时器、标志输入输出(Flag I/O)、外部中断能力以及片内程序和数据存储器等周边设备。ADSP-2181片内集成了共80K字节的存储器,它们分别是16K字(24bit)程序存储器和16K字(16bit)的数据存储器,大量的片内存储器使得复杂的G.729编解码算法能够全部放入ADSP-2181片内,无须增加任何的片外RAM,简化了硬件设计和接口。
· 接口功能模块
该模块实现ADSP-2181与主CPU的数据实际交换工作。该模块包括DSP的主控程序和数据传输两部分。DSP的主控程序主要负责不断将采集到的语音数据分帧,送入编码器,并将接收到的码流分类后送入解码器模块。数据传输部分负责采集数据和与主CPU的数据交换。
2.2 硬件设计
本系统考虑了各CPU之间的数据交换与协调等问题。ADSP2181具有一个16位的IDMA口,在处理器全速运行的情况下,ADSP-2181可以自动完成IDMA口的接收和发送数据,这为系统的设计带来了很大的便利。利用ADSP-2181的这个性质,我们通过IDMA口来实现ADSP-2181与主CPU的数据交互。
我们设计了ADSP-2181与PC机ISA总线接口的主从系统。在这个主从系统中,PC机为主CPU,ADSP-2181为从CPU。在启动时,由PC机通过IDMA口将程序装载入ADSP-2181内部存储器中。在ADSP-2181全速运行时,主机可以查询从机的运行状态、读取压缩后的G.729码流,也可以送入待解码的G.729码流等。
在该主从系统中,PC机通过ADSP-2181的IDMA口来读写它的内部存储器。PC总线通过GAL译码,形成,IACK信号,与ADSP-2181的IDMA口连接,这样就实现了在ADSP-2181全速运行的情况下,PC机仍能访问到ADSP-2181内部存储器。
图3是主从系统中的ADSP-2181功能与接口的框图。语音信号由ADSP1847采集,通过ADSP-2181的串口0送入到ADSP-2181进行编码。编码数据通过IDMA口送到主机进行存储。需要解码的数据从主机由IDMA口送到ADSP-2181进行解码,解码后获得的语音信号通过串口0送至ADSP1847。
2.3 难点的解决
数据在DSP中的安排。维护好一张变量表,每次进入一个模块时,首先使用已经分配但暂时不用的变量。只在不够的情形下,再去分配额外的变量,同时将这些新分配的变量计入到变量表中,供其它模块使用。另外维护好一个局部变量堆栈,使得各个模块的内部局部变量分配在堆栈中,当从该模块退出时,就从堆栈中弹出这些局部变量,释放空间。
数据精度的处理。对精度要求比较高的地方,将计算的中间变量采用32位来表示,运算结束后,再转换成16位表示,这样指令条数增加不多,但精度却大大提高了。在某些精度要求比较高的模块,采用尾数和指数来表示浮点数,自己编写一套指数和尾数的运算库,由于尾数和指数表示法有足够大的精度范围,完全满足要求。但只能在少许地方采用这种方法,否则运算量就会上去,给实时实现带来困难。
有限计算资源的利用。利用ADSP强大的多功能指令可以非常好地利用有限计算资源。
DSP高速运行时,DSP与主机的数据交互。由于ADSP-2181具有一个16位的IDMA口,在处理器全速运行的情况下,ADSP-2181可以自动完成IDMA口的接收和发送数据,这为系统的设计带来了很大的便利。利用ADSP-2181的这个性质,我们通过IDMA口来实现ADSP-2181与主CPU的数据交互。
语音信号和编解码缓冲区的维护。本系统的数据交互都是采用双缓冲的工作方式。双缓冲的好处在于数据的交互不会影响到其他工作的正常进行。
本系统的数据采集与播放采用双缓冲的工作方式。采集时采用cod_ad和cod_work两个缓冲区,播放时采用decod_ad和decod_work两个缓冲区。cod_ad用于ADSP-2181的串口数据采集,cod_work用于ADSP-2181的编码。当cod_ad采完一帧数据后与cod_work互换。decod_ad用于ADSP-2181的串口数据播放,decod_work用于ADSP-2181的解码。当播放完一帧数据后,decod_ad与decod_work互换。采集与播放程序放在ADSP-2181的中断服务程序中。本系统只开放ADSP-2181的接收中断,ADSP-2181每接收一个数据,同时就播放一个数据。
另外G.729的编码器的编码数据和解码器的解码数据都有两个缓冲区,缓冲区的工作原理与数据采集和播放的双缓冲区的工作原理相同。
综上所述,ITU-T的G.729协议是一个ITU-T的8kbps语音编解码协议,它具有高音质和低延时的特点。软件设计主要包括三个部分:命令解释器、G.729数据引擎、接口功能模块。我们用ADSP-2181实时实现了G.729协议,在ADSP-2181的数据采集/播放和ADSP-2181与主CPU接口的数据交互方面都采用了双缓冲方式。硬件设计主要是通过ADSP-2181的IDMA口,来实现主CPU与ADSP-2181的数据交互。
针对实时实现G.729的一些难点,我们提出了一系列解决的方法,通过这些解决方法,我们已经在Analog Device的定点数字处理芯片ADSP-2181上实时实现了符合ITU-T G.729的全部功能,并且已经通过了ITU-T G.729的全部测试矢量。该编解码器已经在数字语音记录仪和H.323网上多媒体通信系统中推广应用。
参考文献
1 ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Ex-cited Linear-Prediction.International Telecommunication U-nion,1996
2 M.Schroeder and B.Atal.Code-excited linear predicition (CELP):high quality speech at very low bit rates. Proc.IEEE Int.Conf.Acoust.,Speech,Signal Processing,1985, 937-940
3 B.S.Atal,R.V.Cox,and P.Kroon. Spectral quantization and interprolation for CELP coders.in Proc.Int.Conf.A-coust.Speech Sign.Proess.1989,69-72
4 ADSP-2100 Family User's Manual,Analog Devices
5 ADSP-2171&81 User's Manual,Analog Devices