PLC 全称是 Packets Loss Cancellation,即丢包隐藏技术,是通话处理中必不可少的一项技术。通过修改音频编解码器,在编解码器中对于音频帧状态进行记录,记录当前帧及其前后帧的状态,当遇到丢包导致的丢帧时,通过 PLC 将丢失的数据包重建出来,减少重传。
在音频数据传输时,当出现网络信号不好,导致音频数据丢包,可以采用丢包隐藏技术进行自身模拟数据恢复,从而提高音频通话质量;
当我们某些项目对接时,必须采用G711,G729,G723.1等音频编码时,那丢包隐藏技术就可以派上大用了,注意:丢包隐藏技术只能对解码后的原始音频pcm数据进行处理;
一、算法基本思想:
比如上次收到的音频包的序号为3,而本次收到的音频包的序号为6,则需要用plc模拟恢复出来两个包4和5,从经验值上来看,最多可以模拟恢复出来3个包,丢太多时效果就不好了,只能按丢包处理或采用其他手段进行恢复。
丢包隐藏处理技术分类:
1 zero Insertion:用0替换丢失的帧
2 Waveform substitution :用已接受的一段数据来重复构建丢失的数据,最简单的方式就是重复最后接受的帧,其他还有根据基本频率、时间间隙等波形技术,由于它易于实现,ITU在G711中实现了一个这种算法的例子
PLC只是在解码端进行封包补偿处理,在解码端根据收到的bitstream逐帧进行解码的过程中,decoder首先拿到每帧的 bitstream 要判断当前帧是否完整,如果没有问题则按照正常的 解码流程重建语音信号;如果发生了语音封包丢失,那么就进入PLC单元进行处理。PLC主要根据前一帧的解码信息,利用基音同步重复的方法近似替代当前的丢失帧,以达到丢包补偿。
1、过去帧、当前帧都接收正确
进入正常的iLBC decoder解码流程,需要保存当前帧的状态信息,这些状态信息包括LPC信息、解码后的残差信号等。如果下一帧的比特率丢失的话,就要用到这些保存的信息。
2、仅当帧发生丢包
如果当前帧没有丢失,那么进入PLC unit重建LPC系数和残差信号。后面会详细介绍LPC和残差信号的补偿方法。
3、连续多帧发生丢包
如果发生连续多帧丢包,那么就需要多次进入PLC unit,并且需要利用经过补偿的帧状态信息。值得注意的是,越靠后面丢失的帧越难以精确的重建,所以对连续丢包的增益采用逐帧递减,以避免引入更大的信号失真。
4、 过去帧经过PLC处理,需要与当前帧平滑处理
为了使经过PLC补偿的帧与接下来没有丢包的帧保持语音连续而需要进行平滑,主要根据前后帧的相关性处理。.
PLC的缺点
在连续丢帧的情况下,PLC所补偿的各个语音帧具有相同的频谱特性(相同的LPC造成)和基音频率,非常容易引入一种可察觉的噪声,尤其是当基音频率较高的时候,这种因为过分的周期性所引起的。通过适当的内插可以缓解这一问题,但往往引入更大的延时。
自研项目:
我自研了一个丢包隐藏算法,亲测效果还是非常不错的,windows平台和linux平台的我都已经编译好了,其他平台如有需要也可以支持,如果需要沟通交流可以跟我联系。
联系方式:
vx:unique_no_1 tel:18108010758