趙羽佳,羅紅杰,呂 強(qiáng)
(武漢輕工大學(xué)電氣與電子工程學(xué)院,湖北武漢430023)
WMA和MP3格式作為國(guó)內(nèi)知名的音頻壓縮格式,以其良好的特性在很多領(lǐng)域得到了廣泛的應(yīng)用。由于WMA算法沒(méi)有公開(kāi),除了微軟公司提供解碼程序外,F(xiàn)Fmpeg項(xiàng)目組用逆向工程的方法開(kāi)發(fā)出了WMA解碼,Mplayer用的就是這個(gè)解碼,但是將該解碼程序移植到mini2440開(kāi)發(fā)板后,解碼效果不理想。mini2440開(kāi)發(fā)板采用專業(yè)穩(wěn)定的CPU內(nèi)核電源芯片和復(fù)位芯片來(lái)保證系統(tǒng)運(yùn)行時(shí)的穩(wěn)定性[1]。它是一款真正低價(jià)實(shí)用的ARM9開(kāi)發(fā)板,性價(jià)比高,采用Samsung S3C2440為微處理器。下面就以mini2440為開(kāi)發(fā)板,對(duì)Mplayer中的WMA解碼程序進(jìn)行優(yōu)化。
優(yōu)化設(shè)計(jì)的多媒體播放器是基于嵌入式Linux而設(shè)計(jì)的,嵌入式linux是裁剪修改版的linux操作系統(tǒng),它由一個(gè)Kernel(內(nèi)核)以及一些根據(jù)需要而定制的系統(tǒng)模塊組成,Kernel一般只有幾百kB,即便加上其它必須的應(yīng)用程序和模塊,所需的存儲(chǔ)空間也很?。?]。具有多線程、多任務(wù)、源碼開(kāi)放等優(yōu)點(diǎn)。
開(kāi)發(fā)嵌入式Linux的運(yùn)行環(huán)境是開(kāi)發(fā)板,開(kāi)發(fā)環(huán)境是宿主機(jī)。宿主機(jī)(Host)是一臺(tái)通用計(jì)算機(jī),它通過(guò)以太網(wǎng)接口或者串口與目標(biāo)機(jī)通信[3]。宿主機(jī)的軟硬件資源比較豐富,能夠大大提高嵌入式應(yīng)用軟件的開(kāi)發(fā)速度和效率。目標(biāo)板(Target)是應(yīng)用程序?qū)嶋H運(yùn)行的平臺(tái),或者是能夠替代實(shí)際運(yùn)行環(huán)境的仿真系統(tǒng)。軟硬件資源通常都比較有限[4]。本文的宿主機(jī)采用Windows 7操作系統(tǒng)并安裝了VMware虛擬機(jī)、目標(biāo)板是mini2440開(kāi)發(fā)板,并采用串口通信進(jìn)行開(kāi)發(fā)。
Linux內(nèi)核:Red Hat4.5.1-4。編譯工具:gcc4.5.1。交叉編譯工具:arm-linux-gcc3.4.1。
硬件平臺(tái):普通 PC機(jī)。運(yùn)行環(huán)境:arm-linuxgcc(版本:4.5.1)。圖形用戶界面平臺(tái):Qt/Embedded 2.3.7。硬件平臺(tái):mini2440 開(kāi)發(fā)板。
1.2.1 引導(dǎo)加載程序
在PC機(jī)中系統(tǒng)加電時(shí)運(yùn)行的第一段代碼就是引導(dǎo)加載程序,PC機(jī)中的引導(dǎo)加載程序由BIOS和OS Loader組成,PC機(jī)中的BIOS主要任務(wù)是初始化電腦設(shè)備,它將第一個(gè)檢索到的硬盤上MBR中的內(nèi)容讀到系統(tǒng)RAM中,接著由OS Loader來(lái)完成第二級(jí)引導(dǎo)加載操作[5]。由OS Loader負(fù)責(zé)將所要引導(dǎo)的操作系統(tǒng)的內(nèi)核映象從硬盤上讀到系統(tǒng)RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)上。但是在Linux嵌入式系統(tǒng)中,一般沒(méi)有BIOS程序,因而將由Boot-Loader來(lái)完成系統(tǒng)的加載過(guò)程。
1.2.2 交叉編譯開(kāi)發(fā)環(huán)境建立
交叉編譯就是一臺(tái)機(jī)器中執(zhí)行的程序不是在本機(jī)器編譯生成,而是由另一臺(tái)的機(jī)器編譯生成。一般把前者稱為目標(biāo)機(jī),后者稱為宿主機(jī)[6]。在嵌入式系統(tǒng)中,開(kāi)發(fā)板就是目標(biāo)機(jī),而PC機(jī)就是宿主機(jī)。在PC機(jī)上編譯好可以在開(kāi)發(fā)板上運(yùn)行的程序后,通過(guò)串口線或網(wǎng)線將程序下載到開(kāi)發(fā)板,然后通過(guò)PC機(jī)上的超級(jí)終端來(lái)控制開(kāi)發(fā)板中程序的運(yùn)行。交叉編譯開(kāi)發(fā)模型如圖1所示。
圖1 交叉編譯開(kāi)發(fā)模型
嵌入式交叉編譯環(huán)境的建立過(guò)程如下。
1)下載預(yù)先編譯好的交叉開(kāi)發(fā)環(huán)境到根目錄下。
2)執(zhí)行如下命令安裝:tar xzvf arm-linux-gcc-4.3.2.tar.gz-C。
3)生成的編譯工具在目錄/user/local/arm/4.3.2/bin下。
4)添加環(huán)境變量:進(jìn)入/etc/profile,添加export PATH=/user/local/arm/4.3.2/bin:$PATH。
5)驗(yàn)證編譯環(huán)境是否建立成功:輸入命令#armlinux-gcc-v,如果看到版本信息,表示建立成功。
下載 MPlayer-1.0rc2.tar.bz2 和 libmad-0.15.1b.tar.gz文件,通過(guò) configure配置完成后,執(zhí)行make命令完成編譯。這里注意,MPlayer 1.0已經(jīng)把大部分解碼庫(kù)都自帶了,但是自帶的音頻庫(kù)在S32440下效果非常不好,換成使用libmad效果不錯(cuò)[7]。在配置信息中要加上--disable-mp3lib不配置mp3lib。
雖然MPlayer提供了WMA解碼程序,但MPlayer提供的WMA解碼程序運(yùn)算量大,移植到本硬件平臺(tái)后,解碼效率不能滿足設(shè)計(jì)要求。因此需要對(duì)MPlayer中的WMA開(kāi)源解碼程序進(jìn)行優(yōu)化設(shè)計(jì),從而使WMA解碼程序在2440中的解碼效率得到提高。本文選用浮點(diǎn)轉(zhuǎn)定點(diǎn)的方法和快速除法進(jìn)行WMA解碼器的優(yōu)化。
S3C2440不具有浮點(diǎn)運(yùn)算單元(FPU),在實(shí)現(xiàn)浮點(diǎn)運(yùn)算時(shí)需要用軟件模擬的方法來(lái)實(shí)現(xiàn),然而WMA的解碼過(guò)程需要大量的浮點(diǎn)運(yùn)算[8]。浮點(diǎn)運(yùn)算存儲(chǔ)格式特殊,在進(jìn)行浮點(diǎn)運(yùn)算的時(shí)候要用到復(fù)雜的操作,這種方式效率不高,運(yùn)算量大。然而定點(diǎn)運(yùn)算就相對(duì)簡(jiǎn)單一些,本文的優(yōu)化方法之一就是浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算。
2.1.1 浮點(diǎn)轉(zhuǎn)定點(diǎn)分析
在計(jì)算機(jī)內(nèi)部表示小數(shù)時(shí),小數(shù)的小數(shù)點(diǎn)位置是可變的。而對(duì)于定點(diǎn)數(shù)而言,小數(shù)點(diǎn)的位置就是固定的。如C語(yǔ)言中float類型的數(shù)就是浮點(diǎn)數(shù)。基于IEEE754的浮點(diǎn)數(shù)包括3種:單精度浮點(diǎn)數(shù)、雙精度浮點(diǎn)數(shù)和擴(kuò)展精度浮點(diǎn)數(shù),本文只討論前兩者。單精度浮點(diǎn)數(shù)在計(jì)算機(jī)中占4個(gè)字節(jié),用32位二進(jìn)制描述,其中符號(hào)位S占1個(gè)位、指數(shù)位E占8位、尾數(shù)位M占23位,如圖2所示。
圖2 單精度存儲(chǔ)格式
雙精度浮點(diǎn)數(shù)在計(jì)算機(jī)中占8個(gè)字節(jié),用64位二進(jìn)制描述,同樣包含3個(gè)構(gòu)成字段,其中符號(hào)位S占1位、指數(shù)位E占11位、尾數(shù)位M占52位。對(duì)其進(jìn)行重新編號(hào)。其中0—51位代表52位尾數(shù),52—62位代表11位的指數(shù),最高位代表符號(hào)。
通過(guò)內(nèi)聯(lián)函數(shù)或宏定義來(lái)實(shí)現(xiàn)浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算,一般情況下轉(zhuǎn)換后的定點(diǎn)數(shù)為int型,有32位,低16位為尾數(shù)部分,高16位為整數(shù)部分。如果兩個(gè)定點(diǎn)數(shù)都帶有16位尾數(shù),那么這兩個(gè)定點(diǎn)數(shù)相乘,結(jié)果會(huì)帶有32位尾數(shù),這時(shí)需要將結(jié)果右移16位。如果浮點(diǎn)數(shù)轉(zhuǎn)定點(diǎn)數(shù)時(shí)超過(guò)了定點(diǎn)數(shù)的取值范圍時(shí),將不進(jìn)行轉(zhuǎn)換。如果沒(méi)有超過(guò)定點(diǎn)數(shù)的范圍則進(jìn)行轉(zhuǎn)換,如圖3所示。
圖3 32位定點(diǎn)數(shù)相乘過(guò)程處理
2.1.2 用定點(diǎn)運(yùn)算優(yōu)化解碼函數(shù)
在具體優(yōu)化的過(guò)程中,首先要對(duì)程序的工作流程進(jìn)行分析。找出解碼過(guò)程中耗時(shí)最長(zhǎng)的程序段進(jìn)行優(yōu)化,直到解碼時(shí)間低于某個(gè)值為止。MPlayer解碼WMA文件是通過(guò)調(diào)用FFMPEG的開(kāi)源編解碼庫(kù)libaVcodec來(lái)實(shí)現(xiàn)的。MPlayer主程序調(diào)用WMA解碼函數(shù)過(guò)程如圖4所示。
圖4 WMA主要解碼函數(shù)及其關(guān)系
通過(guò)調(diào)試代碼,發(fā)現(xiàn)在解碼每幀時(shí),函數(shù)wma_decode_block()都會(huì)被循環(huán)調(diào)用多次,并且每次調(diào)用的耗時(shí)都很長(zhǎng),所以這個(gè)函數(shù)就是我們最先要優(yōu)化的代碼[9]。測(cè)量解碼時(shí)間需要在mplayer的主函數(shù)main.c中設(shè)置一個(gè)打印函數(shù)對(duì)其進(jìn)行時(shí)間測(cè)試,發(fā)現(xiàn)函數(shù)fft_calc(&s→fft,z)耗時(shí)最長(zhǎng),進(jìn)而讀這個(gè)函數(shù)的實(shí)現(xiàn)代碼發(fā)現(xiàn),z是個(gè)浮點(diǎn)數(shù),且在計(jì)算中有大量涉及浮點(diǎn)計(jì)算的循環(huán),這樣浮點(diǎn)轉(zhuǎn)定點(diǎn)的優(yōu)化方法就有了用武之地了。把z先轉(zhuǎn)化為定點(diǎn)數(shù)再傳給fft_calc(&s→ fft,z)函數(shù),結(jié)果運(yùn)算速度果然明顯提高了。如表1所示,這里采用4個(gè)音頻文件,file1.wma、file2.wma 是比特率為 48 kbps,采樣率為44 kHz,長(zhǎng)度為 20 s的 WMA 文件。file3.wma、file4.wma 是比特率為 48 kbps,采樣率為 44 kHz,長(zhǎng)度為20 s的WMA文件。
表1 優(yōu)化前后解碼耗時(shí)對(duì)比
WMA解碼器經(jīng)過(guò)優(yōu)化后,計(jì)算速度提高了43.78%,在S3C2440上解碼音頻文件基本上達(dá)到實(shí)時(shí)播放的要求。
采用浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算來(lái)優(yōu)化解碼函數(shù),其中浮點(diǎn)轉(zhuǎn)定點(diǎn)是優(yōu)化的關(guān)鍵,優(yōu)化過(guò)程中選擇解碼過(guò)程中耗時(shí)最長(zhǎng)的程序段進(jìn)行優(yōu)化。交叉編譯環(huán)境的建立和mplayer的移植也很重要。通過(guò)優(yōu)化解碼,解碼速度提高了43.78%,使嵌入式開(kāi)發(fā)板也能較好地播放WMA文件。
[1]毛德操,胡希明.嵌入式系統(tǒng):采用公開(kāi)源代碼和StrongARM/XScale處理器[M].浙江:浙江大學(xué)出版社,2003:45-48.
[2]王正萬(wàn).嵌入式Linux下基于ARM9的媒體播放的設(shè)計(jì)[J].電子設(shè)計(jì)工程,2010(12):135-137.
[3]馬龍華,彭哲.基于Scilab的ARM.Linux嵌入式計(jì)算及應(yīng)用[M].北京:科學(xué)出版社,2008:44-52.
[4]Andrew N Sloss,Dominic Symes,Chris Wirght.ARM嵌入式系統(tǒng)開(kāi)發(fā).軟件設(shè)計(jì)與優(yōu)化[M].沈建華譯.北京:北京航空航天大學(xué)出版社,2005:14-37.
[5]Diomidis Spinellis.代碼閱讀方法與實(shí)踐[M].趙學(xué)良譯.北京:清華大學(xué)出版社,2004.
[6]李凡.Qt/Embedded在嵌入式Linux系統(tǒng)下的移植與應(yīng)用[J].黑龍江科技信息,2008,27:79-80.
[7]Srinvas M,Patnaik L M.Adaptive probability of crossover and mutation in genetic algorithms[J].IEEE Trans on SMC,1994,24(4):656-667.
[8]段玉倩,賀家李.遺傳算法及其改進(jìn)[J].電力系統(tǒng)及其自動(dòng)化學(xué)報(bào),1998,10(1):39-52.
[9]MPlayer.The online documentation of MPlayer[EB/OL].(2008-04-01)http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.thml.