OPUS裡的Silk和原始Silk簡單比較

Jonestorrons發表於2019-05-13

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位後做異或後自減進行判斷,其實這兩種方法的結果是一樣的,只是表現方法不一樣。
先寫到這裡吧,以後有想起來的再補充。

相關文章