算術編碼的基本原理是將編碼的訊息表示成實數0和1之間的乙個間隔(interval),訊息越長,編碼表示它的間隔就越小,表示這一間隔所需的二進位制位就越多。
算術編碼用到兩個基本的引數:符號的概率和它的編碼間隔。信源符號的概率決定壓縮編碼的效率,也決定編碼過程中信源符號的間隔,而這些間隔包含在0到1之間。編碼過程中的間隔決定了符號壓縮後的輸出。
給定事件序列的算術編碼步驟如下:
(1)編碼器在開始時將「當前間隔」 [ l, h) 設定為[0,1)。
(2)對每一事件,編碼器按步驟(a)和(b)進行處理
(a)編碼器將「當前間隔」分為子間隔,每乙個事件乙個。
(b)乙個子間隔的大小與下乙個將出現的事件的概率成比例,編碼器選擇子間隔對應於下乙個確切發生的事件相對應,並使它成為新的「當前間隔」。
(3)最後輸出的「當前間隔」的下邊界就是該給定事件序列的算術編碼。
設low和high分別表示「當前間隔」的下邊界和上邊界,coderange為編碼間隔的長度,lowrange(symbol)和highrange(symbol)分別代表為了事件symbol分配的初始間隔下邊界和上邊界。上述過程的實現可用偽**描述如下:
set low to 0
set high to 1
while there are input symbols do
take a symbol
coderange = high – low
high = low + coderange *highrange(symbol)
low = low + coderange * lowrange(symbol)
end of while
output low
算術碼解碼過程用偽**描述如下:
get encoded number
dofind symbol whose range straddles the encoded number
output the symbol
range = symbo.lowvalue – symbol.highvalue
substracti symbol.lowvalue from encoded number
divide encoded number by range
until no more symbols
算術編碼器的編碼解碼過程可用例子演示和解釋。
例1:假設信源符號為,這些符號的概率分別為,根據這些概率可把間隔[0, 1]分成4個子間隔:[0, 0.1], [0.1, 0.5], [0.5, 0.7], [0.7, 1],其中[x,y]表示半開放間隔,即包含x不包含y。上面的資訊可綜合在表03-04-1中。
表03-04-1 信源符號,概率和初始編碼間隔符號a
bcd 概率
0.10.4
0.20.3
初始編碼間隔
[0, 0.1)
[0.1, 0.5)
[0.5, 0.7)
[0.7, 1]
如果二進位制訊息序列的輸入為:c a d a c d b。編碼時首先輸入的符號是c,找到它的編碼範圍是[0.5,0.7]。由於訊息中第二個符號a的編碼範圍是[0, 0.1],因此它的間隔就取[0.5, 0.7]的第乙個十分之一作為新間隔[0.5,0.52]。依此類推,編碼第3個符號d時取新間隔為[0.514, 0.52],編碼第4個符號a時,取新間隔為[0.514, 0.5146],…。訊息的編碼輸出可以是最後乙個間隔中的任意數。整個編碼過程如圖03-04-1所示。
圖03-04-1 算術編碼過程舉例
這個例子的編碼和解碼的全過程分別表示在表03-04-2和表03-04-3中。
表03-04-2 編碼過程
步驟 輸入符號
編碼間隔
編碼判決1c
[0.5, 0.7]
符號的間隔範圍[0.5, 0.7] 2a
[0.5, 0.52]
[0.5, 0.7]間隔的第乙個1/103d
[0.514, 0.52]
[0.5, 0.52]間隔的最後乙個1/104a
[0.514, 0.5146]
[0.514, 0.52]間隔的第乙個1/105c
[0.5143, 0.51442]
[0.514, 0.5146]間隔的第五個1/10開始,二個1/106d
[0.514384, 0.51442]
[0.5143, 0.51442]間隔的最後3個1/107b
[0.5143836, 0.514402]
[0.514384,0.51442]間隔的4個1/10,從第1個1/10開始
8從[0.5143876, 0.514402]中選擇乙個數作為輸出:0.5143876
表03-04-3 解碼過程
步驟 間隔
解碼符號
解碼判決
1[0.5, 0.7]
c0.51439在間隔 [0.5, 0.7)
2[0.5, 0.52]
a0.51439在間隔 [0.5, 0.7)的第1個1/10
3[0.514, 0.52]
d0.51439在間隔[0.5, 0.52)的第7個1/10
4[0.514, 0.5146]
a0.51439在間隔[0.514, 0.52]的第1個1/10
5[0.5143, 0.51442]
c0.51439在間隔[0.514, 0.5146]的第5個1/10
6[0.514384, 0.51442]
d0.51439在間隔[0.5143, 0.51442]的第7個1/10
7[0.51439, 0.5143948]
b0.51439在間隔[0.51439,0.5143948]的第1個1/10
8解碼的訊息:c a d a c d b
在上面的例子中,我們假定編碼器和解碼器都知道訊息的長度,因此解碼器的解碼過程不會無限制地執行下去。實際上在解碼器中需要新增乙個專門的終止符,當解碼器看到終止符時就停止解碼。
在算術編碼中有幾個問題需要注意:
· 由於實際的計算機的精度不可能無限長,乙個明顯的問題是運算中出現溢位,但多數機器都有16、32或者64位的精度,因此這個問題可使用比例縮放方法解決。
· 算術編碼器對整個訊息只產生乙個碼字,這個碼字是在間隔[0,1]中的乙個實數,因此解碼器在接受到表示這個實數的所有位之前不能進行解碼。
· 算術編碼也是一種對錯誤很敏感的編碼方法,如果有一位發生錯誤就會導致整個訊息譯錯。
算術編碼可以是靜態的或者自適應的。在靜態算術編碼中,信源符號的概率是固定的。在自適應算術編碼中,信源符號的概率根據編碼時符號出現的頻繁程度動態地 進行修改,在編碼期間估算信源符號概率的過程叫做建模。需要開發動態算術編碼的原因是因為事先知道精確的信源概率是很難的,而且是不切實際的。當壓縮訊息 時,我們不能期待乙個算術編碼器獲得最大的效率,所能做的最有效的方法是在編碼過程中估算概率。因此動態建模就成為確定編碼器壓縮效率的關鍵。
此外,在算術編碼的使用中還存在版權問題。jpeg標準說明的算術編碼的一些變體方案屬於ibm, at&t和mitsubishi擁有的專利。要合法地使用jpeg算術編碼必須得到這些公司的許可。
資料壓縮 MPEG音訊編碼
一.實驗原理 2.mpeg 1音訊編碼器框架圖 多相濾波器組 polyphasefilter bank 將pcm 樣本變換到 32個子帶的頻域訊號 如果輸入的取樣頻率為 48khz 那麼子帶的頻率寬度為 48 2 32 0.75hz 心理聲學模型 psychoacousticmodel 計算訊號中不...
huffman編碼實現資料壓縮
huffman編碼壓縮 huffman編碼壓縮的 如下 主方法 public static void main string args 2.統計內容的字元數量,構建list為哈夫曼樹做準備 將統計字元個數的方法封裝 public static list countcharnum byte bytes...
資料壓縮演算法 遊程編碼RLE
了解一下資料壓縮演算法 壓縮演算法主要分為兩類1.有失真壓縮 2.無失真壓縮 有失真壓縮有很多種,這裡說一下無失真壓縮。無失真壓縮演算法 行程編碼 遊程編碼 rle run length encoding 哈夫曼編碼。遊程編碼 例如 資訊單元0304,03表示其後的象素個數是3個,04表示這些象素使...