文獻標識碼: A
文章編號: 0258-7998(2011)05-0031-04
數字廣播調幅系統DRM(Digital Radio Mondiale)采用先進音頻編碼AAC(Advanced Audio Coding)作為其主要的信源編碼方式[1],,在與模擬調幅廣播同樣的帶寬(9 kHz或10 kHz)下實現了調頻的音質,。DRM不僅解決了模擬調幅廣播抗干擾能力差等缺點,而且在音頻業(yè)務的基礎上又增加了文本,、圖像,、數據等附加業(yè)務,豐富了調幅廣播的內容,,大大提高了調幅廣播的市場競爭力,,成為調幅廣播發(fā)展的必然趨勢。
信源編碼是DRM系統的關鍵技術,,其壓縮節(jié)目音頻源信號,,只需較少的傳輸帶寬就可保證接收端的重建音頻信號有較好的音質。DRM音頻解碼器的實現和優(yōu)化決定了系統能否正確實現音頻解碼,,并完成音頻的實時播放,,使用戶得到良好音質。本文中AAC音頻解碼程序在DSP硬件平臺上運行,,由于硬件平臺性能有限,,要求音解碼器不僅要能確保音頻質量,還要不能占用DSP系統太多的資源,。因此研究DRM音頻解碼器在高性能DSP平臺上的實現及其優(yōu)化具有非常重要的現實意義,。
1 DRM音頻解碼流程
通用MPEG-4 AAC音頻編解碼器的原理和實現技術已經很成熟,不再詳述,。DRM系統的信源編碼方案中所采用的頻帶恢復技術(SBR)提供了類似于MPEG-4 AAC中感知噪聲整形(PNS)模塊的功能,,故DRM系統采用的音頻編碼方案不包括PNS模塊,同時也去除了長期預測(LTP),、采樣率可分級(SSR)等復雜的模塊,,降低了算法復雜度,對處理器的處理能力要求也相對較低,,適合應用于嵌入式開發(fā)平臺上,。AAC的采樣率有12 kHz和24 kHz兩種,5個(12 kHz采樣頻率)或10個(24 kHz采樣頻率)音頻幀組成一個持續(xù)時間固定為400 ms的音頻超級幀,。本文優(yōu)化之前首先在PC機的VC++6.0環(huán)境下實現了DRM廣播信號的正確解碼和實時播放,,測試信號為單聲道、48 kHz采樣,,采用AAC音頻編碼的wav格式的DRM廣播信號源,,其中AAC的采樣率為24 kHz,即一個音頻超幀包含10個子幀,。在VC++6.0環(huán)境下運行整個工程,經同步、解調和信道解碼后獲得DRM信號源中的AAC音頻編碼數據,,在每次AAC子幀解碼前將每子幀數據輸出到一個文件,。在DSP上測試音頻解碼程序時,可以直接提取AAC數據進行解碼,,解碼流程如圖 1所示,。解碼過程如下:
(1)對傳來的AAC子幀數據進行比特流分解,根據DRM系統中音頻子幀結構獲取語法單元,、霍夫曼碼字等各部分的數據,。
(2)進行霍夫曼解碼,這部分用到了一系列的霍夫曼碼書進行查詢解碼,。頻域數據和比例因子的獲得都在這一步,。該過程需要在將順序打亂的碼字重新組合在一起的同時,進行霍夫曼解碼,,并將解碼之后的數據放置到正確的位置上,,準備進行下一步的反量化。
(3)對解碼后的頻域數據進行反量化,。
(4)將反量化的結果乘以(2)中生成的比例因子,。
(5)濾波器組部分。這部分在解碼時采用了逆改進離散余弦變換(IMDCT)[2],,還包括一個加窗的過程和疊加的過程,。功能模塊的輸出為信號的時域值。
2 TMS320C6416的DSP開發(fā)平臺
TMS320C6416(簡稱C6416)[3]是一種高性能的32 bit定點DSP芯片,。本文使用的C6416的工作頻率達到600 MHz,。其特點包括:具有8個功能單元的高級超長指令體系結構的CPU;所有指令有條件執(zhí)行,;支持8/16/32 bit可變長度數據訪問,;支持常用算術運算的飽和與歸一化操作;兩級高速緩存(Cache)存儲器結構及豐富的片內外設,,如增強型直接存儲器訪問EDMA控制器,、多通道緩沖串口McBSP等。C6416開發(fā)板上除C6416 DSP芯片外,,還帶有外擴的512 K×8 bit的FLASH,。
開發(fā)環(huán)境采用DSP集成開發(fā)環(huán)境CCS(Code Composer Studio),它集成了代碼編輯,、編譯,、工程管理、代碼生成與調試,、代碼性能剖析,、數據查看,、繪制數據圖像、DSP/BIOS參數設置,,以及提供各種優(yōu)化建議等工具模塊,。
3 音頻解碼程序的優(yōu)化
本文優(yōu)化之前先在PC機VC++6.0環(huán)境下實現了DRM廣播信號的正確解碼和實時播放,但移植到DSP平臺之后不能實時播放,。本文單獨將音頻解碼部分的程序移植到DSP開發(fā)平臺CCS3.1開發(fā)環(huán)境中,,測試數據為前文中存儲的AAC解碼前每子幀的數據。優(yōu)化前,,不帶有SBR解碼的情況下,,音頻解碼程序中一個音頻超幀里每個子幀解碼所花費的周期數,即運行效率如下:
子幀1:1 901 300 子幀2:3 667 994
子幀3:3 469 783 子幀4:3 397 752
子幀5:1 745 753 子幀6:3 416 357
子幀7:3 439 464 子幀8:3 331 484
子幀9:1 721 339 子幀10:1 764 605
(共計27 855 831周期)
在DSP上單獨測試音頻解碼的效率,,計算所花費的時鐘周期數的語句如下:
st=clock( ); aac_frame_decode(, , , ); end=clock(); printf("clock cost %d\n",end - st);
其中aac_frame_decode( )是信道解碼與音頻解碼的接口函數,,該函數調用AAC解碼程序,在此,,其參數與返回值已省略,。在CCS環(huán)境下,運行程序前點擊Profile剖析菜單下Clock選項中的Enable,,就打開了CCS的程序運行周期計數功能,。兩次clock函數調用返回值之差就是解碼函數花費的周期數。表1是利用CCS3.1中Profile工具分別計算的程序優(yōu)化前后一個超幀解碼過程中每個函數所花費的周期數,。
優(yōu)化的本質是提高程序的運行效率,,同時保持程序原有功能準確無誤。本文針對本課題中的具體問題,,提出以下對應的優(yōu)化措施:
(1)去除原程序中用不到的函數,。最初的音頻解碼程序是針對所有MPEG-4 AAC標準使用的,其中包含了很多功能模塊,,如MP4解碼,、PNS解碼、LTP解碼等,。這些功能在DRM系統的音頻編碼標準AAC中是用不到的,,所以應當將它們去除,否則其生成的代碼不僅無用,,而且會占用大量存儲空間,。在CCS3.1中點擊Profile菜單下的Analysis Toolkit選項中的Code coverage and Exclusive Profiler,按照提示運行程序,,可以得到一個Excel文件,。該文件將代碼覆蓋程度、每個函數調用次數以及執(zhí)行函數CPU所花費的周期數等展示出來,,從而可以方便地找到每個文件中一直沒有運行的函數,,去除這些函數可節(jié)省大量存儲空間且保證程序功能無誤,。
(2)循環(huán)體優(yōu)化。原始的音頻解碼程序已經采用了一些常用的算法級別的優(yōu)化,,如IMDCT的快速算法[4],、霍夫曼解碼的查表快速算法等,但仍沒有達到最理想的速度,。主要原因是for循環(huán)和定點化的問題。在AAC解碼器中,,循環(huán)體幾乎占用了60%的資源,,因此它的優(yōu)化非常重要。要想充分發(fā)揮C6416 DSP處理器的8個功能單元并行執(zhí)行指令的功能,,需要讓編譯器盡可能多地生成由2條以上指令組成的超長指令,。C/C++編譯器可以對代碼進行不同級別的優(yōu)化。高級優(yōu)化由專門的優(yōu)化器完成,,與目標DSP有關的低級優(yōu)化由代碼生成器完成,。圖2是編譯器、優(yōu)化器和代碼生成器的執(zhí)行圖,。
最簡單的執(zhí)行優(yōu)化的方法是用cl6x編譯程序[5],,在命令行設置-On選項即可。n是優(yōu)化的級別(n為0,、1,、2或3),它控制優(yōu)化的類型和程度,。-O3級別下,,編譯器可對循環(huán)代碼實現軟件流水[6],優(yōu)化器將會充分利用處理器的8個功能單元,,盡可能多地生成并行指令,,使最后的可執(zhí)行代碼運行速度達到最高,以達到優(yōu)化代碼的目的,。
軟件流水是用來安排循環(huán)指令并使這個循環(huán)多次迭代并行執(zhí)行的一種技術,。簡單循環(huán)情況下,軟件流水能夠正常的發(fā)揮作用,,但在多層嵌套循環(huán)情況下,,軟件流水往往會失敗。簡化循環(huán)是充分發(fā)揮軟件流水的通用而有效的辦法,。如本文中一個函數reordered_spectral_data( )中存在多達5層嵌套的for循環(huán),,有的循環(huán)中還有條件分支函數,在-O3優(yōu)化情況下,,解一個超幀10次調用這個函數之后,,共花費7 613 426個周期,,與其他函數開銷相比如圖3(a)所示。這是因為優(yōu)化器只能對最內層的循環(huán)進行軟件流水操作,,而外層的循環(huán)只能按照原語句執(zhí)行,,于是大量語句只能以最慢的方式執(zhí)行。
經過對這個函數中的循環(huán)語句進行分析和調試,,同時參照AAC標準,,在保證功能正確實現的基礎上對該函數做如下改進:這個函數的功能是將打亂順序的霍夫曼碼字重新排序,并進行霍夫曼解碼,。在碼字重新排序的過程中有碼書查找的步驟,,編碼時碼書的選擇是有優(yōu)先級別的,解碼時需要從最高級到最低級依次判斷是否存在以這個碼書編碼的碼字,,如果有就進行解碼,,沒有就判斷下一個碼書,每判斷一個碼書就是一次大循環(huán),。事實上,,碼書級別都很低,先前大部分循環(huán)中判斷的碼書都是錯誤的,,所以可以另外用一個小的循環(huán)檢查出級別最高的碼書,,這樣就會在真正解碼的嵌套循環(huán)中省去許多無用的循環(huán)。另外在嵌套的for循環(huán)中,,有一層是針對窗組進行的循環(huán),,即有幾個窗組需要解碼,就循環(huán)幾次,。事實上,,窗組往往只有一個,多窗組的情況極為少見,,所以這層for循環(huán)在大部分情況下可以去除,。但多窗組的情況畢竟存在,可以事先用一個if條件判斷窗組個數,,再根據結果條件執(zhí)行相應的程序,。這就使程序在大多數情況下能夠節(jié)省大量的運行時間,因為它會執(zhí)行軟件流水生成的代碼,,而在極少情況下會執(zhí)行效率最慢的未經優(yōu)化的代碼,。
按照上述的分析進行優(yōu)化之后,結果如圖3(b)所示,。reordered_spectral_data()函數優(yōu)化之后的開銷為:10次調用這個函數共花費1 029 512周期,,與優(yōu)化前的7 613 426周期相比,運行速度提高了7倍多,。
(3)消除存儲器相關性,。如果C6416編譯器可以確定兩條指令是不相關的,,則安排它們并行執(zhí)行,否則安排指令串行執(zhí)行,。有幾個方法可以幫助編譯器確定哪些指令不相關:使用restrict關鍵字聲明指針,;一起使用-pm選項和-O3選項確定程序優(yōu)先級,在程序優(yōu)先級中,,所有源文件都被編譯成一個模塊,,從而使編譯器更有效地消除相關性;使用-mt選項向編譯器說明代碼不存在存儲器相關性,,即允許編譯器在無存儲器相關性的假設下進行優(yōu)化,。
(4)使用內聯函數。C6416編譯器提供的內聯函數是直接映射為內聯指令的特殊函數,,內聯函數的代碼高效、長度短,??梢允褂脙嚷摵瘮挡⑿袃?yōu)化C代碼。
(5)在循環(huán)前加上#pragma MUST_ITERATE(, ,),,向編譯器傳遞循環(huán)次數信息,,編譯器會生成更好的循環(huán)代碼,或消除因不知道循環(huán)次數而產生的冗余循環(huán)以便減小整個代碼量,。
4 DRM音頻解碼器的測試結果
通過實施上述各種優(yōu)化方法,,從算法程序上的等效替代到充分利用編譯的優(yōu)化功能,音頻解碼程序運行效率有了明顯的提高,。下面是同一個超幀解碼中每個子幀花費的周期數,,總計數周期為2 641 488,與優(yōu)化前程序花費的27 855 831個周期相比,,運行時間不到原來的1/10,。
子幀1:396 470 子幀2:250 626
子幀3:247 983 子幀4:226 120
子幀5:254 623 子幀6:224 668
子幀7:231 056 子幀8:254 901
子幀9:277 520 子幀10:279 424
(共計2 641 488周期)
從表1可以看出,優(yōu)化后一些函數的訪問次數為0,,這是由于優(yōu)化采用了內聯函數的功能,,它們的代碼被內聯在一些較大的函數中,如faad_getbits( )函數,;另一種情況:如對于pns_decode( )函數,,由于DRM系統的音頻編碼標準中的SBR技術提供了相當于PNS的功能,所以AAC中的PNS模塊沒有使用,,優(yōu)化中被刪除,。對比表1中優(yōu)化前后數據可知,很多函數花費的周期大大減少,,如decode_scale_factors函數等,。
本文給出了DRM音頻解碼器在TMS320C6416上的實現方案,,并結合TMS320C6416的特性,從去除無用函數,、內聯函數替換,、循環(huán)體優(yōu)化等多方面對音頻解碼程序進行了優(yōu)化。在充分利用EDMA硬件資源的音頻驅動程序的配合下,,優(yōu)化后的音頻解碼程序能夠完成音樂的實時播放,。DRM中一個AAC超幀的時間為400 ms,優(yōu)化后解碼一個音頻超幀耗費的周期數從2 800萬降至300萬,,即每秒音頻解碼需750萬周期,,遠小于C6416每秒所能執(zhí)行的周期數(600 M),不但能保證音頻解碼和播放的實時性,,還為DRM廣播信號解碼系統執(zhí)行音頻解碼之前的解調和信道解碼程序節(jié)省了很大的周期資源和處理空間,。
參考文獻
[1] ETSI ES 201 980 V3.1.1[S].Digital Radio Mondiale(DRM):System Specification,2009.
[2] CHO Yang Ki,,SONG Tae Hoon,,Kim Hi Seok.An optimized algorithm for computing the modified discrete cosine transform and its inverse transform[J],IEEE,,2004:626-628.
[3] Texas Instruments.TMS320C6414,,TMS320C6415,TMS320C6416 fixed-point digital signal processors.SPRS 146N. 2005.
[4] 竇維蓓,,劉若珩,,王建昕,等,,基于DSP的IMDCT快速算法[J].清華大學學報,,2000,40(3):99-103.
[5] Texas Instruments Incorporated.TMS320C6000系列DSP編程工具與指南[M].北京:清華大學出版社,,2006.
[6] 馬君國,,王遠模,常華俊,,等.在DSP處理器上并行實現ATR算法[EB/OL].http://www.eeworld.com.cn/designarticles/dsp/200703/11490.html.