指數哥倫布編碼

2021-07-15 18:11:40 字數 3707 閱讀 8903

哥倫布編碼前言

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

十進位制二進位制

有效位元組

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

在網路傳輸時,如果以原本等長的編碼方式來傳輸資料,則會出現很大的冗餘量,加重網路負擔,但是如果只用有效位元組來傳輸上述碼流,則會是:10110011111111101,這樣根本不能分離出原本的資料,哥倫布編碼則是作為一種壓縮編碼演算法,能很有效地對原本的資料進行壓縮,並且能很容易地把編碼後的碼流分離成碼字。

哥倫布編碼思想

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

哥倫布編碼就採用了加0字首,用於表達碼字的資訊量,在得到m個0字首後,就能知道該碼字在碼流中的長度,並從碼流中把碼字分離出來

哥倫布編碼概念

指數哥倫布碼的位元串分為「字首」(prefix)和「字尾」(suffix)兩個部分。它的邏輯結構為:

[mzero][1][info]

編碼後碼長為2m + 1 + k,m為字首長度,1為中間的1長度,m+k為字尾長度

k階指數哥倫布碼

在h.264中,使用cabac需要進行二值化處理,而指數哥倫布編碼就是cabac的一種二值化處理的方法。k階指數哥倫布編譯碼具體過程如下:

a

、編碼過程:假設待編碼數字為codenum(必須非負整數)

指數哥倫布編碼後的形式為[mzeors][1][info],mzero表示m個0。

1、將codenum以二進位制形式表示(若不足k位,前面補0),去掉後面k位(若剛好是k位,去掉k位後得0),將結果(數值)加1,得到二進位制數t1;

2、m為二進位制數t1的二進位制位數減一;

3、然後將第一步中捨去的k位接到t1結尾,就得到[1][info]。

設[info]的二進位制位數為i,編碼過程也可以如下描述:

[1 info]是codenum+2^k的二進位制表示,mzeros中0的個數m = i - k。

於是就有總的編碼長度codelen = m + 1 + i =2m+k+1。 

舉例如下:

對於 k =0時:codenum=3。編碼如下:

二進位制表示為11,去掉k=0位後加1得100;

所以m=2;

所以編碼後結果為[mzeros][1][info]= [mzeros][1 info] = 00100

b

、解碼過程:

1、讀入連續0,連續0的個數就是m;

2、計算codelen = 2m+k+1,得到[1 info]的位數是 i=codelen - m =m+k+1;

3、讀入i位二進位制碼字,轉換成10進製,假設為w。由w = codenum + 2^k,得codenum = w-2^k。

舉例如下: 

解碼00100,讀入連續2個0,所以m=2;codelen=2m+1+k=5;所以需要再讀入3個碼流100,[1 info]就是100,轉成十進位制結果w為4,所以codenum =w-2^k=4-1=3;

同樣對於k=0,codenum=6時,編碼為:00111;

同樣對於k=3,codenum=3時,編碼為:1011;

同樣對於k=3,codenum=6時,編碼為:1110;

同樣對於k=3,codenum=10時,編碼為:010010;

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

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

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

在h.264中用的是k = 0

例子2:

下面分別介紹:

u(1) :為乙個位元組取出前1位

ue(v) 為無符號指數哥倫布熵編碼

編碼過程如下:

對 4 進行無符號指數哥倫布熵編碼

1、將4加1(為5)轉換為最小的二進位制序列即 101 (此是m=3)

2、此二進位制序列前面補充m-1即兩個0

3、得出的4的無符號指數哥倫布熵編碼的序列為 00101

解碼過程如下:

如對 00101進行無符號指數哥倫布熵解碼

1、獲取開頭連續的n個0, 此時n = 2

2、再向後讀取n+1位的值,即 101,為5

3、 5 - 1 =4 獲取其解碼後碼值

se(v) 為有符號指數哥倫布熵編碼

編碼過程如下:

如對4進行有符號指數哥倫布熵編碼

1、4的絕對值轉為最小二進位制序列,即 100 (此時m = 3)

2、後面補充符號位,0 即 1000

3、前面補充m個0, 即 0001000

解碼過程如下:

如對二進位制序列 0001000 進行有符號指數哥倫布熵解碼

1、獲取開頭連續的n個0, 此時n = 3

2、再獲取n為數值,即 100 即為4

3、獲取最後的符號位,0,即為正值

4、故此序列解碼後的碼值為4

示例二:

編碼如對-15進行有符號指數哥倫布熵編碼

1、-7的絕對值轉為最小二進位制序列,即 1111 (此時m = 4)

2、後面補充符號位,1,即 11111

3、前面補充m個0,即 000011111

解碼:如對二進位制序列 000011111 進行有符號指數哥倫布熵解碼

1、獲取開頭連續的n個0, 此時n = 4

2、再獲取n為數值,即 1111 即為15

3、獲取最後的符號位,1,即為負值

4、故此序列解碼後的碼值為-15

解碼**:

uint

ue(byte *pbuff,uint

nlen, uint&nstartbit)

//計算bit的個數

uint

nzeronum =0;

while (nstartbit

if (pbuff[nstartbit / 8] & (0x80 >> (nstartbit % 8)))//&:

按位與,%取餘

break;

nzeronum++;

nstartbit++;

nstartbit++;

//計算結果

dword

dwret =0;

for (uint

i=0; i

dwret

<<= 1;

if (pbuff[nstartbit / 8] & (0x80 >> (nstartbit % 8)))

dwret += 1;

nstartbit++;

return (1 << nzeronum)- 1 + dwret;     //w-2^k

intse(byte *pbuff,uint

nlen, uint&nstartbit)

intueval=ue(pbuff,nlen,nstartbit);

return

ueval&1?(ueval+1)/2:-(ueval/2);

指數哥倫布編碼

哥倫布編碼前言 在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下 十進位制5 425521 二進位制00000101 00000100 11111111 00000010 00000001 有效位元組33 821 如數字1,原本只需要1個bit...

Exp Golomb指數哥倫布解碼和編碼

公式如下 其中leadingzerobits為1前面,0的個數。所以在解碼的時候,如果遇到描述子為ue v 則可以先數0的個數,數到1為止,其中0的個數即為leadingzerobits。而公式中的read bits leadingzerobits 則為從中間1開始,往後順序數leadingzero...

指數哥倫布碼

指數哥倫布碼 exponential golomb code,即exp golomb code 壓縮編碼方法過程 用來表示非負整數的k階指數哥倫布碼可用如下步驟生成 1.將數字以二進位制形式寫出,去掉最低的k個位元位,之後加1 2.計算留下的位元數,將此數減一,即是需要增加的前導零個數 3.將第一步...