音頻編解碼之G7221解碼器

如有不當之處歡迎批評指正

前述

  上篇文章《音頻編解碼之G7221編碼器》介紹了G.722.1的編碼器部分,這篇文章介紹其解碼器部分。

簡介

  • G.722.1是一種基於變換域編碼的算法
  • 採樣率: 16000hz
  • 比特率: 24kbit/s 32kbit/s
  • 變換域: MLT(Modulated Lapped Transform)
  • 幀長: 20ms
  • 變換窗長: 40ms
  • 有效編碼帶寬: 50~7000hz

解碼器

  解碼器先對每個區域的幅度包絡進行解碼,然後使用與編碼器同樣的方式產生16種不同的編碼方法,再通過分類控制比特確定編碼器所選用的編碼方法,最後對MLT係數解碼重建。

1. 解碼幅度包絡

  接收到碼流中的前5個比特表示第0個區域幅度包絡的量化索引rms_index(0)rms\_index(0),通過查表的方式解碼出
diff_rms_index(r),1r<14diff\_rms\_index(r), 1\leq{r}<14
  並通過以下方式得到其他區域幅度包絡的量化索引
rms_index(r)=rms_index(r1)+diff_rms_index(r),1r<14,1r<14rms\_index(r) = rms\_index(r-1) + diff\_rms\_index(r), 1\leq{r}<14, 1\leq{r}<14
  然後通過rms_index(r)rms\_index(r)得到區域的幅度包絡rms(r)rms(r)

2. 確定編碼類型

  使用與編碼器中相同的方法,生成16種不同的編碼方法,並通過分類控制比特確定編碼器所使用的編碼方法。

3. 解碼MLT係數

  通過查表解碼得到vector_index(v)vector\_index(v),並通過下式得到MLT係數的量化索引
k(j)=vector_index(v)(kmax+1)lMOD(kmax+1)k(j)=\lfloor\frac{vector\_index(v)}{(kmax+1)^{l}}\rfloor MOD(kmax+1)
  其中MODMOD爲取餘操作
j=(v+1)vdl1j=(v+1)\bm{vd}-l-1 0lvd10\leq{l}\leq{\bm{vd}-1}0vvpr10\leq{v}\leq{\bm{vpr}-1}
  上面式子中所用到的變量可在編碼器一文中找到對應的定義。爲什麼對vector_indexvector\_index經過上面式子的運算就能得到kk哪,先回顧一下編碼器一文中的式子
vector_index(v)=l=0vd1k(vvd+l)(kmax+1)vd(l+1)vector\_index(v)=\sum_{l=0}^{\bm{vd}-1}{k(v*\bm{vd}+l)(kmax+1)^{\bm{vd}-(l+1)}}
這個式子是由kk得到vector_indexvector\_index, 正好與前一個式子相反。下面舉個例子詳細說明一下這兩個互爲“逆”的式子。
  假設給區域0分配的類別值是0,那麼由編碼器一文可知,該區域在編碼階段將包含10個矢量,每個矢量包含2個標量,以第2個矢量[k(2),k(3)][k(2), k(3)]爲例, 可知v=1v=1, vd=2\bm{vd}=2, kmax=13kmax=13, 帶入上式可得
vector_index(1)=k(12+0)(13+1)2(0+1)+k(12+1)(13+1)2(1+1)vector\_index(1)=k(1*2+0)*(13+1)^{2-(0+1)}+k(1*2+1)*(13+1)^{2-(1+1)}
  化簡之後可得
vector_index(1)=k(2)14+k(3)vector\_index(1)=k(2)*14+k(3)
  現在知道了如何由k(2)k(2)k(3)k(3)得到vector_index(1)vector\_index(1),那麼再通過之前的那個式子看如何由vector_index(1)vector\_index(1)得到k(2)k(2)k(3)k(3)
l=0vector_index(1)(13+1)0MOD(13+1)=k(3)l=0 \rArr \lfloor\frac{vector\_index(1)}{(13+1)^{0}}\rfloor MOD(13+1)=k(3)
l=1vector_index(1)(13+1)1MOD(13+1)=k(2)l=1 \rArr \lfloor\frac{vector\_index(1)}{(13+1)^{1}}\rfloor MOD(13+1)=k(2)
  通過這個式子相信大家明白了kkvector_indexvector\_index之間是如何互相計算得到的。計算出MLT係數的量化索引k(j)k(j)之後,將k(j)k(j)映射到表1所對應的值,然後將該值與解碼得到的幅度包絡rms(r)rms(r)相乘得到MLT係數幅度,並按照符號比特設置非零係數的符號。

1 G.722.1用來重建MLT係數的參數

表1 G.722.1用來重建MLT係數的參數

4. 噪聲填充

  沒有對類別爲7 的區域的MLT係數幅度進行編碼,解碼時將其用噪聲代替。在編碼類別爲56的區域時,由於量化步長較大,因此也有許多係數被量化爲了0,解碼時同樣將其用噪聲代替。這些噪聲由於符號隨機、幅度與rms(r)rms(r)成比例的係數值代替。表2規定了比例常數。

2 G.722.1噪聲填充比例性常數

表2 G.722.1噪聲填充比例性常數

5. 欠缺的比特

  編碼時,可能編碼器在完成最後一個非類別7區域的編碼之前比特已經不夠用了。這種情況下,解碼器將該區域以及剩餘的所有區域當成類別7作處理。

6. 丟幀補償

  解碼器若獲知當前幀丟失,則使用前一幀已解碼的MLT係數。若前一幀也丟失,解碼器將當前幀的MLT係數全部置爲0

7.MLT 變換

  將MLT係數轉換到時域,這兒不具體介紹公式。

8.總結

  磕磕絆絆花了一天多的時間終於寫完了,這其實是筆者1年前的工作了, 有好多細節得重新回憶,可能還有好多地方理解地不對。筆者在剛開始學習G.722.1編解碼器的時候有好多細節不懂,至今也是。比如生成16種編碼方法的具體做法,以及爲什麼要那樣做,其次就是G.722.1中有大量的表格,那些值是怎麼得到的,其中某些值的含義又是什麼。如果讀者瞭解其中詳情或是發現文章中有理解錯誤的地方,還請多多賜教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章