指數哥倫布編碼

2021-09-20 00:26:15 字數 2345 閱讀 7730

哥倫布編碼前言

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

十進位制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.將第一步...