《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 基于DSP的實(shí)時(shí)MPEG-4編碼的軟件優(yōu)化設(shè)計(jì)

基于DSP的實(shí)時(shí)MPEG-4編碼的軟件優(yōu)化設(shè)計(jì)

2009-02-06
作者:焦 曉1 馬明罡2 朱光喜

??? 摘? 要: 結(jié)合開發(fā)工具TMS320C6201EVM板的結(jié)構(gòu)和特點(diǎn),闡述了在實(shí)現(xiàn)MPEG-4實(shí)時(shí)視頻編碼中,對(duì)算法的軟件優(yōu)化所做的工作。?

??? 關(guān)鍵詞: TMS320C6201? MPEG-4? 優(yōu)化? 并行處理

?

??? TMS320C6201芯片是TI公司新推出的并行處理的數(shù)字信號(hào)處理器。它的最高處理能力高達(dá)1600MIPS,即16億萬次每秒定點(diǎn)運(yùn)算,是目前市場(chǎng)上所有的DSP芯片中速度較快、處理能力較強(qiáng)的DSP處理器。其應(yīng)用前景十分廣泛。本文利用C6201開發(fā)工具EVM(模擬評(píng)估)板,用軟件實(shí)現(xiàn)實(shí)時(shí)MPEG-4編碼。詳細(xì)探討了MPEG-4視頻編碼中的關(guān)鍵模塊,并針對(duì)TMS320C6000的特殊指令結(jié)構(gòu),對(duì)軟件優(yōu)化的特殊處理做了較深入的研究。?

1 開發(fā)工具的介紹?

??? 筆者采用的評(píng)估工具是TI公司的C6XEVM[2]。它的結(jié)構(gòu)如圖1所示。

?

?

??? C6XEVM除核心DSP之外,還提供了如下工具:一個(gè)64K×32bit、133MHz的z同步脈沖靜態(tài)隨機(jī)存取存儲(chǔ)器(SBSRAM);兩個(gè)1M×32bit、100MHz的同步動(dòng)態(tài)RAM(SDRAM);內(nèi)含基于PCI或外部XDS510支持的JTAG仿真;支持采樣速率為5.5kHz~48kHz的立體聲16位音頻邊界碼;1.8V/2.5V直流電和3.3V直流電單板轉(zhuǎn)換電壓調(diào)整器;模擬5V直流電壓的單板線性電壓調(diào)整器;3個(gè)LED指示器(電壓,2個(gè)自定義指示)等。?

??? SBSRAM映射到DSP的CE0存儲(chǔ)空間,把它用于程序自舉。通常SBSRAM都工作在133MHz。當(dāng)采用全速接口時(shí),CPU時(shí)鐘就等于SBSRAM的時(shí)鐘;當(dāng)采用半速接口時(shí),SBSRAM的速度是CPU時(shí)鐘速度的一半。?

??? EVM提供的兩個(gè)1M×32bit的字存儲(chǔ)區(qū)間的SDRAM,每一個(gè)存儲(chǔ)空間包含兩個(gè)512K×2banks×16位的器件。它們映射到DSP的CE2和CE3存儲(chǔ)空間,每一個(gè)空間使用16Mbit的地址空間。 SDRAM通常是CPU時(shí)鐘速度的一半。 ?

??? EVM提供的異步存儲(chǔ)連接器允許給子板附加一個(gè)存儲(chǔ)區(qū)間或者存儲(chǔ)映射區(qū)間。擴(kuò)展存儲(chǔ)的界面被映射到DSP的4M異步CE1存儲(chǔ)空間的低3M空間。CE1中擴(kuò)展空間的地址從0x100000~12FFFFF,在MAP0和MAP1方式下為0x1400000~16FFFFF,CE1的最上面的1M字節(jié)可分配給板上外圍。CE1存儲(chǔ)空間的這種分配方式容許了板上器件和擴(kuò)展器件的共存。?

2 MPEG-4視頻編碼?

??? MPEG-4編碼是基于VOP的編碼[3]。所謂VOP是指視頻目標(biāo)平面,即視頻對(duì)象VO在某一時(shí)間的存在。VOP編碼器的結(jié)構(gòu)框圖如圖2所示。?

?

?

??? 編碼器主要由兩部分組成:一是形狀編碼器;另一個(gè)是傳統(tǒng)的運(yùn)動(dòng)估計(jì)和補(bǔ)償及紋理VOP編碼器。VOP可采用幀內(nèi)編碼(Intra-VOP,簡(jiǎn)稱I-VOP)和幀間預(yù)測(cè)編碼(Inter-VOP)。幀間預(yù)測(cè)編碼又可以分為前向因果預(yù)測(cè)編碼(P-VOP)和前后向非因果編碼(B-VOP)。幀間預(yù)測(cè)編碼消除了視頻信息的時(shí)間冗余。對(duì)于VOP的編碼,首先將各個(gè)VOP從上到下分成16×16大小的宏塊(MB)。具體的形狀、運(yùn)動(dòng)和紋理編碼基于MB進(jìn)行,所以一個(gè)MB的信息是形狀、運(yùn)動(dòng)、紋理(Shape-Motion-Texture)的總和。進(jìn)行MB編碼時(shí),再把它分成4個(gè)8×8塊(Block)的亮度Y分量,和2個(gè)8×8塊的色度Cr和Cb分量分別進(jìn)行編碼。然后對(duì)6個(gè)Block分別進(jìn)行8×8DCT二維變換、量化和Huffman編碼。?

??? 進(jìn)行測(cè)試使用的圖像是QCIF格式(176×144象素),圖像數(shù)據(jù)從主機(jī)讀入。通過CCS測(cè)得其各個(gè)模塊所消耗的時(shí)間周期比率如下。?

??? 其各個(gè)部分占總運(yùn)算量的比例分別為:?

?

?

??? 分析顯示,運(yùn)動(dòng)估計(jì)和運(yùn)動(dòng)補(bǔ)償模塊及紋理編碼模塊是MPEG-4實(shí)現(xiàn)的最主要的瓶頸。所以在程序優(yōu)化上所做的工作主要是基于這兩個(gè)模塊進(jìn)行。?

3 程序的優(yōu)化考慮?

??? 要想充分發(fā)揮TMS320C6201的運(yùn)算能力,必須從它的硬件結(jié)構(gòu)出發(fā),最大限度地利用八個(gè)功能單元,使用軟件流水線,盡量讓程序無沖突地并行執(zhí)行。并行執(zhí)行的優(yōu)點(diǎn)在于,在處理彼此之間沒有承接關(guān)系的運(yùn)算時(shí),在CPU資源允許的情況下可以并行完成。但對(duì)于前后有承接關(guān)系或者判斷、跳轉(zhuǎn)頻繁的情況就無法發(fā)揮其優(yōu)勢(shì)。一般循環(huán)體都滿足并行處理的條件,并且循環(huán)體往往是程序中耗時(shí)最長(zhǎng)的。因此在進(jìn)行優(yōu)化時(shí)將重點(diǎn)放在循環(huán)體上。?

3.1 跳轉(zhuǎn)指令的優(yōu)化?

??? DSP的指令多為單周期指令,但是轉(zhuǎn)移類指令卻通常要耗費(fèi)較多的時(shí)鐘周期,每個(gè)跳轉(zhuǎn)都有5個(gè)延遲間隙,從性能上考慮是一項(xiàng)很耗時(shí)的工作, 因此應(yīng)盡可能地減少程序中的分支。?

??? 事實(shí)上,通過對(duì)程序的分析,可以看到許多判斷轉(zhuǎn)移用簡(jiǎn)單的條件組合就可以得到實(shí)現(xiàn)。例如下面的小程序:?

??????????? ?if(rcoeff[i]>(lim-1)) rcoeff[i]=(lim-1);?

??????? ???? else if(rcoeff[i]<(-lim)) rcoeff[i]=(-lim);?

??? 可以改為:rcoeff[i]=MIN(rcoeff[i],(lim-1));?

???????????? rcoeff[i]=MAX(rcoeff[i],(-lim));?

??? 還有一種常用的減少判斷轉(zhuǎn)移的方法是將循環(huán)展開。特別是對(duì)多重循環(huán)的控制,若外層循環(huán)較少,可將內(nèi)層循環(huán)直排,把轉(zhuǎn)移條件結(jié)合起來,以減少層與層之間的相互聯(lián)系。?

3.2 使用庫函數(shù)?

??? TI公司對(duì)TMS320C62XX的用戶提供了功能強(qiáng)大的IMAGE LIB[4]庫支持。在這個(gè)庫中,包含許多常用函數(shù),可以完成DCT/IDCT變換、小波變換、DCT量化、自適應(yīng)濾波等功能。這些函數(shù)都是優(yōu)化過的,完全能夠?qū)崿F(xiàn)軟件流水,效率很高。?

3.3 改寫線性匯編?

??? 線性匯編語言是TMS320C6000中獨(dú)有的一種編程語言,介于高級(jí)語言和低級(jí)語言之間。為了提高代碼的性能,可以用線性匯編來重寫影響速度的關(guān)鍵代碼段。線性匯編中不需要給出使用的寄存器、指令的延遲周期及使用的哪個(gè)功能單元等信息,C6201強(qiáng)大的匯編優(yōu)化器會(huì)根據(jù)代碼的情況自動(dòng)確定這些信息[5]。然而很多時(shí)候,為了提高代碼的效率,必須指出使用哪個(gè)功能單元。使用線性匯編時(shí)要注意:對(duì)循環(huán)體進(jìn)行優(yōu)化時(shí)不能使用跳轉(zhuǎn)到循環(huán)體外的跳轉(zhuǎn)指令;計(jì)數(shù)器使用減計(jì)數(shù)等。?

??? 進(jìn)行優(yōu)化時(shí),首先要確定循環(huán)次數(shù)。對(duì)于循環(huán)次數(shù)是變量的情況,優(yōu)化器不能并行優(yōu)化;其次,要盡可能使用雙字或字存取操作。例如運(yùn)動(dòng)估計(jì)和補(bǔ)償中的一個(gè)小程序段:?

void MC_case_a(uchar ref[NUM_ROWS][NUM_COLS],?

uchar curr[NUM_ROWS][NUM_COLS], const int r_x, const int c_x,const int r_y, const int c_y, const int size)?

{?

??? int m, n;?

??? for(m=0; m

??? for(n=0; n

??? curr[c_x+m][c_y+n] = ref[r_x+m][r_y+n];?

??? }}?

}?

??? 相應(yīng)的線性匯編程序如下:?

.def _MC_case_a?

.sect ″.text″?

_MC_case_a: .cproc ref, curr, r_x, c_x, r_y, c_y, num_cols?

.reg r_temp1, r_temp2, c_temp1, c_temp2?

.reg p_r, p_c, np_r?

.reg lshift, rshift, count?

.reg r_w1, r_w2, r_w3, r_w4?

.reg temp?

SHL r_x, 0x05, r_temp1?

SHL c_x, 0x05, c_temp1 ?

ADD r_y, ref, r_temp2 ?

ADD c_y, curr, c_temp2?

ADD r_temp1, r_temp2, p_r ?

ADD c_temp1, c_temp2, p_c?

SUB num_cols, 2, num_cols ?

MVK 8, count ; 循環(huán)次數(shù)為8?

MVK 0xFFFC, temp?

AND p_r, temp, np_r?

AND p_r, 0x0003, rshift?

SUB.L 0x04, rshift, lshift?

SHL rshift, 0x03, rshift ?

SHL lshift, 0x03, lshift ?

loop: .trip 8?

LDW *np_r++[1], r_w1 ?

LDW *np_r++[1], r_w2?

LDW *np_r++[num_cols], r_w3 ?

SHRU r_w1, rshift, r_w1 ?

SHL r_w3, lshift, r_w3 ?

SHL r_w2, lshift, r_w4 ?

SHRU r_w2, rshift, r_w2 ?

OR r_w1, r_w4, r_w1 ?

OR r_w2, r_w3, r_w2 ?

STW r_w1, *p_c++[1]?

STW r_w2, *p_c++[num_cols] ?

ADD p_c, 4, p_c ?

[count] SUB count, 1, count ?

[count] B loop?

.endproc?

??? 優(yōu)化前,在CCS(Code Composer Studio)上測(cè)得的C程序段消耗時(shí)鐘周期為574;而優(yōu)化后的線性匯編所耗時(shí)鐘周期數(shù)為58,效率顯著提高。?

3.4 存儲(chǔ)空間的考慮?

??? DSP存儲(chǔ)空間的配置十分重要。因?yàn)镈SP對(duì)不同的存儲(chǔ)單元的訪問速度是有區(qū)別的,對(duì)片內(nèi)寄存器的訪問速度最快,對(duì)片內(nèi)RAM的訪問速度比片外RAM的訪問速度快。因此合理地配置和使用存儲(chǔ)空間,對(duì)系統(tǒng)整體效率影響很大。應(yīng)該盡可能地把訪問比較頻繁的常數(shù)表和代碼段裝入片內(nèi)RAM,如果過大,則把其中一部分裝入片外存儲(chǔ)器。?

??? 同時(shí),還要考慮存儲(chǔ)bank的沖突。由于C6201DSP使用交叉存儲(chǔ)方案,將存儲(chǔ)器分成4個(gè)或8個(gè)bank,每個(gè)bank都是單口存儲(chǔ)區(qū),因此每個(gè)周期只允許一次訪問,在一個(gè)周期內(nèi)對(duì)一個(gè)bank進(jìn)行兩次訪問將產(chǎn)生存儲(chǔ)器阻塞。存儲(chǔ)器阻塞導(dǎo)致所有流水線操作停止一個(gè)周期,用來從存儲(chǔ)器讀取第2個(gè)數(shù)據(jù)。解決的辦法是對(duì)代碼段進(jìn)行修改。?

3.5 其他優(yōu)化方法?

??? 除此之外,還有一些比較基本的方法,如:?

??? ·為了提高算法的實(shí)現(xiàn)效率,減少運(yùn)算的實(shí)際開銷,盡可能把需運(yùn)行時(shí)計(jì)算的參數(shù)做成查找表或常數(shù)數(shù)值,從而將運(yùn)行時(shí)的計(jì)算轉(zhuǎn)化為編譯時(shí)的計(jì)算。這不僅適用于一些比較規(guī)整的參數(shù)表,對(duì)于一些并不規(guī)整的運(yùn)行時(shí)計(jì)算,特別是比較耗時(shí)的計(jì)算(如浮點(diǎn)除),也要盡可能使其表格化。?

??? ·浮點(diǎn)數(shù)定點(diǎn)化,在編寫MPEG-4的模擬算法時(shí),為了方便,C語言中一般既有整型數(shù),又有浮點(diǎn)數(shù)。由于使用的是定點(diǎn)芯片,所以有必要把所有的浮點(diǎn)運(yùn)算改為定點(diǎn)運(yùn)算。?

??? ·使用字訪問2個(gè)16位數(shù)據(jù),將其分別放在32位寄存器的高16位和低16位字段。這樣可以使程序讀取數(shù)據(jù)的速率提高一倍,從而大大提高執(zhí)行效率。?

??? ·使用移位指令替代乘除操作,移位指令只有一個(gè)時(shí)鐘周期,比之乘除運(yùn)算則可以節(jié)約許多時(shí)鐘周期。?

??? 最初的C代碼在EVM板上執(zhí)行,處理速率僅為0.8幀/秒。通過上述方法優(yōu)化源程序后,可在C6201的EVM板上實(shí)現(xiàn)實(shí)時(shí)的MPEG-4編碼,處理速度為30幀/秒。?

??? DSP芯片的使用范圍已越來越廣。特別在移動(dòng)通信領(lǐng)域中,軟件無線電、智能天線等新技術(shù)的實(shí)現(xiàn)都需要強(qiáng)大的數(shù)字信號(hào)處理的支持。TMS320C6000系列能夠滿足這方面的需求。本文結(jié)合在其在MPEG-4編碼中應(yīng)用的實(shí)例,具體闡述了TMS320C6000的軟件優(yōu)化開發(fā)方法。工作中不可避免地存在某些不足,尚待進(jìn)一步探討。?

參考文獻(xiàn)?

1 任麗香,馬淑芬,李方慧.TMS320C6000系列DSPs的原理與應(yīng)用[M].北京:電子工業(yè)出版社,2000?

2 TI公司.TMS320C62x Multi-channel Evaluation Module?User’s Guide[M].1999?

3 Noordwijkerhout MPEG-4 Video Verification Model[S],?Version16.0ISO/IEC TC1/SC29/WG11 N3312 March,2000?

4 TI公司.TMS320C62x Image-Video Processing Library?Programmer's Reference[M]. 2000?

5 TI公司.On the Implementation of MPEG-4 Motion Compensation Using the TMS320C62x [M].1999

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。