1. 程式人生 > >編碼原理(附一)--算術編碼

編碼原理(附一)--算術編碼

有一個 bcd 是不是 符號 其他 清晰 消息 繼續 一個

之前,記得在介紹CABAC的熵編碼時候,有一個環節涉及到了算術編碼,本篇就帶大家看看算術編碼是腫麽一回事。

簡介
算術編碼是一種無損的數據壓縮方法,也是熵編碼的一種方法。與其他熵編碼比較而言,其他熵編碼通常是把輸入的消息區分為符號,然後對每個符號進行編碼,而算術編碼是呢是根據輸入消息中不同符號出現的概率,把整個輸入的消息最終編碼為1個數,一個介於0和1之間的小數。有沒有想知道是腫麽編碼的呢。接下來已一個簡單的栗子來說明嘍。

準備工作

現在假設有字符序列 aabcda,且P(a) = 0.2,P(b) = 0.1, P(c) = 0.4,P(d) = 0.3,分別代表a,b,c,d在整個序列中出現的概率分別是20%,10%,%40,30%,四者加起來正好為1哦。且4個符號出現的概率將[0,1]區間分割為 [0,0.2),[0.2,0.3),[0.3,0.7),[0.7,1)。

編碼過程
首先字符序列中出現了a,P(a) = 0.2,所以落在了區間[0,0.2);
接下來出現的還是a,P(a) = 0.2,但當前的區間已經變為【0,0.2】,(0.2 - 0) P(a) = 0.04,此時,區間邊落在了【0,0.04】;
繼續,序列中出現了b,P(b) = 0.1,當前區間為【0,0.04】,(0.04 - 0)
P(b) = 0.004,此時,區間落在了【0,0.004】;
序列中出現c,P(c) = 0.4,當前區間為【0,0.004】,(0.004 - 0) P(c) = 0.0016,新的區間落在【0,0.0016】;
序列中出現了d,P(d) = 0.3,當前區間為【0, 0.0016】,(0.0016 - 0)
P(d) = 0.00048,新的區間落在【0,0.00048】;
序列中出現了a,P(a) = 0.2,當前區間為【0,0.00048】,(0.00048 - 0) * P(a) = 0.000096,區間落在【0,0.000096】。

    好了,到此,整個序列中的符號經過算術編碼得到一個相對較小的區間,二進制編碼最終在最後得到的區間之內,選取任意一個數作為編碼的結果。此處我們就選則0.000086作為最終的結果吧。這樣,我們的算術編碼是不是也清晰了呢,希望對大家有用哦!

編碼原理(附一)--算術編碼