iLBC语音编解码器的研究与实现
- 格式:doc
- 大小:1.20 MB
- 文档页数:18
一、引言
二、iLBC算法研究
一般将编码速率低于4.6kbps的语音编码器称为低比特率编码器,而把编码速率介于4.6kbps~24kbps的编码器称为中比特率编码器。按照这个划分标准,iLBC编码器属于中比特率编码器。iLBC算法基于码本激励线性预测这种参数编码方式,因此本章首先对基于码本激励线性预测算法的中比特率语音编解码器的组成结构及工作原理进行研究和探讨,在此基础上对iLBC算法进行研究,重点介绍其算法原理及特点。
中低速率语音编解码算法研究
3)iLBC算法简介[参照ilbc白皮书]
自VoIP技术面世以来,业界对现存的低比特率编解码器标准的关注一直不断。VoIP应用主要在包交换的IP网络上进行传输,无法避免IP网络的丢包、延时、抖动等实时传输问题。2000年,Global IP Sound(GIPS)公司决定开发一种能够满足VoIP产业需求的编解码器,目标是利用GIPS内部的专业能力开发一款免授权费、专为数据包通信而设计,而且在理想无错情况和丢包情况下都能提供高音质的编解码器,并把它引入不同的标准化机构以符合互操作性的要求。这就是iLBC(Internet Low Bit Rate Codec)编解码器诞生的缘起。
目前大多数的语音编码都是基于码本激励线性预测(Code Excited Linear Prediction,
CELP)编码模型的,例如ITU G.729、G.723.1和3GPP-AMR。CELP一直都被视为在交换网络中以低比特率电路获得高质量的一种非常成功的方法。这种编码方法具有高效性,主要是由于它利用了连续语音片段之间的互相依赖性,因此CELP编码的性能主要取决于前面编码的历史。CELP编码器是基于存储器的,故丢包或延迟所造成的误差会扩散开来,结果是单个丢包会影响到随后多个数据包的质量,这显然是数据包通信的一大缺陷。
iLBC本质上式一种基于帧的线性预测编码方法,是对CELP的一种发展,其独有的动态码本更新技术、语音增强技术和丢包掩蔽技术使其在VOIP中应用时有更好的性能。iLBC是专为提供文件的IP语音通信而开发的语音编解码器,以窄带语音为色合计基础,具有8kHz的采样率。iLBC支持两种基本的帧长度:13.3kbps比特率下编码帧长度为30ms;15.2kbps比特率下编码帧长度则为20ms。
编码前 帧长 编码后 比特率
格式1 采样率:8kHz
16bits/sample 20ms(2560bits) 304bits
格式2 30ms(3840bits) 400bits
iLBC的帧格式
采用iLBC算法可以获得一个具有丢包相应控制的语音编码系统。iLBC对每一个数据包的处理都能够独立于其他数据包来进行,是数据包通信的理想选择。即使IP丢包和/或延迟现象的恶化,这种编解码器的语音质量下降情况也不会太差。这与基于CELP模型的一般编解码器的行为不同,这类编解码器最先是为交换电路网络或无线网络而设计的,是设计来恢复位错误而非丢包的。
编码器[参照ilbc标准]
iLBC编码器本质上式一种基于帧的线性预测编码方法。编码器的输入为采样率为8kHz ,每个样点为16bit的单声道PCM语音数据。该数据被分为若干帧,每帧包含有160/240(20ms/30ms)个样点。iLBC编码器主要进行以下操作:
1)将每帧分为4/6个子帧,每个子帧包含40个样点。对30ms的帧,进行两次10阶的线性预测编码(LPC)分析,得到相应的LPC系数。对于20ms的帧,进行一次10阶LPC分析。 2)将每次分析得到的LPC系数转化为线谱对(LSF)系数,并对LSF系数进行量化、内插得到每个子帧的LSF系数。通过该量化内插后的LSF系数得到对应的LPC系数,即得到各子帧对应的线性预测分析器,通过对各个子帧的线性预测,得到各个子帧的残差。
3)选择残差中能量最大的两个连续子帧。这两个连续子帧的首部57/58(20ms/30ms)个样点被选定为本次处理的初始状态。对于浊音语音,这样的选取方式将至少包含一个基音脉冲。
4)对初始状态进行基于DPCM的标量量化,其结果作为编码输出的一部分。同时,将初始状态存入码本存储区,以构成动态码本的初始值,用于对本帧剩余样点进行矢量量化。
5)对于剩余的残差,矢量量化将按以下顺序进行:包含有初始状态的两个连续子帧中剩余的23/22个样点;时间轴上位于初始状态之后的各个子帧;时间轴上位于初始状态之前的各个子帧。对于此矢量量化,每次的搜索码本范围是动态码本,动态码本中存储了已经被编码的对象,并随着最新的解码结果,该动态码本被更新。
6)对编码结果进行打包处理。
下图为iLBC编码器原理图。
1. 预处理2. LPC量化
LSF内插3.分析滤波器4. 初始状态选择5. 标量量化6.
码本搜索7.打包
.1 预处理
在某些应用当中得到的语音数据包含直流或者50、60Hz的噪声,可以在信号输入编码器之前通过高通滤波器来消除这些信号[ilbc语音算法研究及dsp实现,参考文献10]。通常使用截止频率为90Hz的1阶极点/零点滤波器,其一般定义如下:
111()1azHzbz
其中,a、b均为常数。
.2 LPC系数计算、量化及内插
进入LPC分析模块的数据是刚刚经过预处理的数据流。8k采样率16bit表示的PCM数据流输入编码器,被分割成帧长为160/240个样点的一系列帧,每个帧又被分为4/6个连续的子块,每个子块包含40个样点。对于30ms的帧,编码器将做两次阶数为10的LPC分析。第一次分析一个对称平滑窗,重心在第二个子块上。第二次分析一个非对称平滑窗,重心在第五个子块上。对于20ms的帧,仅存在一次LPC分析,采用的平滑窗重心在第三个子块上。每次分析都是通过自相关法以及Levinson-Durbin算法得到10阶线性滤波器的系数。每一次LPC分析,得到线性滤波器的系数之后都需要将其映射到一个LSF(Line Spectral
Frequencies)集合,量化内插后得到LSP(Line Spectral Pair)集合。之所以这样是因为线谱对系数更利于量化和内插,即对量化误差不敏感,具有良好的鲁棒性。线谱对系数的量化利用的是三级分割矢量量化技术,10个系数分量被分割成3、3、4的子集,然后每个子集分别通过常规的矢量量化方式得到量化结果。量化完毕后,需要对LSF系数进行重排序,按照下标顺序依次从小到大,目的是最终结果反映出来的滤波器具有稳定性。
LPC分析方法是目前低比特率语音编码技术的基础,在实现时主要基于10阶线性预测(Linear Prediction)滤波器[ilbc语音算法研究及dsp实现,参考文献11]。滤波器的定义如下:
10111()1iiiAzaz
其中,(1,,10)iai是量化后的LP系数。
1. 自相关系数计算
LPC分析的第一步就是使用窗口化语音采样来计算自相关系数。我们以30ms帧为例,它包含了两个自相关系数集合,因此每个自相关系数的计算都要通过不同的窗口化操作。自相关系数的第一个窗口采用的是标准对称汉明窗,由两部分组成,其数学函数如下:
0.5(1.0cos((2(1))/(1))0,,119_[1]120,,239iBLOCKLilpcwinTblwinTblBLOCKLii
其中BLOCKL=240/300(分别对应20ms帧和30ms帧),winTbl为存放语音采样点的数组。
自相关系数的第二个窗口采用的是非对称窗口,其定义如下:
2(sin((1)/441));0,,219_cos((220)/40);220,,239iilpcasymwinTblii
通过对预处理后的数据进行加窗处理后进行自相关运算得到自相关系数。
2. 计算LPC系数
由两组11个平滑的自相关系数acf1和acf2,根据Levinson-Durbin算法可以计算出两组11个LPC系数lp1和lp2。为了达到平滑频谱峰值的目的,可以 通过以下函数来修正LPC系数,其定义如下:
1[]1[]0,,102[]2[]0,,10iilpbilpiCilpbilpiCi
其中,C是0到1之间的实数,推荐使用0.9。
3. LSF系数的计算及量化
将计算出的LPC系数转化为线谱频率(Line Spectral Frequencies,LSF)系数。然后使用三级分割矢量量化技术对LSF系数进行量化,10个系数分量被分割成3,3,4的子向量,每一个子向量都可以使用常规的标量量化进行量化。量化结束后,在向量分割的边界对LSF系数进行重排序,以保证编码器和解码器使用相同的LSF表示。
4. LSF系数插值
对于每一帧语音采样计算出两个LSF系数集合,通过一个10阶的FIR滤波器插值每个子块可以得到不同的LSF。每一个子块的LSF系数插值后可以转化为LPC系数。未量化的和量化后的LPC系数分别来自两个滤波器,子块z的未量化的分析滤波器定义如下:
101()1()iiAkzakiz
子块z的量化后的分析滤波器定义如下所示:
101()1()iiAkzakiz .3. 计算残差信号
通过LPC分析滤波器系数的量化和插值来计算残差信号。尤其对于每一个40采样的子块来说,LPC分析滤波器被用来过滤相同采样的子块。每个子块的过滤存储被带到下一个子块的LPC滤波器。每个LPC分析滤波器的输出信号组成对应子块的残差信号。
为了使得输出的残差信号更加平滑,通常添加一个感知加权滤波器来平滑频谱。在iLBC算法中,为了降低算法的复杂度,定义感知权重滤波器如下:
1()(/0.4222)WkzAkz
其中,()Akz是由子块z未量化但插值后的LSF系数所得到的滤波器。
.4 起始态确认及量化
从能量上衡量残差信号中最大的两个连续子块将被视为起始态的粗略位置。起始态就是这两个连续子块的前57/58个样点或后57/58个样点。最终选择决定于哪一端的能量更大。针对选中作为起始态的这些样点,需要对其做归一化处理。在归一化之前用一个全通滤波器对其做相位杂散处理,这样做是的在残差信号序列中,样点的分布规律更具偶对称特性。滤波通过时域中的圆周卷积来完成,从滤波后的响应序列当中选出幅度最大的样点,对数化后进行64级标量量化。以量化值作为依据导出归一化因子。
如下图所示,对归一化后的起始态样点值做感知加权,目的是使得语音频谱不因为归一化操作而变得过于尖锐。加权后的样点经过差分PCM量化编码完成最后的起始态编码。其中()Wkz为感知加权滤波器,()Pkz为全通滤波器。
残差数据Wk(z)量化Pk(z)X[n]Y[n]D[n]U[n]
起始态样点的DPCM量化
2.3.1.5 码书编码
对于除去起始态的那些样点,余下的样点需要通过动态码书来编码。
编码基于一个自适应的码书,已编码的语音数据在编码端临时解码得到LPC激励信号,将它们缓存在一块固定的内存中,按照一定的规则选取这块内存中的样点序列,就能得到用于编码下一块数据的自适应码书。这样做是利用了语音信号的短时平稳性。具体编码过程主要包括以下几部分: