哥倫布編碼

2021-07-02 16:25:22 字數 1600 閱讀 5072

計算前面有多少個bit位為0,記為n,後面的有效資料就是n+1位(如果n等於0後面的有效資料就是1位),這樣2n+1位就是乙個編碼,其中前面n位是0字首,後面的n+1位是有效資料。再看定義的是有符號還是無符號型的,無符號型的就是直接後面n+1位有效資料的排列的二進位制資料大小,有符號型的要將無符號型的資料稍微轉換一下,變成正數或負數(前n位表示資料,最後一位表示符號)。具體詳細介紹看h264標準文件說明。

指數哥倫布碼(exponential-golomb code, 即exp-golomb code)壓縮編碼方法過程:

用來表示非負整數的k階指數哥倫布碼可用如下步驟生成:

1.        將數字以二進位制形式寫出,去掉最低的k個位元位,之後加1

2.        計算留下的位元數,將此數減一,即是需要增加的前導零個數

3.將第一步中去掉的最低k個位元位補回位元串尾部

位元串格式為「字首1字尾」。1)1字尾=codenum+1,如codenum = 3,則1字尾=4,即為100,字尾為00;2)字首與字尾的位元數相同,且字首的各位位元為0,

下例為對不同codenum進行的編碼結果:

0 => 1 => 1

1 => 10 => 010

2 => 11 => 011

3 => 100 => 00100

4 => 101 => 00101

5 => 110 => 00110

6 => 111 => 00111

7 => 1000 => 0001000

8 => 1001 => 0001001

與此相反,這些語法元素的解析過程是由位元流當前位置位元開始讀取,包括非0 位元,直至leading_bits 的數量為0。具體過程如下所示:

leadingzerobits = ?1;

for( b = 0; !b; leadingzerobits++ )

b = read_bits( 1 )

變數codenum 按照如下方式賦值:

codenum = 2leadingzerobits ? 1 + read_bits( leadingzerobits )

這裡read_bits( leadingzerobits )的返回值使用高位在先的二進位制無符號整數表示。

如下示例:

二進位制位元數      長度             解析值  

1001                        1                           0

001 1001                     5                                  5

01 1010                       3                                  2

010                              3                                   1

000 1011                    7                                   10

0001 001                     7                                   8

指數哥倫布編碼

哥倫布編碼前言 在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下 十進位制二進位制 有效位元組 如數字1,原本只需要1個bit就能表示的資料,如今需要8個bit來表示,那麼其餘7個bit就可以看做是冗餘資料,在網路傳輸時,如果以原本等長的編碼方...

指數哥倫布編碼

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

h264編碼分析 哥倫布編碼

1 首先h264為什麼選用哥倫布編碼?因為h264協議為了節省bits,沒有規定字段表示資料字段長度 資料字段可以根據自身的實際值,可長可短,這樣可以大程度上的節省bit。2 無符號指數哥倫布編碼如何編碼的?在實際資料前面有幾個0就表示,有效資料位數是多少,理解為長度字段,然後資料數值 數值 1,因...