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