指数哥伦布编码
哥倫布編碼前言
在計算機中,一般數字的編碼都為二進制,但是由于以相等長度來記錄不同數字,因此會出現很多的冗余信息,如下:
| 十進制 | 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);// 碼字的內容 }?
?
轉載于:https://www.cnblogs.com/TaigaCon/p/3571651.html
總結
- 上一篇: html复选框多行排列布局
- 下一篇: DPKG命令与软件安装、APT