壓縮算法——FLAC (Free Lossless Audio Codec)編碼原理

1. 簡介

FLAC是一套著名的自由音頻壓縮編碼,其特點是無損壓縮。不同於其他有損壓縮編碼如MP3 及AAC,它不會破壞任何原有的音頻資訊,所以可以還原音樂光盤音質。2012年以來它已被很多軟件及硬件音頻產品(如CD等)所支持。
FLAC是受支持最快且最廣泛支持的無損音頻編解碼器,唯一一種是非專有的,不受專利影響,具有
開源參考實現,具有良好的文檔格式和API,並具有幾種其他獨立實現。

2. 技術特點

  • 無損壓縮:被編碼的音頻(PCM)數據沒有任何信息損失,解碼輸出的音頻與編碼器的輸入的每一個字節都是一樣的。每個數據幀都有一個當前幀的16-bit CRC校驗碼,用於監測數據傳輸錯誤。對整段音頻數據,在文件頭中還保存有一個針對原始未壓縮音頻數據的MD5標記,用於在解碼和測試時對數據進行校驗。
  • 靈活的壓縮策略:與libflac使用是“質量”的參數,該參數變化從0(最快)至8(最小)。雖然在壓縮過程(壓縮文件總是完美的“無損”表示的原始數據)。涉及速度和容量之間的折衷,解碼過程中始終是相當快的,而不是非常依賴於壓縮
  • 快速:FLAC更看重解碼的速度。解碼只需要整數運算,並且相對於大多數編碼方式而言,對計算速度要求很低。在很普通的硬件上就可以輕鬆實現實時解碼。
  • 硬件支持:由於FLAC提供了免費的解碼範例,而且解碼的複雜程度低,所以FLAC是目前少數獲得硬件支持的無損壓縮編碼之一。(APE格式也有少數硬件支持)
  • 可以流化:FLAC的每個數據幀都包含了解碼所需的全部信息。解碼當前幀無需參照它前面或後面的數據幀。FLAC使用了同步代碼和CRC(類似於MPEG等編碼格式),這樣解碼器在數據流中跳躍定位時可以有最小的時間延遲。
  • 可以定位:FLAC支持快速採樣精確定位。這不僅對於播放有益,更使得FLAC文件便於編輯。
  • 富於彈性的metadata:可以定義和實現新類型的metadata數據塊,而不會影響舊的數據流和解碼器的使用。目前已有的metadata類型包括tag,cue表,和定位表。已經註冊的應用程序可以定義自己專用的metadata類型(這一點與MIDI標準相似)。
  • 非常適合於存檔應用:FLAC是一個開放的編碼格式,並且沒有任何數據的損失,你可以將它轉換爲你需要的任何其他格式。除了每個數據幀的CRC和MD5標記對數據完整性的保障,flac(FLAC項目提供的命令行方式編碼工具)還提供了一個verify(校驗)選項,當使用該選項進行編碼的時候,編碼的同時就會立即對已編碼數據進行解碼並與原始輸入數據進行比較,一旦發現不同就會退出並且報警提示。
  • 便於對CD進行備份:FLAC有一個cue表,表內的metadata數據塊用於保存CD的內容列表和所有音軌的索引點。你可以將一張CD保存到一個單一文件,並導入CD的cue表格,這樣一個FLAC文件就可以完整地記錄整張CD的全部信息。當你的原來的CD損壞的時候,你就可以用這個文件恢復出與原來一模一樣的CD副本。
  • 抗損傷:由於FLAC的幀結構,當數據流損壞時,數據損失會被限制在受損的數據幀之內。一般只會丟失很短的一個片段。而很多其他無損音頻壓縮格式在遇到損壞時,一個損壞就會造成後面所有數據丟失。

3. 解碼原理

解碼器主要由五個模塊組成,如下圖所示。


一、解碼頭信息,碼流輸入解碼器,解碼出碼流中的比特率、採樣率等信息,並將殘差信號編碼碼流輸入到下一步的嫡解碼器

二、嫡解碼,嫡解碼器依據上級傳來的碼流信息以解碼殘差信號

三、解碼,由殘差信號和預測係數恢復原始音頻信號

四、立體聲處理,由碼流中的聲道設置信息恢復立體聲的左右聲道信號

五、格式化輸出,將左右聲道按需求格式輸出。


3.1 LPC

線性預測(linear prediction)是指用P個已知的樣值的某種線性組合來預測未知的樣值。多用於語音信號處理中,用前面的採樣值的線性組合來估計離散時間域信號。在數字語音處理中,線性預測經常成爲線性預測編碼(LPC),可以作爲濾波器理論的一部分。

假設已知n時刻前p個樣點的語音信號值爲x(n-1), x(n-2)…, x(n-p), 則x(n)的估計值爲:

 其中,ai是預測係數,p爲預測階數,預測誤差爲:

3.2 Golomb

對於任一待編碼的非負正整數N,Golomb編碼將其分爲兩個部分:所在組的編號GroupID以及分組後餘下的部分,GroupID實際是待編碼數字N和參數m的商,餘下的部分則是其商的餘數,具體計算如下:

q=N/m

r=N%m

對於得到的組號q使用一元編碼(Unary code),餘下部分r則使用固定長度的二進制編碼(binary encoding)。

一元編碼(Unarycoding)是一種簡單的只能對非負整數進行編碼的方法,對於任意非負整數num,它的一元編碼就是num個1後面緊跟着一個0。例如:

num

Unary coding

0

0

1

10

2

110

3

1110

4

11110

5

111110


使用一元編碼編碼組號也就是商q後,對於餘下的部分r則有根據編碼數字大小的不同有不同的處理方法。

  • 如果參數m是2的次冪(這也是下面將要介紹的Golomb-Rice編碼),則使用取r的二進制表示的低log2(m)位,作爲r的碼字
  • 如果參數m不是2的次冪,如果m不是2的次冪,設b=⌈log2(m)⌉
  • 如果r<2b−m,則使用b-1位的二進制編碼r。
  • 如果r≧2b−m,則使用b位二進制對r+2b−m進行編碼

FLAC takes advantage of the fact that the error signal generally has a Laplacian (two-sided geometric) distribution, and that there are a set of special Huffman codes called Rice codes that can be used to efficiently encode these kind of signals quickly and without needing a dictionary。


發佈了25 篇原創文章 · 獲贊 60 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章