掌桥专利:专业的专利平台
掌桥专利
首页

一种基于ARM平台的多路G729编解码方法

文献发布时间:2023-06-19 16:04:54



技术领域

本发明属于语音编解码技术领域,具体来说是针对嵌入式语音终端或音视频终端,实现了嵌入式平台的多路G.729语音编解码。

背景技术

G.729是国际电信联盟提出的一种高质量低码率语音编码标准,G.729编码器的采样率是8KHz,编码后码率为8kbps。G.729编码标准采用共轭结构代数码激励线性预测(CS-ACELP)编码方案,综合了波形编码与参数编码的优点。由于G.729的低延时、低码率和高质量,G.729编解码算法在IP电话等语音通信中有着广泛的应用。但是,由于G.729算法复杂度较高,当前G.729在语音终端中的应用方式存在较大弊端。

当前G.729在语音终端中的应用方式主要有两种:一是基于专用编解码芯片或TI的DSP实现,但是该种应用方式不仅在芯片选型采购、板卡功耗、结构尺寸、处理器性能等方面受到很大制约,同时不能满足某些领域日益迫切的电子元器件的国产化要求;二是基于通用处理器的G.729软件实现,该种应用方式对处理器性能要求较高,一般应用于大中型服务器,在中低端嵌入式处理器平台即小型化语音终端上应用困难。

发明内容

本发明的目的是解决当前嵌入式平台中G.729语音编解码应用方式的弊端,提供一种基于ARM平台的多路G.729编/解码方法。该方法基于ARM编译器支持的函数内嵌机制、大量的针对数字信号基础运算和相关高级运算的汇编指令、APSR程序状态寄存器等进行了针对标准G.729软件的优化,大幅度提升了该软件的运行效率,使得基于中低端ARM嵌入式处理器平台可运行至少32路的G.729语音编解码,满足了ip电话、音视频会议等多种实际应用需求。

为实现上述目的,本发明采取的技术方案为:

一种基于ARM平台的多路G.729编码方法,包括以下步骤:

(1)对输入信号进行高通滤波和定标;

(2)对每一帧信号进行LP分析,计算LP滤波器的系数,将系数转换成线谱对,同时使用预测型两级矢量量化,量化为18bit;

(3)使用合成-分析的搜索程序来选择激励信号,即按照感知加权的失真测度使原始信号和重构信号之间的误差最小化;

(4)对每一帧计算一次激励参量,包括固定码本参量和自适应码本参量;其中,第一帧使用内插后的LP滤波器系数,第二帧使用没有内插的LP滤波器系数;

(5)在感知加权语音信号的基础上计算开环基音延迟;

(6)通过加权的合成滤波器滤波,得到目标信号;

该方法中,以函数内嵌的方式,运用汇编指令重新实现32位和16位的基础运算和高级运算函数,函数内运算过程中若发生饱和,则自动改变APSR饱和读取函数的返回值。

进一步的,以汇编方式实现方法中的循环过程。

一种基于ARM平台的多路G.729解码方法,包括以下步骤:

(1)根据接收到的比特流,得到15个参数,分别是L0、L1、L2、L3、P1、 P0、S1、C1、GA1、GB1、P2、S2、C2、GA2、GB2;其中,P0、P1、P2是基音延迟参数,GA1、GB1、GA2、GB2是增益参数,S1、C1、S2、C2是固定码本指针参数,L0、L1、L2、L3是LSP指针参数;

(2)根据基音延迟参数P0、P1、P2计算得到自适应码本矢量v(n);

(3)根据固定码本指针矢量S1、C1、S2、C2计算得到固定码本矢量c(n);

(4)根据GA1、GB1、GA2、GB2计算得到自适应码本增益g

(5)计算激励输入u(n):

u(n)=g

(6)根据LSP指针L0、L1、L2、L3计算得到线性预测滤波器系数

(7)根据u(n)和

(8)对s(n)进行后滤波,得到s

(9)s

该方法中,以函数内嵌的方式,运用汇编指令重新实现32位和16位的基础运算和高级运算函数,函数内运算过程中若发生饱和,则自动改变APSR饱和读取函数的返回值。

进一步的,以汇编方式实现方法中的循环过程。

本发明的有益效果是:

本发明创造性的基于ARM编译器支持的函数内嵌机制、大量的针对数字信号基础运算和相关高级运算的汇编指令、APSR程序状态寄存器等进行了针对标准G.729软件的优化,大幅度提升了运行效率,显著降低了G.729软件对于嵌入式处理器的性能要求,解决了采用中低端嵌入式处理器的小型化语音终端难以运行多路G729编解码算法的难题。同时,越来越多的基于ARM架构的国产化处理器的出现也满足了某些领域日益迫切的电子元器件的国产化要求,很好的解决了现有G.729应用方式存在的弊端。

附图说明

图1是G.729编码的原理框图;

图2是G.729解码的原理框图。

具体实施方式

为将本发明的技术方案优势描述的更加清楚,下面结合附图对本发明的具体实施方式作进一步的详细阐述。

一种基于ARM平台的多路G.729编码方法。G.729A编码算法的帧长为10ms,编码器含5ms前瞻,算法时延15ms。编码时每一帧分为两个子帧,每个子帧的长度为5ms即40个样本。如图1所示,G.729A编码器由预处理、线性预测的分析和量化、感知加权、开环基音分析、脉冲响应的计算、目标信号的计算、自适应码本搜索、固定码本结构和搜索、增益的量化以及存储器更新等环节组成。具体步骤如下:

(1)预处理,对输入信号进行高通滤波和定标;

(2)对每一帧进行LP分析,计算LP滤波器的系数,将这些系数转换成线谱对(LSP),同时使用预测型两级矢量量化(VQ)量化为18bit;

(3)使用合成-分析的搜索程序来选择激励信号,即按照感知加权的失真测度使原始信号和重构信号之间的误差最小化;

(4)每帧计算一次激励参量(固定码本参量和自适应码本参量),第一帧使用内插后的LP滤波器系数,第二帧使用没有内插的LP滤波器系数;

(5)在感知加权语音信号的基础上计算开环基音延迟;

(6)通过加权的合成滤波器

一种基于ARM平台的多路G.729解码方法,原理如图2所示。该方法首先从码流中提取LSP系数、两个基音延时、两个码本的向量和增益;然后从LSP系数重建LP滤波器系数,从自适应码本重建激励,将激励通过LP滤波器得到重建语音信号,最后进行后滤波和后处理。具体步骤如下:

(1)根据接收到的比特流,得到15个参数,分别是L0、L1、L2、L3、P1、 P0、S1、C1、GA1、GB1、P2、S2、C2、GA2、GB2。其中P0、P1、P2是基音延迟参数,GA1、GB1、GA2、GB2是增益参数,S1、C1、S2、C2是固定码本指针参数,L0、L1、L2、L3是LSP指针参数;

(2)自适应码本矢量解码模块根据基音延迟参数P0、P1、P2计算得到自适应码本矢量v(n);

(3)固定码本矢量解码模块和P(z)模块根据固定码本指针矢量S1、C1、 S2、C2计算得到固定码本矢量c(n);

(4)增益解码模块和MA码本增益预测模块根据GA1、GB1、GA2、GB2 计算得到自适应码本增益g

(5)激励构成模块计算激励输入u(n)=g

(6)LSP解码模块、内插模块、

(7)LP合成滤波器模块根据u(n)和

(8)后滤波器对s(n)进行后滤波,得到s

(9)经高通和定标模块后输出s

上述方法中,针对特定函数的优化如下:

特定APSR饱和读取函数记录是否发生过计算饱和:

__DSP_INTRINSIC int getQ(void)

以函数内嵌的方式运用汇编指令重新实现32位和16位的基础运算和高级运算函数,函数内运算过程中若发生饱和,可自动改变上述getQ()函数的返回值。举例如下:

类似地,可以实现其他32位和16位的基础运算和相关高级运算。

将循环进行汇编改写并优化的示例如下:

for(i=0;i

{*p0++=*p1++;}

改写汇编:

mov r0,m

ldr r1,p0

ldr r2,p1

bak ldrsh r3,[r2],2

strsh r3,[r1],2

subs r0,r0,1

bne bak

未经过优化时,strsh指令会等待3个时钟周期以便能够从r3寄存器中取到数据,这样ldrsh和strsh两条指令的执行时间就是4个时钟周期,减法运算和跳转运算是4个时钟周期,那么循环消耗的指令周期T=m*8。

按照排列流水线以及展开循环的方式来优化后:

bak ldrsh r3,[r2],2;1

ldrsh r4,[r2],2

ldrsh r5,[r2],2

strshr3,[r1],2;2

strshr4,[r1],2

strshr5,[r1],2

subs r0,r0,3

bne bak

1和2之间填入了其它指令,合理利用了等待的时间,3条ldrsh和3条 strsh的指令所消耗的时钟周期是6,那么整个循环消耗的时钟周期降低为:

T=m*6/3=m*2;

降低为原来的1/4(注意:如果循环次数不能被3整除,不能采用3次展开的方法,可以选择展开其它能够被整除的次数),有效地提高了汇编代码的执行效率。

本方法基于ARM编译器支持的函数内嵌机制、大量的针对数字信号基础运算和相关高级运算的汇编指令、APSR程序状态寄存器,采用了特定函数优化和特定语句优化两种,其中,ARM编译器支持的函数内嵌机制是指ARM 编译器可利用关键字_inline指示编译器将函数内嵌,带来的好处是节省调用函数的额外负担,函数内嵌后,直接用函数程序码嵌入调用,没有传统调用所需的前置和后置动作,会显著提升运行效率。

其中,特定函数优化方案为:

标准的G.729协议采用了大量的32位和16位的四则运算以及相关的高级运算,但是在实现上为了确保数据不会造成溢出,对所有的运算操作都进行了饱和运算;另外程序还定义了全局变量来标记是否发生过饱和,如果发生饱和该变量将置位。这两种操作都是影响编解码效率的重要因素,会使得编解码效率大打折扣,所以本方法创造性地将这些大量的基础运算和高级运算函数以ARM编译器支持的函数内嵌的方式重新用汇编指令来重新实现。同时汇编指令实现运算的过程中可依据是否发生饱和自动记录于ARM架构的APSR寄存器中,这样就免去了标准程序中利用全局变量人为记录饱和行为的操作,这种方式显著提升了软件运行效率。

特定语句优化方案为:

将大幅度降低G729编解码运行效率的特定语句改写成ARM汇编实现,采用汇编的主要目的就是尽量避免ARM处理器的流水线上的冲突,充分利用流水线;C语言经过编译器编译成的汇编语言并没有合理地利用到ARM流水线的处理能力,内存地址的读取和写入操作、跳转命令的操作都严重阻碍了流水线的流畅。在ARM汇编中,数据加载指令(从内存读取到寄存器中)以及跳转指令的完成需要至少占用3个时钟周期。数据加载指令执行时,该指令占用的寄存器和内存是不可再访问的,所以对于数据加载指令,可以通过填入其它非相关指令以达到合理利用流水线的目的;而跳转指令不同,当跳转指令执行时,是不可以再执行其他指令,所以对于跳转指令应该尽量减少。因此这个优化过程中主要采用两个方面来完成,一是合理地排列汇编命令,调整指令顺序,充分利用流水线;二是通过展开循环和合并循环的方式,减少跳转指令。

总之,本发明创造性地运用ARM汇编指令对G729编解码软件进行了特定函数和特定语句的优化,从而大大提高了G.729软件运行效率,显著降低了对处理器的性能要求,满足了小型化语音终端对多路G.729语音编解码的需求。

技术分类

06120114693669