熵編碼 之 3. Golomb coding

Golomb coding主要針對整數進行編碼,其基本思想是對較小的數用較短的編碼,對於較大的數使用較長的編碼。即,達到這樣一個效果,假設X爲要進行編碼的整數,當X趨於較小的取值時,此時的Golomb編碼較短。這樣可以有效的節省空間。

Golomb coding應用的範圍主要是整數,尤其是小整數比較多的情況。

Golomb coding使用一個可調的參數M,將輸入的值分爲兩部分:

q:被M除的結果

r:餘數

商使用一元編碼(unary coding),商後面緊跟着餘數,餘數使用截短的二進制編碼。當M=1時,Golomb coding等價於一元編碼(unary coding)。

假設對正整數X進行Golomb編碼,選擇參數m,令

b = 2m 

q = INT((X-1)/b)

r = X - qb - 1

這樣,X可以被編碼爲兩部分:

第一部分是有q1加上10組成

第二部分爲m位二進制數,其值爲rr一定小於2m)

 

實例-1m = 0

此時b = 20 = 1

x = 1

q = INT((x-1)/b) = INT((1-1)/1) = 0

r = x - qb - 1 = 1 - 0*1 -1 = 0

x編碼爲q = 01,加上10,加上m = 0位二進制數r = 0,爲:

0

x = 2

q = INT((x-1)/b) = INT((2-1)/1) = 1

r = x - qb - 1 = 2 - 1*1 -1 = 0

x編碼爲q = 11,加上10,加上m = 0位二進制數r = 0,爲:

10

x = 3

q = INT((x-1)/b) = INT((3-1)/1) = 2

r = x - qb - 1 = 3 - 2*1 -1 = 0

x編碼爲q = 21,加上10,加上m = 0位二進制數r = 0,爲:

110

……

x = 9

q = INT((x-1)/b) = INT((9-1)/1) = 8

r = x - qb - 1 = 9 - 8*1 -1 = 0

x編碼爲q = 81,加上10,加上m = 0位二進制數r = 0,爲:

111111110

上面的編碼彙總成表格,爲:

x

m = 0

1

0

2

10

3

110

4

1110

5

11110

6

111110

7

1111110

8

11111110

9

111111110

 

實例-2m = 1

此時b = 21 = 2

x = 1

q = INT((x-1)/b) = INT((1-1)/2) = 0

r = x - qb - 1 = 1 - 0*2 -1 = 0

x編碼爲q = 01,加上10,加上m = 1位二進制數r = 0,爲:

0 0

x = 2

q = INT((x-1)/b) = INT((2-1)/2) = 0

r = x - qb - 1 = 2 - 0*2 -1 = 1

x編碼爲q = 01,加上10,加上m = 1位二進制數r = 1,爲:

0 1

x = 3

q = INT((x-1)/b) = INT((3-1)/2) = 1

r = x - qb - 1 = 3 - 1*2 -1 = 0

x編碼爲q = 11,加上10,加上m = 1位二進制數r = 0,爲:

10 0

……

x = 9

q = INT((x-1)/b) = INT((9-1)/2) = 4

r = x - qb - 1 = 9 - 4*2 -1 = 0

x編碼爲q = 41,加上10,加上m = 1位二進制數r = 0,爲:

11110 0

上面的編碼彙總成表格:

x

m = 1

1

0 0

2

0 1

3

10 0

4

10 1

5

110 0

6

110 1

7

1110 0

8

1110 1

9

11110 0

 

 

實例-2m = 2

此時b = 22 = 4

x = 1

q = INT((x-1)/b) = INT((1-1)/4) = 0

r = x - qb - 1 = 1 - 0*4 -1 = 0

x編碼爲q = 01,加上10,加上m = 2位二進制數r = 0,爲:

0 00

x = 2

q = INT((x-1)/b) = INT((2-1)/4) = 0

r = x - qb - 1 = 2 - 0*4 -1 = 1

x編碼爲q = 01,加上10,加上m = 2位二進制數r = 1,爲:

0 01

x = 3

q = INT((x-1)/b) = INT((3-1)/4) = 0

r = x - qb - 1 = 3 - 0*4 -1 = 2

x編碼爲q = 01,加上10,加上m = 2位二進制數r = 2,爲:

0 10

……

x = 9

q = INT((x-1)/b) = INT((9-1)/4) = 2

r = x - qb - 1 = 9 - 2*4 -1 = 0

x編碼爲q = 21,加上10,加上m = 2位二進制數r = 0,爲:

110 00

上面的編碼彙總成表格:

x

m = 2

1

0 00

2

0 01

3

0 10

4

0 11

5

10 00

6

10 01

7

10 10

8

10 11

9

110 00

 

 

 

實例-2m = 3

此時b = 23 = 8

x = 1

q = INT((x-1)/b) = INT((1-1)/8) = 0

r = x - qb - 1 = 1 - 0*8 -1 = 0

x編碼爲q = 01,加上10,加上m = 3位二進制數r = 0,爲:

0 000

x = 2

q = INT((x-1)/b) = INT((2-1)/8) = 0

r = x - qb - 1 = 2 - 0*8 -1 = 1

x編碼爲q = 01,加上10,加上m = 3位二進制數r = 1,爲:

0 001

x = 3

q = INT((x-1)/b) = INT((3-1)/8) = 0

r = x - qb - 1 = 3 - 0*8 -1 = 2

x編碼爲q = 01,加上10,加上m = 3位二進制數r = 2,爲:

0 010

……

x = 9

q = INT((x-1)/b) = INT((9-1)/8) = 1

r = x - qb - 1 = 9 - 1*8 -1 = 0

x編碼爲q = 11,加上10,加上m = 3位二進制數r = 0,爲:

10 000

上面的編碼彙總成表格:

x

m = 3

1

0 000

2

0 001

3

0 010

4

0 011

5

0 000

6

0 001

7

0 010

8

0 011

9

10 000

 

譯碼方法

m = 2中的110 00爲例:

開始時,遇到1便讀入,知道遇到一個0,並記錄讀入1的個數。對於110 00而言,開始讀入2110,則q = 2。隨後讀入m = 2爲的數據,作爲rr = (00)2 = 0。之後即可計算出x = r + qb + 1 = 0 + 2*22 +1 = 8 + 1 = 9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章