OPUS是由Silk和CELT两个编码器组成的,用来处理全频带的语音和音乐信号,OPUS在集成Silk的时候,对Silk的一些细节做了改动,这里简单整理一下OPUS中的Silk模块和纯的Silk编解码器的不同之处。
一、预测部分:计算逻辑上来看,二者是相同的。不同之处有:
1、OPUS的整体计算精度更高一些,由Silk里的Q10转换成了Q14后进行判断,包括LPC、LTP和excition部分。
2、在做Delaydecision的时候,OPUS中对判断算法进行了重写,增加了一个quantoffset,重新规划了量化的范围,这里和Silk比较,带来的MOS分增益我自己测的是大约在0.05左右,不一定准确。
3、OPUS是使用SHIFT_ROUND将Q10转化成了Q0传入到编码模块,Silk使用的是SHIFT方法,两者的不同之处在于,SHIFT_ROUND会将[-512,512]的值都转化为0,而SHIFT的置零区间为[0,1024],这里使用不同的SHIFT算法会影响到后续编码激励时分配的码率。
4、OPUS的Delaydecision默认是计算40个采样点的总误差,Silk是32个,这两个我试了一下对MOS分的影响基本没有。
5、OPUS通过调整计算步骤,加新的参数(如delayedgain和diff等)等方法,减少了少量计算量。
二、编码部分:
1、OPUS中的编码模块由依赖Silk中的概率密度函数转成了逆概率密度函数,我这里也不清楚做这种改动的原因,从结果上来看,使用CDF和iCDF的编码效率是差不多的。
2、OPUS将编码index和excition的函数区分开了,但函数的实现及各个参数的编码顺序是相同的。Silk的编码函数都在了一起显得有点拥挤,也不太方便后续自己开发。
三、其余部分:
1、增益计算部分,OPUS在较多函数里使用的是Q7,Silk使用的是Q0,从代码上来看OPUS对增益的控制能稍微准一些
2、OPUS的码率控制算法进行了重写,但总体逻辑是一样的,我个人感觉OPUS的码率控制更为激进一点
3、OPUS的抖动算法中Seed的判断方法也改变了,OPUS中通过判断Seed是否小于0进行符号的转换,Silk通过把Seed右移31位后做异或后自减进行判断,其实这两种方法的结果是一样的,只是表现方法不一样。
先写到这里吧,以后有想起来的再补充。


Jonestorrons
5 声望2 粉丝

对音频信号处理有较强烈兴趣