哥倫布編碼前言
在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下:
十進位制5
425521
二進位制00000101
00000100
11111111
00000010
00000001
有效位元組33
821
如數字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為字尾長度
哥倫布編碼流程
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 = 010
k = 2
1xx0~3
01x1~2
01***
4~11
001xx
3~601***x
12~27
0001***x
7~14
01***xx
28~59
......
......
k = 1
1x0~1
k = 3
1***
0~701xx
2~501***x
8~23
001***
6~13
001***xx
24~55
0001***x
14~29
0001******
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)*len= 2*i + 1;//哥倫布碼碼字的長度
*info=ue+1-(int)pow(2,i);// 碼字的內容
}
指數哥倫布編碼
哥倫布編碼前言 在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下 十進位制二進位制 有效位元組 如數字1,原本只需要1個bit就能表示的資料,如今需要8個bit來表示,那麼其餘7個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.將第一步...