朱彩霞
(淮安信息職業(yè)技術學院 電子工程學院,江蘇 淮安 223003)
隨著人們對于便攜播放的需求越來越高和集成電路生產(chǎn)工藝的越來越精密,采用軟硬件協(xié)調的方法實現(xiàn)超低功耗音頻解碼已成為一種趨勢。目前,大部分的MP3解碼和WMA解碼都是使用DSP實現(xiàn),該方法的缺點是軟件開發(fā)難度大、功耗也比較大。采用純硬件實現(xiàn)的缺點在于格式擴展不方便、設計周期長和文件兼容性不夠。ARM7TDMI具有成本低、功耗低、代碼密度高和容易開發(fā)等特點。硬件設計具有低功耗、低成本等優(yōu)點,其缺點是一旦生產(chǎn)就不可更改,所以一般設計都是把沒有兼容性需求、計算量大的部分采用硬件設計,而有兼容性需求的部分采用軟件設計[1]。
WMA是微軟公司提出的一種音頻標準,是Microsoft Windows Media技術中的一部分,它包含了對音頻格式的一個完整定義,包括音頻編碼和加密。相比于MP3,它具有更好的高頻音質和更低的壓縮率,相比于AAC,它具有更高的接受度[2],又因為WMA具有DRM版權保護,所以具有更好的市場價值。
圖1給出了WMA的解碼過程,通過游程解碼(Run-Level Decoder)和控制信息解碼得到殘差系數(shù),反量化(Inverse Quantizer)后得到頻域系數(shù),噪聲產(chǎn)生模塊用于生成舒適噪聲以改善頻域過于集中時候的音質,多聲道變換得到立體聲的雙聲道單獨系數(shù),最后通過反重疊變換(Inverse MLT)得到時域音頻信號[3]。
圖1 WMA的解碼過程
在圖1中,Run-Level Decoder和Inverse MLT部分采用硬件實現(xiàn),其它部分采用軟件實現(xiàn)。Run-Level Decoder的運算單位都是BIT,ARM7的指令運算單位都是字節(jié),用軟件的方式會浪費功耗。Inverse MLT 類似FFT運算,該步驟在整個WMA解碼中占大約40%的MIPS,采用硬件會大大減少功耗[4]。
WMA解碼的設計過程如圖2所示。
圖2 WMA解碼的設計圖
ARM7上運行的系統(tǒng)軟件采用UCOS-II + UCFS,采用FAT32文件系統(tǒng),WMA存儲在SD卡中,解碼器首先讀出WMA文件,進行ASF頭解析,判斷其是否為正確的WMA文件,如果是,則繼續(xù)解析ASF頭、Packet、Frame和SubFrame等。
游程解碼的讀碼流文件的過程如表1所示。
讀比特的過程和游程解碼VLC采用硬件設計,RLD解碼器具有兩種功能:一種是ShowBits和GetBits,ShowBits是查看nLength長度比特的數(shù)值,不移動硬件bitstream的指針,GetBits是讀取nLength長度比特的數(shù)值并且移動硬件bitstream的指針;另一種功能是自動解碼VLC的系數(shù),解碼系數(shù)自動寫到SRAM。
在解碼WMA文件時,首先讀出SD卡中的WMA文件,因為WMA文件是ASF格式封裝的,而MP3/FLAC/APE等文件都不是ASF文件,所以通過文件前四個字節(jié)可以檢測文件是否確實是WMA格式的文件,防止錯誤文件解碼。正確文件解碼開始首先通過AHB填寫256個字節(jié)到RLD的內部RAM,稱為初始化過程。
讀比特的過程如下:
uint_32 bs_read( sint_32 i_count )
{
DEC_BSI_UVLC_CTL_REG = (4<<6) | (i_count<<1) | 1 ;
do{
status = DEC_BSI_UVLC_STA_REG ;
}while( (status&1)==0) ;
return (status>>8) ;
}
uint_32 bs_show( sint_32 i_count )
{
DEC_BSI_UVLC_CTL_REG = (5<<6) | (i_count<<1) | 1 ;
do{
status = DEC_BSI_UVLC_STA_REG ;
}while( (status&1)==0) ;
return (status>>8) ;
}
表1 游程解碼語法描述
Run-Level Decoder解碼的流程如圖3所示。
圖3 Run-Level Decoder解碼
首先CPU通過AHB接口填寫256個字節(jié)數(shù)據(jù)到RLD的內部RAM,ShowBits和GetBits時,只需要配置一個寄存器,然后讀取狀態(tài)寄存器,內部運算完成后,讀取數(shù)據(jù)寄存器的內容,每次最多讀取24Bit;
在殘差系數(shù)VLD解碼時,解碼過程不需要CPU干涉,由CPU配置num_coded_coeff參數(shù)到寄存器,然后啟動VLD解碼器,軟件處于等待狀態(tài),如果256個字節(jié)數(shù)據(jù)用完,內部硬件設置標志位并暫停解碼,CPU根據(jù)狀態(tài)寄存器標志位重新填寫256個字節(jié),直到硬件解碼完畢。VLD硬件解碼首先初始化RAM輸出,全部寫0,然后將解碼數(shù)據(jù)寫到RAM中,由CPU來讀取。
LMIT解碼功能示意圖見圖4。
圖4 IMLT解碼功能示意圖
IMLT解碼包含兩個部分,DCT-IV和加窗計算。其中DCT-IV的計算是主要部分,使用了兩個模塊,IMLT根據(jù)CPU配置輸入和輸出的RAM地址,到系統(tǒng)RAM中讀取輸入,把DCT-IV計算后的結果寫到輸入RAM中,加窗計算從輸出RAM的讀取數(shù)據(jù),計算完成后寫回輸出RAM。
DCT-IV的數(shù)學表達如下:
for0≤N<2n
在計算的時候采用快速算法,首先進行preTwiddle,該模塊是把輸入數(shù)據(jù)進行FFT轉換,計算復數(shù)輸入,然后繼續(xù)FFT運算,最后調用postTwiddle把FFT運算的結果轉換為DCT-IV的輸出,這些運算的中間結果都存儲輸出RAM中。
圖5為IMLT硬件解碼圖,其中DCT_IV_CTRL是總體控制模塊,負責和CPU交互,模塊內部包含解碼控制狀態(tài)機,用于啟動和停止四個流程的模塊,在四個模塊的工作全部完成后,產(chǎn)生中斷通知CPU。四個模塊都是采用狀態(tài)機設計,每個模塊之間沒有關系,數(shù)據(jù)的存取都是來自RAM,這樣可以最大限度的實現(xiàn)模塊化設計。
圖5 IMLT硬件解碼圖
實驗過程中測試了大約10個文件,每個文件大約在4分鐘,以對ARM7的時鐘需求為分析標準,實驗分析的結果如表2所示。芯片功耗在同等面積下與芯片工作頻率的成正比,降低芯片工作頻率是優(yōu)化功耗最快的方法,該項設計達到了降低系統(tǒng)功耗的目的。
表2 硬件優(yōu)化比較
本文采用ARM7為CPU,結合游程解碼和DCT-IV硬件計算單元,降低WMA解碼的功耗,為實現(xiàn)便攜式音頻解碼SOC提供了一種開發(fā)速度快、可擴展性強的方法。另外,在后續(xù)的研究中,音頻格式MP3/FLAC/APE等解碼將全部共享RAM,因此在多格式音頻解碼時,該方法能夠更好地降低系統(tǒng)成本。
參考文獻:
[1] Charles D,Murphy,K.Anandakumar.Real-Time MPEG-1 Audio Coding and Decoding on a DSP Chip[J].Trans.on Consumer Electronics,1997,43(1):347-353.
[2] 周錦峰,倪光南.低功耗MP3解碼器設計及其可測性報告[D].北京:中國科學院計算技術研究所,2003.
[3] 張海濱,李揮.基于S3C2410的WMA開源解碼程序優(yōu)化[J].計算機工程與設計,2009,30(1):13-15.
[4] Pramod,Kumar,Meher.LUT optimization for memory-based computation[J].IEEE Transaction on Circuits and System,2010,57(4):285-289.