??? 摘? 要: 以運用TMS320C6200定點DSP芯片完成MPEG-4標準中DCT系數(shù)量化為例,簡要介紹MPEG-4標準的量化方法,提出一種用定點乘法和移位運算代替量化過程中的除法和飽和運算的方法,并實現(xiàn)了快速運算。?
??? 關(guān)鍵詞: 量化? DCT變換? 定點DSP芯片? MPEG-4
?
??? 在基于DCT變換的圖像壓縮編碼方法中,對DCT系數(shù)必須做量化處理。量化過程是一個多對一的映射,例如對一個8×8塊的64個DCT變換系數(shù)分別除以量化步長后取整。由于大多數(shù)DCT變換系數(shù)量化后變?yōu)榱?因而達到壓縮的目的。由于在量化過程中用到除法,因此通常需要進行浮點運算。?
??? 但是,可進行浮點運算的數(shù)字信號處理器(DSP)芯片結(jié)構(gòu)比定點DSP芯片復雜,價格一般也比定點DSP芯片高很多。所以數(shù)字圖像處理系統(tǒng)中通常采用定點DSP芯片來完成圖像壓縮運算,這種方法已經(jīng)成為數(shù)字圖像處理技術(shù)的一個趨勢。?
??? 可用于數(shù)字圖像處理的比較好的定點DSP芯片有德州儀器公司新一代高性能定點DSP芯片TMS320C6200系列。它具有VLIW(Very Long Instruction Word)結(jié)構(gòu),由8個可并行運行的執(zhí)行單元構(gòu)成。這些單元使得該系列芯片在單周期內(nèi)可以并行執(zhí)行多條指令,例如在單周期內(nèi)并行完成2個16位×16位乘法和2個移位操作。它還具有流水線結(jié)構(gòu),使得若干條指令的不同執(zhí)行階段可以并行執(zhí)行。這些設(shè)計使得TMS320C6200系列芯片程序執(zhí)行速度更快、性能更高。如200MHz時鐘的TMS320C6201峰值性能可以達到1600MIPS。
??? 在定點DSP上完成除法,通常的辦法是調(diào)用庫函數(shù)。但是調(diào)用庫函數(shù),勢必會打破循環(huán)中的流水線操作,嚴重影響量化的完成速度。所以提高量化過程速度的關(guān)鍵就在于避免任何函數(shù)調(diào)用、跳轉(zhuǎn)等操作。?
??? 本文以TMS320C6200 系列定點DSP為例,提出一種用定點乘法和移位運算來代替量化過程中除法和飽和運算的方法,從而極大地提高了量化過程的運行速度。該方法也同樣適用于其它各種定點微處理器。?
1 MPEG-4標準中采用的量化技術(shù)及程序優(yōu)化?
??? MPEG-4標準中定義了兩種量化方式:H.263量化方式和MPEG-4量化方式。這里為簡單起見,只介紹TMN-2.0編碼器所用到的一種量化策略:AC系數(shù)和幀間宏塊的DC系數(shù)用H.263量化方式,而幀內(nèi)宏塊的DC系數(shù)用MPEG-4量化方式中的DC系數(shù)非線性量化方法。?
1.1 H.263 量化方式?
??? 量化參數(shù)QP可以取值[1,31],量化步長為2QP。則量化公式為:?
??? 對于幀內(nèi)宏塊, LEVEL=|COF|/(2QP)?
??? 對于幀間宏塊, LEVEL=(|COF|-QP/2)/(2QP)?
式中,COF表示即將被量化的DCT變換系數(shù),LEVEL表示量化結(jié)果的絕對值。?
1.2 MPEG-4 DC系數(shù)非線性量化方法?
??? 量化公式為: LEVEL=DC_COF//dc_scaler?
??? 式中,DC_COF 表示即將被量化的DCT變換DC系數(shù);LEVEL表示量化結(jié)果;//表示先進行除法運算,然后對結(jié)果四舍五入取整。?
??? 在內(nèi)部宏塊內(nèi),定義亮度塊為類型1塊,色差塊為類型2塊,類型1塊的DC系數(shù)由類型1的非線性標尺量化;類型2的DC系數(shù)由類型2的非線性標尺量化。?
??? 表1為定義DC非線性量化標尺dc_scaler。?
?
?
??? 從表1中可以看到亮度塊和色差塊的DC系數(shù)有獨立的量化標尺,亮度塊具有較大的標尺而色度塊具有較小的標尺。這種分段線性的非線性量化策略是一種高效的量化方式,它在保證圖像質(zhì)量的基礎(chǔ)上提高了壓縮效率。?
1.3 將量化除法改定點乘法的方法?
??? 以內(nèi)部宏塊的AC系數(shù)量化公式為例,將其改寫為:?
??? LEVEL=|COF|/2QP=|COF|×(2n/2QP)/2n?
??? 定義量化參數(shù)ac_coeff=表示對x截尾取整,則:?
??? LEVEL=|COF|×ac_coeff/2n ?
??? 在QP的取值都范圍[1,31]內(nèi),要使截尾取整后的每一個2n/2QP的值都能夠用量化參數(shù)ac_coeff一一對應地表示,n必須足夠大。通過計算得出:當n≥11時滿足要求。?
??? 取n=11得到ac_coeff的計算公式為:?
??????
??? 其實質(zhì)就是用一個字(32 bit)的低11位(0Q11)來表示1/2QP的小數(shù)部分。?
??? 由于QP在[1,31]之間,可以用上述公式計算出對應于幀內(nèi)宏塊AC系數(shù)量化的量化系數(shù)的查找表:ac_coeff=AcQCoeff[QP]。用C語言表示為(假設(shè)QP=0時ac_coeff=0):?
??? const short int AcQCoeff[32]=?
{ 0x000,0x400,0x200,0x155,0x100,0x0cc,0x0aa,0x092,?
? 0x080,0x071,0x066,0x05d,0x055,0x04e,0x049,0x044,?
? 0x040,0x03c,0x038,0x035,0x033,0x030,0x02e,0x02c,?
? 0x02a,0x028,0x027,0x025,0x024,0x023,0x022,0x021};?
??? 計算表明,AC系數(shù)量化系數(shù)、亮度塊DC系數(shù)量化系數(shù)和色差塊DC量化系數(shù)都可以統(tǒng)一用一個字的低11位(0Q11)來表示。這樣就可以分別計算出它們的量化系數(shù)的查找表,從而實現(xiàn)用乘法運算代替除法運算。而除以2n的操作可以用右移n位的辦法來完成。?
??? 對于8 bit無符號二進制數(shù)表示的象素值,在經(jīng)過DCT變換后,其DCT變換系數(shù)的值域為[-2048,2047],最大有12位二進制數(shù)。同時,由上述分析可知量化系數(shù)最大有11位。所以DCT變換系數(shù)與量化系數(shù)相乘的結(jié)果最大將有11+12共23位。由于TMS320C62xDSP芯片中集成的乘法器是16位×16位的乘法器,乘法運算結(jié)果存放到32位的寄存器中。所以用本文方法計算出的量化系數(shù)與DCT變換系數(shù)相乘后,結(jié)果不會溢出。?
??? 根據(jù)MPEG-4 Visual標準TMN 2.0的要求,量化后AC系數(shù)值要飽和到[-2048,2047]之間。這可以利用TMS320C62x芯片指令集中的飽和左移指令SSHL 來實現(xiàn),只需兩條指令即可完成飽和運算,無需使用比較指令和跳轉(zhuǎn)指令。?
??? 下面給出內(nèi)部宏塊量化的TMS320C62x線性匯編程序:?
??????? cmpeq? type,1? //type定義的是當前塊的類型?
[type]? ldh *+DcLumQCoeff[QP],dc_coeff?//得到類型1的DC系數(shù)的量化參數(shù)?
[!type]?ldh? *+DcChromQCoeff[QP],dc_coeff?//得到類型2的DC系數(shù)的量化參數(shù)?
??????? ldh *coeff[0],level ?? //取出DCT變換DC系數(shù)?
??????? mpy level,dc_coeff,level??? //用乘法進行量化?
??????? addk 0x400,level//加0x400,對結(jié)果進行四舍五入? ?
??????? shr? level,11,level ??????? ??//右移11位?
??????? cmpgt level,maxDC,tmp????//對量化后的DC系數(shù)進行飽和運算?
[tmp]? ?mv maxDC,level? //將其限制在[1,maxDC]之間
??????? cmplt level,1,tmp?
[tmp]?? mvk 1,level???????????????? ?
??????? ldh *+AcQCoeff[QP],ac_coeff?//得到AC系數(shù)的量化參數(shù)?
??????? mvk? 63,cntr?//63次循環(huán),只對AC系數(shù)進行量化?
loop:???.trip 63?
????????ldh? *coeff++[1],cof //取出DCT變換AC系數(shù)?
??????? abs? cof,level?
??????? mpy ?level,ac_coeff,level//對AC系數(shù)絕對值用乘法進行量化?
??????? shru level,11,level???? //右移11位?
??????? cmplt cof,0,tmp?
[tmp]?? neg?? level,result?
[!tmp]? mv?? level,result?
????????sshl? result,20,result?
???????????? //將量化后的AC系數(shù)值進行飽和運算,?
??????? shru? result,20,result?
??????????? ?//將結(jié)果限制在[-2048,2047]之間?
??????? sth? result,*qcoeff++[1]?
[cntr]? sub? cntr,1,cntr?
[cntr]? b?? loop?
??? 由該程序可以看到,程序中沒有任何會影響流水線的的跳轉(zhuǎn)語句及函數(shù)調(diào)用。因此將該程序編譯后會發(fā)現(xiàn),此循環(huán)被優(yōu)化構(gòu)成軟件流水。如果再使用其它一些優(yōu)化手段,比如合并程序中的移位指令,使用字訪問指令一次處理兩個短型數(shù)據(jù)等,該程序的效率將會更高。我們用TMS320C62x軟件仿真器測試表明,原來使用除法的量化函數(shù)需要4871個周期,而運用上述優(yōu)化辦法進行優(yōu)化后的量化函數(shù)只需275個周期即可完成,效率提高約18倍。?
??? DCT/IDCT變換及量化過程是視頻圖像壓縮系統(tǒng)中的關(guān)鍵模塊。該模塊的執(zhí)行速度對整個系統(tǒng)的處理速度影響很大,因此將量化過程中的浮點運算轉(zhuǎn)換為定點運算,提高該模塊在定點DSP芯片上的執(zhí)行速度,其意義顯得尤為重要。同時由于目前絕大多數(shù)數(shù)字通訊系統(tǒng)都基于定點DSP芯片,如果用定點芯片完成視頻圖像處理將會有易于與數(shù)字通訊系統(tǒng)集成的優(yōu)點。我們的這一方法為在定點芯片上完成圖像處理進行了有益的嘗試,為后續(xù)的研發(fā)工作打下了一個良好的基礎(chǔ)。
參考文獻?
1 ISO/IEC JTC1/SC29/WG11 Information Technology——Coding of Audio-visual Objects——Part 2: Visual ISO.IEC 14496-2,1999?
2 TMS320C62/C67x CPU and Instruction Set, TEXAS?INSTRUMENTS, 1998?
3 TMS320C62x/C67x Programmer’s Guide, TEXAS INSTRUMENTS, 1999?
4 TMS320C6000 Optimizing C Compiler, TEXAS?INSTRUMENTS, 1999