1.6 非失真壓縮編碼
經由離散餘弦轉換轉換後的能量會集中在幾個低頻係數的數值上,在經量化後,此時只要儲存低頻的係數即可,故於矩陣儲存的順序必須經過調整,如上圖為MPEG-2的鋸齒狀掃描順序,如此可以確保儲存的串列中,後方有一連串的零,增加後續非失真壓縮編碼的壓縮率。
圖6.14 MPEG-2的鋸齒狀掃描順序
對係數值而言,我們對一個畫面中所有的係數值做predictive coding,而後做熵編碼(entropy coding),熵編碼是指非失真壓縮編碼的意思,如Huffman 或Arithmetic coding 等,Entropy encoding包含Variable-length Coding與Run-Level Encoding。對Arithmetic coding值而言,由於各block 中會有很多零值連在一起,此時若先做run-length coding 再加下entropy coding 會更為有利。一般做法為,對Arithmetic coding中每個非零係數做(run, level)的配對表示,其中level 表示此非零係數值的位階,run 則是目前非零係數與上一個非零係數間的零的個數。
表6.2 Run-level Encoding
Run-Level Encoding – 輸入陣列: 16,0,0,-3,5,6,0,0,0,0,-7 – 輸出值 (run,level): (0,16),(2,-3),(0,5),(0,6),(4,-7) level 表示此非零係數值的位階,run 則是目前非零係數與上一個非零係數間的零的個數。 |
最後經由 VLC (variable length coding) 方式如霍夫曼或Arithmetic coding 等。編碼後與動態向量複合產生視訊壓縮編碼。
霍夫曼編碼法(Huffman Coding)是霍夫曼在1952年所提出的一種無失真壓縮技術,其原理是將欲壓縮之字串,先讀一遍,將字串中的每一相異單字元(Single Character)的出現頻率,做成統計,依此建構霍夫曼樹(Huffman’s Tree)。每一相異單字元,用0與1予以編碼,出現次數逾多者,給予較少的位元編碼,由於每個位元的編碼長度不是固定8個bit,故這種編法方式,稱做變動長度編碼,最後將這些位元串組合起來,並加上Huffman’s tree ,就成為壓縮檔案。Huffman編碼法為依資訊源符號出現機率,在對資訊源符號逐一編碼條件下(The symbols be coded one at a time),最佳之編碼方法。
但在實際上不會對每次壓縮重建霍夫曼樹,因為在計算過程中,不同字元出現的機率呈現高度正相關,而建立霍夫曼樹能須花費計算時間,故使用預先計算以霍夫曼為基礎的編碼法(Pre-calculated Huffman-based Coding),假設每次計算霍夫曼樹皆同,使用查表方式直接轉碼。如下圖為MPEG2標準的變動長度編碼表格,我們首先查表查出(run,level)的編碼,後面再跟上該非零編碼。
圖6.15 MPEG2標準的變動長度編碼表格
位元率控制決定了DCT 係數量化過程的粗糙程度。輸出緩衝器平滑了資料流程的輸出,提供了對量化器的控制,來限制資料速率或將其保持在一定水平。一般說來,VBR(variable bit rate)對於提供穩定的影像品量是個更好的選擇。任何情況下,固定的資料速率都只是個概念而已,在過程中給定的掃描線之間,在給定的畫面與畫面之間,資料是變化的,DCT 係數在變化,熵編碼也在變化。
圖6.16 動態向量也是使用變動長度編碼來進一步壓縮
大致上來說,解碼程序恰為編碼的反向。也就是說先經由Huffman/Arithmetic decode 後,做反向量化、IDCT、動態評估、動態預測而得到重建後的序列。