劉華,劉衛(wèi)東,2,邢文峰
(1.中國海洋大學(xué)信息科學(xué)與工程學(xué)院,山東青島266100;2.海信電器股份有限公司山東青島266071;3.青島海信信芯科技有限公司山東青島266071)
MP3全稱是MPEG-1 Audio Layer-3,是一種音頻文件的壓縮標(biāo)準(zhǔn),是有損壓縮。MPEG音頻層根據(jù)壓縮質(zhì)量和編碼復(fù)雜程度劃分為3層,即Layer1、Layer2、Layer3,分別對(duì)應(yīng)MP1、MP2、MP3這3種音頻文件,并根據(jù)不同的用途,使用不同層次的編碼。MPEG音頻編碼的層次越高,編碼器越復(fù)雜,壓縮率也越高,在音質(zhì)沒有明顯損失的情況下,MP1和MP2的壓縮率分別為4:1和6:1-8:1,而MP3的壓縮率則高達(dá)10:1-12:1。MP3是根據(jù)心理聲學(xué)模型,利用人耳聽覺特性進(jìn)行音頻壓縮[1-2]。對(duì)音頻文件盡量壓縮同時(shí)盡量保持好的音質(zhì)。
MP3的編碼格式是以一幀為單位的,每幀的數(shù)據(jù)是獨(dú)立的。壓縮后MP3數(shù)據(jù)也是以一幀為單位的。每幀分為兩個(gè)顆粒度,每一顆粒度在解碼時(shí)也是相對(duì)獨(dú)立的,每一顆粒度由576個(gè)PCM采樣數(shù)據(jù)組成,即每幀由1 152個(gè)PCM采樣數(shù)據(jù)組成。每一幀的比特?cái)?shù)是不一定的,每一幀的比特?cái)?shù)=(采樣數(shù)×比特率)/采樣率。采樣率有44.1 kHz,48 kHz,32 kHz 3種情況,比特率的范圍是從32 kb/s到320 kb/s[3]。
每一幀數(shù)據(jù)包括4部分:幀頭(4個(gè)字節(jié))、冗余校驗(yàn)數(shù)據(jù)(2個(gè)字節(jié))、音頻數(shù)據(jù)、輔助數(shù)據(jù)。
幀頭信息包括同步信息、版本、層、CRC校驗(yàn)、位率索引、采樣率索引、空白字、私有標(biāo)志、立體聲模式、保留位、版權(quán)標(biāo)志、原始媒體和強(qiáng)調(diào)方式等。音頻數(shù)據(jù)包括幀邊數(shù)據(jù)和主數(shù)據(jù)。
幀邊信息主要用來為解碼當(dāng)前幀的比特流和為頻點(diǎn)數(shù)據(jù)轉(zhuǎn)換到時(shí)域數(shù)據(jù)提供信息,包括主數(shù)據(jù)的開始位置,私有位,兩個(gè)顆粒度共有選擇信息,主數(shù)據(jù)位數(shù),大值,全局增益,比例因子壓縮,窗切換標(biāo)志,塊類型,混合塊標(biāo)志,表選擇,子塊增益,預(yù)標(biāo)志,區(qū)域0計(jì)數(shù),區(qū)域1計(jì)數(shù)等。
Mpeg1 layer 3的流的主數(shù)據(jù)格式如圖1所示:
圖1 主數(shù)據(jù)結(jié)構(gòu)圖Fig.1 Diagram of MP3 data
小值區(qū)是量化后頻點(diǎn)的絕對(duì)值不超過1的區(qū)域,即只有-1,0,+1共3種量化系數(shù),剩下的為大值區(qū)。
1.2.1 MP3解碼流程圖
圖2 MP3解碼一幀數(shù)據(jù)的流程圖Fig.2 Flow chart of decoding one frame of MP3
1.2.2 MP3解碼過程
由圖2可知,MP3解碼過程主要包括找同步頭、解頭邊信息和CRC校驗(yàn)、解碼縮放因子、解碼Huffman數(shù)據(jù)、反量化、重排序、立體聲解碼、混淆縮減、IMDCT變換、頻率反轉(zhuǎn)、合成多相濾波器,最后輸出PCM采樣數(shù)據(jù)。以下簡(jiǎn)述MP3解碼的步驟[4]。
找同步頭即找出幀頭在比特流中的位置,幀頭為12比特的“1111 1111 1111”即0xfff。頭、邊信息和縮放因子信息都是用于以后的解碼過程,包括一幀的特征信息(采樣率、比特率等)各個(gè)參數(shù)等,縮放因子主要用于Huffman數(shù)據(jù)進(jìn)行反量化的過程。Huffman解碼過程是通過邊信息得到Huffman碼表,從而查到Huffman數(shù)據(jù),此時(shí)的Huffman數(shù)據(jù)是576個(gè)頻率線。反量化過程根據(jù)縮放的公式和幀邊信息,對(duì)于不同的塊類型用不同的縮放公式以恢復(fù)576個(gè)頻率線量化前的值,此時(shí)還是頻域范圍內(nèi)的數(shù)值。重排序是針對(duì)短塊進(jìn)行的,經(jīng)反量化后得到的頻率值不是按時(shí)間順序排列的,重排序就是將頻率值按時(shí)間順序重新排列,重排序按窗、子帶、頻帶順序進(jìn)行排序。立體聲解碼是根據(jù)幀邊信息和立體聲解碼公式將每一聲道的真實(shí)的頻率值恢復(fù)出來?;煜s減是對(duì)于長(zhǎng)塊和混合塊的長(zhǎng)塊部分來說的,用迭代運(yùn)算去除兩個(gè)子帶頻帶之間的混迭現(xiàn)象。IMDCT變換經(jīng)過IMDCT、加窗、疊加運(yùn)算變換成時(shí)域內(nèi)的值。頻率反轉(zhuǎn)是將頻率反轉(zhuǎn)的數(shù)值乘以-1進(jìn)行反轉(zhuǎn)補(bǔ)償。合成多相濾波器是將32個(gè)子帶的樣值通過矩陣運(yùn)算得出64個(gè)中間值,然后將這64個(gè)中間值放入一個(gè)長(zhǎng)度為1024的FIFO緩沖區(qū),經(jīng)過抽取、加窗等運(yùn)算得到最終的32個(gè)時(shí)域的信號(hào)值。
MP3音頻解碼可以分為軟件實(shí)現(xiàn)和硬件實(shí)現(xiàn)兩種方式,軟件實(shí)現(xiàn)的優(yōu)點(diǎn)是靈活,修改方便,研發(fā)速度快,缺點(diǎn)是解碼速度慢;硬件實(shí)現(xiàn)則剛好相反,優(yōu)點(diǎn)是解碼速度快,缺點(diǎn)是成本高并且不夠靈活,設(shè)計(jì)好后不能再進(jìn)行修改。軟硬件協(xié)同設(shè)計(jì)可以充分利用軟硬件各自的優(yōu)點(diǎn),使系統(tǒng)既有很高的運(yùn)算能力,又不失靈活性[5-7]。
Huffman解碼模塊在MP3解碼整個(gè)過程占有較大的運(yùn)算量,目前針對(duì)這一部分的優(yōu)化思路較少,本文采用了軟硬件協(xié)同設(shè)計(jì)的方法來實(shí)現(xiàn)MP3的Huffman解碼模塊,采用新的硬件架構(gòu),增加一些特殊的寄存器,實(shí)現(xiàn)一些針對(duì)MP3Huffman解碼的特殊指令來優(yōu)化Huffman解碼過程[8-9]。
增加的寄存器有MP3_HEAD,MP3_PTR,MP3_OFFSET,MP3_TS。下面說明一下各寄存器的作用。
MP3_HEAD輸入比特流寄存器,32比特,分為高低位兩部分,每部分16比特。解碼時(shí)從MP3_HEAD的高位讀取數(shù)據(jù),當(dāng)讀取的數(shù)據(jù)超過16比特時(shí),就將低16位比特?cái)?shù)據(jù)移動(dòng)到高16位,然后從碼流里面再讀取16比特存入低16位。
MP3_PTR消耗比特流寄存器,存放MP3_HEAD中消耗的比特?cái)?shù)目。
MP3_OFFSET偏移量寄存器,一是第一級(jí)table元素的偏移量,為得到表中所找的元素,二是下一級(jí)table的首地址,即table的偏移量。
MP3_TS取比特?cái)?shù)目寄存器,第一級(jí)table元素的偏移量的比特?cái)?shù)目。
對(duì)Huffman的解碼是通過查Huffman表進(jìn)行的,Huffman表是由分級(jí)的table組成,每一級(jí)table中元素的個(gè)數(shù)由編程者自己確定,如果在當(dāng)前級(jí)的表(table)中沒有查到對(duì)應(yīng)的Huffman碼值,就到下級(jí)表(table)中繼續(xù)查,直到查到Huffman碼值。每個(gè)Huffman表項(xiàng)有16 bit,共有3種情況:
1)find=1,且是大值
3個(gè)表項(xiàng)分別對(duì)應(yīng)著下面huff聯(lián)合體中的3個(gè)結(jié)構(gòu)體:
union huff{
struct{
unsigned short find:1;
unsigned short bits:4;
unsigned short x:5;
unsigned short y:5;
}big_value;
struct{
unsigned short find:1;
unsigned short bits:4;
unsigned short t:2;
unsigned short u:2;
unsigned short v:2;
unsigned short w:2;
}small_value;
struct{
unsigned short find:1;
unsigned short size:4;
unsigned short offset:11;
}not_find;
unsigned short find:1;
};
find是標(biāo)志位,表示是否查找到Huffman碼值,find為1,即查找到Huffman碼值,find為零,即沒查到Huffman碼值;size表示從寄存器MP3_HEAD中取的比特?cái)?shù)目;offset表示table的偏移量,指在table的首地址;bits表示在某一級(jí)table中查找到Huffman碼值,在這一級(jí)table中實(shí)際消耗的比特?cái)?shù)目;x,y,t,u,v,w為Huffman碼值。
Huffman解碼的程序:
void huffdecode(unsigned short*input,unsigned short*output)
{
……
do
{
VLDdec(unsigned short&find,unsigned short*decode_table);
VLDin(unsigned short*input);
}while(!find);
……
if(是大值)
{
Output[i++]=x;
Output[i++]=y;
}
else
{
Output[i++]=t;
Output[i++]=u;
Output[i++]=v;
Output[i++]=w;
}
}
VLDdec是查表指令。decode_table是Huffman碼表的指針,指在第1級(jí)table的首地址。
VLDin負(fù)責(zé)向MP3_HEAD裝入新的碼流數(shù)據(jù),input是1指針,指向碼流消耗的數(shù)據(jù)位置。
Huffman解碼流程圖如圖3所示。
圖3 Huffman解碼流程圖Fig.3 Flow chart of Huffman decoding
Huffman解碼過程分為兩部分,如下分析:
a)VLDdec(unsigned short&find,unsigned short*decode_table);
首先,要進(jìn)行初始化,對(duì)應(yīng)圖3中的初始化。
寄存器MP3_PTR,MP3_OFFSET分別置零,Huffman碼表確定第1級(jí)table的元素偏移量的比特?cái)?shù)目是寄存器MP3_TS的初始化值,其值只有在查找第1級(jí)table的元素用到。從碼流中取32 bit的數(shù)據(jù)存入寄存器MP3_HEAD中,此時(shí)指針input移動(dòng)32 bit。
其次,開始解碼。VLDdec的解碼如圖4所示:
圖4 VLDdec解碼圖Fig.4 Decoding diagram of VLDdec
decode_table指向Huffman碼表的首地址且指針是不移動(dòng)的,從寄存器MP3_TS中得到需要從寄存器MP3_HEAD中取的比特?cái)?shù)目,取得的比特?cái)?shù)據(jù)存放在寄存器MP3_OFFSET中,用來求得元素的偏移量。首地址加上存放在寄存器MP3_OFFSET中的數(shù)據(jù),得到所需查找的第1級(jí)table中的元素。
在該元素中,當(dāng)find=1,即查找到Huffman碼值,若查找到的是大值,則為兩個(gè)值,分別為x,y;若查找到的是小值,則為4個(gè)值,分別為t,u,v,w。bits是在這一級(jí)table中實(shí)際消耗的比特?cái)?shù)目,其值存放到寄存器MP3_PTR中。
在該元素中,當(dāng)find=0,即在這一級(jí)table中沒找到Huffman碼值,則下一級(jí)table的首地址,由該元素中的offset給出,其首地址值存放到寄存器MP3_OFFSET中,再根據(jù)size給出的值,從寄存器MP3_HEAD中得到table中元素的偏移量值,首地址加上偏移量得到這一級(jí)table中要查找的元素,再看find的值依次循環(huán)下去直到查找到Huffman碼值,并且把消耗的MP3_HEAD的比特?cái)?shù)目累加存在寄存器MP3_PTR中。
b)VLDin(unsigned short*input);
VLDin的解碼如圖5所示:
圖5 VLDin解碼圖Fig.5 Decoding diagram of VLDin
當(dāng)解出一組Huffman碼值時(shí),需要判斷是否要向寄存器MP3_HEAD中輸入新的碼流,當(dāng)寄存器MP3_HEAD中消耗的比特?cái)?shù)目大于等于16時(shí),即寄存器MP3_PTR中的值大于等于16,則將寄存器MP3_HEAD中的低16位數(shù)據(jù)移動(dòng)到高16位,然后從碼流中再讀取16比特?cái)?shù)據(jù)存入MP3_HEAD中的低16位,使寄存器MP3_HEAD中始終保持大于等于16比特的有效數(shù)據(jù),以便繼續(xù)解Huffman碼值。
上述的硬件架構(gòu)同樣適用于WMA和AAC音頻格式的Huffman的解碼模塊。下面以WMA為例來說明。
WMA和MP3的Huffman解碼過程是一樣的,只是對(duì)應(yīng)的編碼的碼字不一樣,MP3的Huffman的編碼過程是2個(gè)數(shù)一組或4個(gè)數(shù)一組編碼,WMA的Huffman的編碼過程是編碼成run、level。level是Huffman碼值,run是Huffman碼值是零的個(gè)數(shù),在level之前。所以對(duì)本方案而言,WMA和MP3的不同在于Huffman碼表的table元素的不同。
Huffman查表過程中,一般最多會(huì)在第3級(jí)table中查找到。兩種實(shí)現(xiàn)方法運(yùn)行對(duì)比結(jié)果如表1所示。表1中的純軟件運(yùn)行周期是在ARM7軟件仿真平臺(tái)上進(jìn)行并假定存儲(chǔ)器訪問延遲為零的情況下得出的結(jié)果。從表1可知,用軟硬件協(xié)同設(shè)計(jì)實(shí)現(xiàn)的Huffman解碼過程所用的系統(tǒng)周期大約是純軟件實(shí)現(xiàn)的五分之一,大大提高了解碼效率。
表1 運(yùn)行結(jié)果Tab.1 The operation results
本文使用軟硬件協(xié)同設(shè)計(jì)方法,設(shè)計(jì)了音頻解碼模塊。結(jié)果表明不僅性能優(yōu)于純軟件解碼,且設(shè)計(jì)過程較為簡(jiǎn)化,對(duì)今后的數(shù)字音頻解碼優(yōu)化設(shè)計(jì)具有一定的應(yīng)用價(jià)值。
[1] 陸安江,張正平,岳忠義.一種基于ARM的MP3解碼優(yōu)化設(shè)計(jì)[J].電子測(cè)量技術(shù),2006,29(4):1-3.LU An-jiang,ZHANG Zheng-ping,YUE Zhong-yi.Optimizing design of MPEG-1 layer 3 decoding based on ARM[J].Electronic Measurement Technology,2006,29(4):1-3.
[2] [s.n.]ISO/IEC JTC1/SC29/WG11 MPEG,IS11172-3"Informati on Technology-Coding of Moving Pictures and Associated Audio for Digital Storage Media at up to About 1.5Mbit/s,Part 3:Audio"[EB/OL].(2011-05-12)[2011-06-01].http://dwanfangdata.com.cn/Extenal Resource-shdxx be2001z 10163.aspx.
[3] Andrew N.ARM嵌入式系統(tǒng)開發(fā)之軟件設(shè)計(jì)與優(yōu)化[M].沈建華,譯.北京:北京航空航天大學(xué)出版社,2005.
[4] Patterson D A,Hennessy J L.計(jì)算機(jī)組成和設(shè)計(jì)[M].鄭緯民,譯.北京:清華大學(xué)出版社,2003.
[5] Heinrich M,Mark A D O.Horowitz.hardware/software codesign of the stanford Flash multiprocessor[J].Proceedings of the IEEE,1997,85(3):455-466.
[6] 劉晌,李東曉,姚慶棟,等.面向、HDTV解碼應(yīng)用的RISC核的軟硬件協(xié)同設(shè)計(jì)[C]//中國電子學(xué)會(huì)電路與系統(tǒng)年會(huì)第16屆年會(huì)(ICCAS2001),寧波,2001:352-356.
[7] 戴杰.基于軟硬件協(xié)同的音頻解碼器研究與設(shè)計(jì)[M].天津:天津大學(xué),2008:12-20.
[8] [s.n.]MP3解碼原理[EB/OL].(2010-12-10)[2011-06-03].http://wenku.baidu.com/view/649547 ec102d e2bd960588a5.html.
[9] 吳明暉.基于ARM的嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京:人民郵電出版社,2004.