田学民,张晓境
(河北工业大学 信息工程学院,天津 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变量是每声道中的全局量化步长。“210”是一个系统常数,保证合适的量化步长,同时也保证编码过程中不会出现全“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.