继续学习iLBC Codec ...
一、iLBC解码器的流程
如图1是没有丢帧情况下的iLBC解码流程,当解码端收到Payload时,首先从bitstream里面解析出解码所需要的参数。这里的解码参数从LPC开始,然后是重建起始状态,接下来的sub frame重建与编码时的顺序一致,通过解码三级形状/增益矢量并且相乘再叠加在一起就得到了重建的残差信号。然后进入语音增强模块,提高语音信号的周期性,最后再经过合成滤波以及后处理模块得到解码语音。如果发生丢包,那么步骤1到5需要采用丢包补偿模块进行处理,关于丢包补偿(PLC)内容较多,以后再详细说明。
1、从bitstream中提取解码参数;
2、解码LPC系数,并且通过内插得到各个子帧的相应LPC系数,这个步骤比较直接,在各个speech codec的实现都基本相似;
3、重建57/58个样点的起始状态矢量。首先通过查找表解码DPCM样点,然后将解码的Scalar恢复矢量的功率,接下来通过时间反转和全通滤波得到57/58的起始状态矢量。剩下的23/22个样点矢量通过起始状态矢量构成的动态码书和相应的索引号进行解码重建。
4、利用已经解码的残差信号样点建立Codebook Memory,按照编码的顺序依次解码各个子帧,需要注意的是解码在起始状态之前的矢量时,需要对残差信号和目标矢量进行时间反转。
5、通过(gain[0]*cbvec[0]+gain[1]*cbvec[1]+gain[2]*cbvec[2]) ,重复步骤4、5重建所有的子帧。
6、语音增强模块。通过放大语音周期性使语音质量达到最佳化。
7、残差信号的合成滤波,得到时域的语音信号。
8、后处理模块,目的是去除合成语音时产生的低频噪声。
二、iLBC Codec的质量评测
这部分来自于iLBC的白皮书。
三、iLBC解码器的总结
1、iLBC整个解码流程的复杂度是编码端复杂度的1/3~1/2;(参考网上定点iLBC代码在ARM9上的实现)
2、低延时,较强的抗丢包性能,即在丢包率较高的情况仍然保持较好的语音质量;
3、特有的丢包补偿(Packet Loss Concealment)模块和语音增强(enhancer)模块,这两部分是解码端最大的亮点,还需要进一步研究,这也正是下一步的学习计划;
参考资料:
1.《RFC3951.txt》
2. iLBC white paper. pdf
一家之言,欢迎讨论和指正!
Note:
不知道什么原因,现在的网址 www.ilbcfreeware.org 无法打开了,不知道你们可不可以?