指數哥倫布編碼


哥倫布編碼前言

在計算機中,一般數字的編碼都為二進制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗余信息,如下:

十進制 5 4 255 2 1
二進制 00000101 00000100 11111111 00000010 00000001
有效字節 3 3 8 2 1

 

如數字1,原本只需要1個bit就能表示的數據,如今需要8個bit來表示,那么其余7個bit就可以看做是冗余數據,

在網絡傳輸時,如果以原本等長的編碼方式來傳輸數據,則會出現很大的冗余量,加重網絡負擔

但是如果只用有效字節來傳輸上述碼流,則會是:10110011111111101,這樣根本不能分離出原本的數據

 

哥倫布編碼則是作為一種壓縮編碼算法,能很有效地對原本的數據進行壓縮,並且能很容易地把編碼后的碼流分離成碼字。

 

哥倫布編碼思想

一個碼字的信息量,稱之為熵,二進制上可用log2[n]來表示,也就是上面表格的有效字節,但是如果只是把有效碼字串聯起來,得到的只是一串無用的碼流,因為這串碼流中並沒有描述單一碼字的信息量,也就是無法對碼流進行分離

哥倫布編碼就采用了加0前綴,用於表達碼字的信息量,在得到m個0前綴后,就能知道該碼字在碼流中的長度,並從碼流中把碼字分離出來

 

哥倫布編碼概念

指數哥倫布(Exp-Golomb)編碼是一種在音視頻編碼標准中經常采用的可變長編碼方法,它是使用一定規則構造碼字的變長編碼模式。它將所有數字分為等大小不同的組,符號值較小的組分配的碼長較短,同一組內符號長基本相等,並且組的大小呈指數增長。

指數哥倫布碼的比特串分為“前綴”(prefix)和“后綴”(suffix)兩個部分。它的邏輯結構為:

[Mzero][1][INFO]

編碼后碼長為2M + 1 + k,M為前綴長度,1為中間的1長度,M+k為后綴長度

 

哥倫布編碼流程

zeroPrefixLength用於存儲0前綴個數

codeNum是即將被編碼的碼字

k是指數哥倫布編碼的指數

codeLen用於存儲編碼后長度

INFO為哥倫布編碼后綴

 

 

編碼時

M = zeroPrefixLength = floor(log2[codeNum + 2^k])

INFO = codeNum + 1 - 2^M

 

可以對編碼過程進行如下分析:

首先求出碼字的信息量,為N,

由於信息量肯定大於1,為減小碼流,對其減一得 M = N - 1(也就是上述的求下整)

然后也需要盡量對后綴進行壓縮,因此利用前面所得的M進行縮減得,codeNum - 2^M

最后考慮到0這個數字的存在,為了使INFO非負,對其+1

 

解碼時

codeNum = 2^M + INFO - 1

codeLen = 2M + 1 + k

 

K階指數哥倫布碼表

階數 碼字結構 codeNum 取值范圍 階數 碼字結構 codeNum 取值范圍
K = 0 1 0 K = 2 1XX 0~3
01X 1~2 01XXX 4~11
001XX 3~6 01XXXX 12~27
0001XXXX 7~14 01XXXXX 28~59
... ... ... ...
K = 1 1X 0~1 K = 3 1XXX 0~7
01XX 2~5 01XXXX 8~23
001XXX 6~13 001XXXXX 24~55
0001XXXX 14~29 0001XXXXXX 56~119
... ... ... ...

 

一般來說,根據碼字出現的概率調整哥倫布編碼的階數K,

如果是碼字0出現的概率較大,那么應該用K = 0,即0階指數哥倫布編碼

如果碼字0與1出現的概率都比較大,那么應該用K = 1,以此類推

在H.264中用的是K = 0

 

JM代碼如下

void ue_linfo(int ue, int dummy, int *len,int *info)
{
  int i,nn;

  nn=(ue+1)/2;

  for (i=0; i < 16 && nn != 0; i++)
  {
    nn /= 2;
  }
  *len= 2*i + 1;//哥倫布碼碼字的長度
  *info=ue+1-(int)pow(2,i);// 碼字的內容
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM