田學民,張曉境
(河北工業大學 信息工程學院,天津 300401)
在MP3播放器的設計時,提高音質的一個關鍵因素還在與MP3解碼技術,因為播放器必須先通過解碼模塊進行MP3解碼,所以解碼技術的研究是MP3研究的一個關鍵環節。目前國內的基于FPGA的MP3硬件解碼的研究還不是很多,而且基本都是只針對解碼系統中的幾個關鍵環節進行硬件加速的SOC設計,而對于整個MP3解碼系統的硬件實現就更少了。因此,本文的重點就是研究MP3解碼算法。
在進行MP3解碼時,輸入的經過壓縮的比特流首先要進行碼流解碼。檢測數據流中的同步字來確定一幀數據的開始,提取幀頭信息,從而得到相應的解碼參數,同時分離邊信息和主數據,通過對邊信息數據解碼可得到哈夫曼解碼信息和反量化信息,主數據就可以根據哈夫曼解碼信息解碼出量化之后的頻率線數據[1]。提取出的頻率線信息經過反量化、重排序、聯合立體聲處理、混疊重建、反離散余弦變換(IMDCT)、頻率反轉、合成多相濾波器組處理后就可以得到原始的PCM音頻信號。
編碼后的MP3數據以幀為單位,每一幀又分為兩個粒度。這兩個粒度在解碼時相對獨立,從每一粒度中可以解碼出576個PCM數據,2個粒度一共可以解出1 152個PCM數據[2]。MP3音頻幀的主數據包括比例因子和Huffman碼字。由邊帶信息參量可計算出單個聲道內比例因子的總長度(part2_length),用參量 part2_3_length減去此值便可得到Huffman碼字的總長度。Huffman解碼還原出的576條頻率線從低頻到高頻分為3個區域:大值區、小值區和零值區,如圖1所示。

圖1 Huffman碼字結構圖Fig.1 Chart of Huffman code
只有大值區和小值區的頻率線會出現在MP3碼流中,零值區的頻率線的值全為0,因此不用編碼也不必出現在碼流中,解碼時只需對零值區的頻率線補0,直至得到576個解碼值。Huffman解碼得到的頻域值按比例因子頻帶從低到高排列[3]。
反量化過程是基于Huffman解碼得到的頻率線進行的。記Huffman解碼結果為is,反量化計算結果為xr,其計算公式如下所示[4]。
長窗中的數據用下面的公式進行反量化:



短窗中的數據的反量化公式為:
在反量化公式中,頻譜值is,首先提高到原來的4/3次冪,補償編碼時的幅度衰減。之后再乘以符號位sign(is)。global_gain變量是每聲道中的全局量化步長?!?10”是一個系統常數,保證合適的量化步長,同時也保證編碼過程中不會出現全“1”而擾亂同步字。在編碼器中比例因子采用對數量化的形式,步長為2或,用 scalefac_scale表示,若 scalefac_scale=O 則 scalefac_multiplier=0.5,否則 scalefae_multiplier=1。preflg和pretab只在長窗中有效。preflag是高頻預加重標志,“1”表示采用高頻頇加重,pretab[sfb]的作用是查表得出每個頻率子帶的預加重值。scalefacse_l和scalefac_s對應縮放因子解碼中所得出的長短窗的縮放因子。當運用短窗時,subblock_gain變量對應子帶中更細的量化。變量win_switch_flag和block type確定是否重排序。
在MP3編碼算法的MDCT步驟中,長塊類型的頻域值按頻率由低到高排列;短塊類型的頻域值是按比例因子頻帶、頻率、窗的順序排列的。但是為了提高Huffman編碼效率,短塊類型的數據會重新排列,順序是比例因子頻帶、窗、頻率[5]。重排序不會改變頻率線的頻帶歸屬,即該頻帶內的頻域值重排后仍屬于原來的比例因子頻帶。而且,該頻帶的第一條頻率線在重排后仍是第一條頻率線,最后一條頻率線在重排后仍是該頻帶的最后一條頻率線。
采用MS立體聲模式時,碼流中傳送的是中間/旁邊(middle/side)聲道值M/S,而不是左/右聲道L/R。當左右聲道值L/R很接近時,如編碼公式(3)所示,計算得到的M值相當于均值,而S值幾乎為0。因此當2個聲道高度相關時,采用這種立體聲編碼模式可以減少編碼后的比特數[6]。
編碼公式如下所示,

解碼時,原始的左右聲道值UR的重建公式為:

在MS立體聲處理算法進行硬件實現時,把式(4)進行如下變換:

當立體聲處理進行到左右聲道的零值區重疊處時,此后的左右聲道頻率線值全部為0,可以無需繼續計算直接得到結果0,以減少數據計算量。
純長塊類型數據和混合塊類型的長塊部分需要進行混疊重建。對于混合塊類型,前兩個子帶屬于長塊,因此只需做一組蝶形運算。
對于純長塊類型的32個子帶,有31個子帶間隔,需要進行三十一組運算,即上個子帶的后8個頻域值和下個子帶的前8個頻域值進行獨立的8次蝶形運算。每次蝶形計算的輸入記為 xu、xd,輸出記為 xu′、xd′,計算公式如式(6)所示,其中的cs和ca參數由MP3音頻標準給出[7]。

屬于零值區的子帶無需進行蝶形計算即可直接給出0值結果,因此混疊重建算法在硬件實現時,仍可以利用頻率線的零值區特性來減少數據運算量。
IMDCT的變換公式為:

IMDCT是MDCT的反變換,是MP3解碼過程中的一個非常重要和運算量極大的過程,它們在實際的硬件中的運算量都非常的大,所以要對公式來進行變形,以尋求一些快速算法。
在硬件實現中,我們選擇遞歸算法作為硬件實現IMDCT的方法。雖然遞歸算法簡單易實現,但它的運算量還是比較大,所以可以采用改進的遞推算法以減少運算量[8]。
優化算法的推導:

由三角函數的對稱性可知:y(n)=-y(N-1-N),n=0,1,…,M-1
因此,只需計算M點的 y(n),便可求出 x(n)。 這樣便減少了一半的運算量。采用正弦遞歸的方法來計算u(n):



文中分析研究了整個MP3編解碼系統流程,然后對IMDCT選擇了宜于硬件實現的遞歸算法,并給出了基于遞歸算法的優化算法,在減少硬件資源的同時保持了運算速度。通過MATLAB仿真工具驗證,優化算法完全正確。
[1]汪勇,熊前興.MP3文件格式解析[J].計算機應用與軟件,2004(12):126-128.
WANG Yong,XIONG Qian-xing.MP3 file format analysis[J].Computer Application and Software,2004(12):126-128.
[2]劉宇.基于FPGA的MP3播放器的設計與實現[D].沈陽:東北大學,2009.
[3]毛利萍.MP3音頻編解碼運算中IMDCT算法研究及其FPGA實現[D].上海:華東師范大學,2007.
[4]葉曉舟,鄧峰,曾學文,等.基于定點DSP的MP3解碼算法優化與實現[J].計算機工程與應用,2007,43(23):94-96.YE Xiao-zhou,DENG Feng,ZENG Xue-wen,et al.MP3 decoding optimization algorithm and implementation based on the fixed point DSP[J].Computer Engineering and Application,2007,43(23):94-96.
[5]張多利,杜伏慧,杜高明,等.MP3音頻解碼器的硬件設計與FPGA實現[J].中國科技論文在線精品論文,2009,2(18):1879-1883.
ZHANG Duo-li,DU Fu-hui,DU Gao-ming,et al.A case study on hardware architecture and FPGA prototype implementation of MP3 audio decoder[J].Highlights of Sciencepaper Online,2009,2(18):1879-1883.
[6]蘇祖輝.IMDCT在MPEG/Audio-1 LayerⅢ中的遞歸實現[D].合肥:合肥工業大學,2005.
[7]蔣學鑫.MP3實時編解碼系統的研究與開發[D].成都:電子科技大學,2007.
[8]鄧寧,周源華,郭凱.運用遞歸算法實現共同的MDCT和IMDCT結構[J].電聲技術,2009,(2):5-7.
DENG Ning,ZHOU Yuan-hua,GUO Kai.Implementation of common MDCT and IMDCT structure with the recursive algorithm[J].Electroacoustic Technology,2009(2):5-7.