继续学习iLBC codec...
一、iLBC Enhancer 概述
iLBC decoder 中包含了语音增强单元,位置在重建残差信号与合成滤波之间,具体可见《深入剖析iLBC 解码器原理 》。这个增强单元作用于残差信号,通过减少隐藏在周期性较强的话音段中的相关噪声来提高语音的感知质量。相比传统的后滤波增强算法,这个算法限制了大幅度的修改残差信号,因此避免了过度增强所引起的音质下降。
Enhancer的处理单位是80个样点的sub-block,一共需要8个这样的sub-blocks作为enhance memory参与运算,对于不同的速率见下表:
Frame size |
Forward blocks |
Current blocks |
Input/output |
Delay |
20 ms |
6(6*80=480) |
2(2*80=160) |
160/160 |
40 |
30 ms |
5(5*80=400) |
3(3*80=240) |
240/240 |
80 |
二、iLBC Enhancer 原理流程
1、对每个80-samples的sub-blocks进行基音估计
在样点延时【20,120】这个范围进行互相关计算,找到其中最大相关系数的样点延时位置即是基音周期值。
2、在基音周期附近搜素六个基音周期同步序列
每一个基音同步序列都是一个80-samples的矢量。以基音周期等于40为例,从当前sub-block向前40、80、120样点的位置分别可以找到一个序列与当前sub-block序列相关性最大,当然为了保证精度,可以分别在每一个小范围做前后两个样点的细搜索,如【38,39,40,41,42】、【78,79,80,81,82】、【118,119,120,121,122】这样就可以得到三个前向的基音同步序列,另外的三个基音同步序列依据同样的步骤可以在后向得到。如果有基音同步序列超出了enhancer memory(640个样点),那么就设置为零好了。20ms/30ms的enhancer memory和基音同步序列位置可参考下图:
3、利用六个基音同步序列计算当前平滑的残差信号
通过六个基音同步序列的线性组合可以得到一个对当前sub-block的近似序列,这个序列经过scale就是增强的残差信号。
4、判断这个平滑的残差信号是否符合准则
判断增强的残差信号与未增强的残差信号之间的差距是否可以接受,如果可以接受,那么就可以直接输出;如果差距过大,则还需要步骤5和6进行约束条件下的增强处理。
5、通过约束条件,计算混合因子(mixing factor)
对于周期性较强的话音语段,经过六个基音同步序列线性组合计算的增强序列与未增强的残差信号之间的差距应该不大;但是对于话音的过渡段以及类噪声的清音部分,本身相关性就不大,所以这样得到的增强序列与未增强的残差信号差距就会较大,如果直接输出,就会因为这部分的过分周期性引入感知听觉的噪声,会使音质下降,所以才需要进一步处理。
最终输出的增强残差信号实际上是步骤3得到的增强残差信号与未增强残差信号的线性组合,公式如下:
z = A*y+B*pssq(0),
其中 假设z是最终的输出残差信号;y是步骤3得到的增强残差信号;pssq(0)是未增强的残差信号;A,B就是混合因子。
混合因子是经过拉格朗日(Lagrange)算子在两个约束条件下得到的最优解,涉及较多数学公式,这里就不赘述了,感兴趣可以看参考资料1.
6、利用混合因子将平滑的残差信号与原始未增强的残差信号进行混合,输出增强后的残差信号
三、iLBC Enhancer 总结
iLBC Enhancer本质上找出当前未增强残差信号(sub-block)的前后各3个80样点的周期序列,然后利用这6个基音同步序列来改进当前sub-block的音质,如果当前sub-block是话音部分就适当增加它的周期性,使声音更加饱满;如果当前sub-block具有非周期的特性,那么就减少它的周期性,减少噪声的影响。
参考资料:
1、IETF:RFC3951.txt
2、潘搏胜《iLBC解码程序进阶处理之研究》
一家之言,欢迎讨论!