哥倫布編碼前言
在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下:
十進位制二進位制
有效位元組
如數字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.將第一步...