高清電視音頻解碼的定點(diǎn)DSP實(shí)現(xiàn)
1 DVB 音頻算法及改進(jìn)
DVB 音頻是MPEG-2 音頻解碼標(biāo)準(zhǔn)的子集,它采用MUSICAM 算法進(jìn)行壓縮,利用給定的聲音單元對(duì)位于臨近頻率較低聲級(jí)的聲音(或噪聲) 有著遮蔽作用,對(duì)于聽不見的聲音單元不進(jìn)行編碼,這有利于在低數(shù)據(jù)率下進(jìn)行音頻編碼. MPEG-2 支持多通道(5. 1 聲道) 和采樣率分別為16 ,22. 05 ,24kHz 的低采樣率的擴(kuò)展. 其中低采樣率擴(kuò)展只需對(duì)MPEG-1 的比特流和比特分配表進(jìn)行很小的變動(dòng)就可實(shí)現(xiàn)解碼. MPEG-2 多通道擴(kuò)展音頻解碼的幀結(jié)構(gòu)見圖1.
圖1 MPEG-2 音頻幀
MPEG-2 音頻幀由MPEG21 音頻數(shù)據(jù)和多通道(MC) 音頻數(shù)據(jù)組成,其中MPEG-2 附加的多聲道數(shù)據(jù)放在MPEG21 的輔助數(shù)據(jù)區(qū). 由于采用了與MPEG-1 相似的幀結(jié)構(gòu), MPEG-2 音頻可以后向兼容MPEG-1 音頻,即MPEG-1 音頻解碼器可以恢復(fù)MPEG-2 音頻數(shù)據(jù)的兩聲道信息,而用MPEG-2解碼器則可以解碼完整的多通道音頻數(shù)據(jù).MPEG-2 音頻解碼流程如圖2 所示. 其解碼過程可分解為:幀分解,反量化,逆矩陣解碼,子帶綜合濾波. 當(dāng)輸入比特流經(jīng)過幀分解后,解碼器將位分配信息、量化因子選擇信息和音頻樣點(diǎn)送入反量化器恢復(fù)子帶樣點(diǎn),子帶樣點(diǎn)經(jīng)子帶合成濾波器重建各聲道的脈沖編碼調(diào)制( PCM) 樣點(diǎn).
圖2 MPEG-2 音頻解碼流程
表1 是在DSP 平臺(tái)上統(tǒng)計(jì)解碼各步所占用的時(shí)間. 可以看出,數(shù)值計(jì)算主要集中在子帶合成濾波,若采用MPEG-1 建議的算法流程[2 ] ,以兩聲道48 kHz 采樣率為例,乘法運(yùn)算量為(48 000/ 32) (64 32 + 512) 2 = 7 680 000 次/ s. 因此,程序優(yōu)化主要針對(duì)此步驟,并且對(duì)多聲道音頻,優(yōu)化算法所減少的運(yùn)算量與聲道數(shù)成正比,因?yàn)樽訋Ш铣蔀V波對(duì)于每個(gè)聲道的樣點(diǎn)是分別進(jìn)行的.
2 算法及存儲(chǔ)優(yōu)化
首先,利用合成窗系數(shù)的對(duì)稱性
Di = - D512 - i i = 1 ,2 .255 (不包含64 ,128 ,192) (1)
對(duì)于特殊的點(diǎn):D64 = D448 ; D128 = D384 ; D192 =D320 ; D0 = 0 ; D256 = 1.144 989 014因此只需要存儲(chǔ)257 個(gè)點(diǎn),就可以表示原來的512個(gè)點(diǎn),窗系數(shù)存儲(chǔ)量減少了一半.
進(jìn)一步對(duì)標(biāo)準(zhǔn)ISO/ IEC 11172-3附錄B 的位分配表觀察可知,表B2. b 是對(duì)表B2. a 的擴(kuò)展,表B2. d 也是對(duì)表B2. c 的擴(kuò)展,因此實(shí)際只需存儲(chǔ)表B2. b 和B2. d ,設(shè)計(jì)讀表法就可以訪問4 張表格的數(shù)據(jù),位分配表存儲(chǔ)量也降低為原來的一半. 子帶合成濾波流程見標(biāo)準(zhǔn)ISO/ IEC11172-3附錄圖A. 2 ,標(biāo)準(zhǔn)中規(guī)定的流程復(fù)雜,中間變量多.根據(jù)文獻(xiàn)可以對(duì)標(biāo)準(zhǔn)里的合成子帶濾波器流程簡(jiǎn)化:
其中:Di 為窗系數(shù); Sk 為子帶樣點(diǎn).
經(jīng)過以上變換, 省略了中間變量U 和W . 且利用余弦函數(shù)性質(zhì),由32 點(diǎn)的Xi 代替64 點(diǎn)V i . 簡(jiǎn)化了子帶合成濾波的步驟, 并使存儲(chǔ)量減少到一半以上,為代碼移植到DSP 節(jié)省了存儲(chǔ)空間. 計(jì)算式(3) 時(shí), 利用Byeong G. L EE 快速算法的改進(jìn)算法將32 點(diǎn)DCT 進(jìn)行分解:
重復(fù)這樣的運(yùn)算,可進(jìn)一步分解為更少點(diǎn)數(shù)的DCT ,每分解一次,乘法運(yùn)算和加法運(yùn)算可減少一半. 以32 點(diǎn)DCT 為例, 乘法和加法運(yùn)算分別為1 024次和992 次. 將其分解為兩個(gè)16 點(diǎn)的DCT后,乘法和加法次數(shù)分別減少到529 和527 次. 考慮到定點(diǎn)DSP 的有限字長(zhǎng)效應(yīng),實(shí)際只需分解一次,將32 點(diǎn)DCT 化成兩個(gè)16 點(diǎn)的DCT. 簡(jiǎn)化子帶濾波流程以及使用快速DCT 變換后,子帶合成濾波部分的運(yùn)算量減少了約60 %.
用C語言進(jìn)行算法驗(yàn)證時(shí),考慮到不同機(jī)器的通用性,對(duì)于解碼后的PCM 樣點(diǎn)分別采用不同的格式封裝: 對(duì)于Intel 系列的機(jī)器,采用小端格式(Lit tle Endian) ,故解碼后樣點(diǎn)以wave 格式封裝;對(duì)于Motorola , Macintosh 等機(jī)器,采用大端格式(Big Endian) ,因而解碼后樣點(diǎn)采用aiff 格式封裝.這樣解碼后的音頻就可直接用winamp 等軟件進(jìn)行播放,測(cè)試效果.
3 定點(diǎn)化程序及性能分析
實(shí)現(xiàn)解碼時(shí)描述算法采用浮點(diǎn)程序,以確保精度,但速度慢. 為了在定點(diǎn)DSP 上實(shí)現(xiàn)解碼,程序必須進(jìn)行定點(diǎn)化,以有限精度實(shí)現(xiàn). 定點(diǎn)化程序時(shí),以浮點(diǎn)程序?yàn)槟0?逐個(gè)將模塊改造成定點(diǎn). 每做完一個(gè)模塊,將定點(diǎn)程序解碼結(jié)果與浮點(diǎn)程序的解碼結(jié)果進(jìn)行比較,直到差值達(dá)到要求為止. 每個(gè)模塊改造前,先估計(jì)本模塊內(nèi)數(shù)據(jù)動(dòng)態(tài)范圍,再?zèng)Q定采用何種精度. 其中余弦函數(shù)的定點(diǎn)運(yùn)算通過查表法實(shí)現(xiàn),即先把[ 0 ,π/ 2]間劃分為212 個(gè)小格子,然后把弧度值映射到小格子上,通過查表 讀取結(jié)果.為了對(duì)定點(diǎn)化程序進(jìn)行測(cè)試,由式(8) 計(jì)算定點(diǎn)解碼結(jié)果與浮點(diǎn)解碼結(jié)果信噪比:
其中:PCMfix 為定點(diǎn)程序解碼結(jié)果; PCMfloat 為浮點(diǎn)程序解碼結(jié)果; 65 535. 0 為兩個(gè)16 位PCM 樣點(diǎn)之差的最大值.有的文獻(xiàn)以∑PCM2float 為分子,這樣算出來的結(jié)果與特定的碼流有關(guān),若碼流PCM 樣點(diǎn)值較大,計(jì)算出信噪比則較大. 而式(8) 不受具體碼流的影響,客觀地對(duì)不同碼流作出評(píng)價(jià)對(duì)比. 定點(diǎn)程序分別經(jīng)過男聲、女聲,小提琴聲,海浪聲和進(jìn)行曲樂聲等碼流測(cè)試,SNR 都在74~78 dB 范圍內(nèi),獲得了較好的效果.
4 定點(diǎn)DSP 實(shí)現(xiàn)音頻解碼算法
TMS320DM642 是Ti 公司最新推出的一款針對(duì)多媒體處理領(lǐng)域的DSP ,它在C64x 的基礎(chǔ)上,增加了許多外圍設(shè)備和接口. 頻率為600 MHz 的DM642 能夠以30 幀的速度同時(shí)處理多達(dá)4 個(gè)分辨率為D1 (720 480) 的MPEG2 視頻編碼譯碼器. 此外,DM642 還能實(shí)時(shí)進(jìn)行全面的Main-Profile-at-Main-Level (MP @ML) MPEG-2 視頻編碼,具有32MB 外部SDRAM、4 MB 閃存、組合視頻輸入/ 輸出、S-視頻輸入/ 輸出、V GA 輸出端口以及支持媒體流的以太網(wǎng)端口.
將程序移植到DSP 上分兩個(gè)階段[6 ] : 第1 階段,不考慮DSP 有關(guān)知識(shí),根據(jù)DVP 改進(jìn)算法編寫C 程序,再在CCS 環(huán)境下調(diào)試C 程序,編譯產(chǎn)生在C6000 內(nèi)運(yùn)行的代碼,運(yùn)用CCS 下的分析工具斷點(diǎn)和profile 等,查找程序中運(yùn)算量最大的部分,改進(jìn)這部分代碼性能;第2 階段,使用DSP 提供的內(nèi)聯(lián)函數(shù)代替復(fù)雜的C 語言程序,使用數(shù)據(jù)打包技術(shù),對(duì)短字長(zhǎng)的數(shù)據(jù)使用寬長(zhǎng)度訪問,并通過消除冗余循環(huán)、循環(huán)展開等方法優(yōu)化循環(huán)程序. 最后,利用DSP提供的匯編優(yōu)化器,選定合適的優(yōu)化選項(xiàng)進(jìn)行編譯,此步可通過線性匯編,在底層更好地利用資源.目標(biāo)DSP 的乘法器為16 位16 位,而程序中用到32 位32 位乘法,結(jié)果為32 位. 因此采用3個(gè)16 位16 位乘法代替,輸出結(jié)果仍保留32 位.其方法為
Y32 = X132 X232 = X1low16 ?X2low16 + ( X1high16 ?X2low16 + X1low16 X2high16 ) n16 (9)
經(jīng)過測(cè)試,該式計(jì)算對(duì)性能沒有影響.
1) 輸入控制
DSP 解碼時(shí),將待解壓縮的mp3文件轉(zhuǎn)化成dat 格式的文件,DSP 可直接將dat 格式的數(shù)據(jù)加載到片外存儲(chǔ)器中. 具體方法為,先在程序中定義一個(gè)與mp3 文件相同大小的數(shù)組,然后將dat 文件放到數(shù)組首地址所指向的區(qū)域并指定數(shù)據(jù)長(zhǎng)度. 由于mp3 文件大小為幾兆,所以定義的數(shù)組長(zhǎng)度超過bss 段最大偏移,需定義成far 型;也可以不用far 聲明數(shù)組,而將編譯方式改成大模式.大模式下bss 段的大小無任何限制,但編譯器對(duì)變量使用寄存器間接尋址方式,這樣需要3 條指令才能加載一個(gè)變量,故對(duì)變量存取速度很慢.
2) 輸出控制:采用DSP 提供的實(shí)時(shí)操作系統(tǒng)
DSP/ BIOS 實(shí)現(xiàn)實(shí)時(shí)輸出音頻. 首先在DSP/ BIOS配置工具中建立TSK 對(duì)象,并與解碼函數(shù)相對(duì)應(yīng),然后指定函數(shù)優(yōu)先級(jí),DSP/ BIOS 將自動(dòng)進(jìn)行任務(wù)調(diào)度和執(zhí)行. 在配置工具中還需指定內(nèi)存分配情況. DM642 中L2 cache 和片內(nèi)存儲(chǔ)器共用,可使用芯片支持庫CSL 的API 函數(shù)分配cache 及片內(nèi)存儲(chǔ)器大小. 片內(nèi)存儲(chǔ)器的一部分作為子帶濾波器申諸的動(dòng)態(tài)空間.
調(diào)試時(shí)可以用LOG 對(duì)象顯示解碼進(jìn)度, 以LOG_ printf 代替C 語言調(diào)試中的printf , 因?yàn)閜rintf 不是DSP 中的指令,將占用大量的時(shí)鐘周期,在對(duì)實(shí)時(shí)性要求很高的應(yīng)用中根本無法滿足要求. LOG_printf 語句可以滿足實(shí)時(shí)要求. 先在DSP/BIOS 配置工具里建立一個(gè)LO G 對(duì)象,在Message窗口可實(shí)時(shí)觀測(cè)程序進(jìn)度,幾乎不影響程序性能.DSP/ BIOS 提供兩種數(shù)據(jù)傳輸模型,管道模型(pipe) 用于PIP 和HST 模塊;流模型( st ream) 用于SIO 和DEV 模塊. 管道支持底層的通信,而流支持高級(jí)的與設(shè)備無關(guān)的I/ O. 音頻口輸出時(shí)采用流模型,流和I/ O 設(shè)備交互的數(shù)據(jù)流向如圖3 所示. 流模塊(SIO) 使用驅(qū)動(dòng)程序(由DEV 模塊管理) 與這些設(shè)備交互. 控制輸出前先進(jìn)行初始化,即在DSP/BIOS 配置工具里定義一個(gè)User-Defined Devices對(duì)象, 再使用音頻口初始化函數(shù)_EVMDM642 _EDMA_AIC23_init 對(duì)此對(duì)象進(jìn)行初始化. 上層的API 函數(shù)即可對(duì)這個(gè)設(shè)備進(jìn)行操作,通過結(jié)構(gòu)體SIO_At t r s 設(shè)置設(shè)備特征.
圖3 流和設(shè)備間的交互
解碼輸出過程為:首先使用SIO_create 產(chǎn)生一個(gè)指向設(shè)備的流. 流以異步方式進(jìn)行I/ O 操作,定義兩個(gè)指向輸出流的緩沖區(qū)用以數(shù)據(jù)交換,數(shù)據(jù)輸入和輸出同時(shí)進(jìn)行. 當(dāng)應(yīng)用程序正在處理當(dāng)前緩沖區(qū)時(shí),當(dāng)前緩沖區(qū)被填滿,前一個(gè)緩沖區(qū)的數(shù)據(jù)則輸出. 在調(diào)用SIO_reclaim 時(shí),交替使用這兩個(gè)緩沖區(qū)進(jìn)行數(shù)據(jù)交換, 每次返回其中一個(gè)緩沖區(qū)的地址. 將解碼產(chǎn)生的音頻數(shù)據(jù)送到此地址, 最后調(diào)用SIO_issue 將這個(gè)填滿的緩沖區(qū)地址回送給流. 輸出數(shù)據(jù)流向如圖4 所示. 程序中流使用指針而不以數(shù)據(jù)拷貝,減小了應(yīng)用程序的開銷,使應(yīng)用程序更容易滿足實(shí)時(shí)性要求. 通過定義合適的緩沖區(qū)大小,D/ A 輸出采樣,音頻數(shù)據(jù)即可實(shí)現(xiàn)實(shí)時(shí)輸出.
圖4 輸出數(shù)據(jù)流向
5 結(jié) 語
DM642 作為Ti 推出的新一代媒體處理器,具有強(qiáng)大的信號(hào)處理能力,可以完成實(shí)時(shí)高清信源解碼. 音頻解碼器經(jīng)過算法優(yōu)化和DSP 移植優(yōu)化,算法的運(yùn)行速度和存儲(chǔ)量均有明顯改善. 5. 1 聲道音頻實(shí)時(shí)解碼需要50MIPS 的運(yùn)算量,給高清電視信源解碼中解復(fù)用和視頻解碼留下足夠的資源. 本系統(tǒng)的實(shí)現(xiàn)對(duì)于設(shè)計(jì)高清電視信源解碼芯片具有指導(dǎo)意義,DSP/ BIOS 的使用為進(jìn)一步在DSP 上實(shí)現(xiàn)MPEG-4 視頻和音頻算法提供了有效的設(shè)計(jì)方法.該解碼器也可以應(yīng)用于數(shù)字音頻廣播(DAB) 接收機(jī)信源解碼.
評(píng)論