??? 摘? 要: 介紹了利用TMS320C6201 DSP芯片進(jìn)行實(shí)時圖像壓縮" title="圖像壓縮">圖像壓縮的軟件設(shè)計。結(jié)合該芯片的編程特點(diǎn)介紹了壓縮算法,并給出了部分關(guān)鍵程序,具有一定的參考價值。?
??? 關(guān)鍵詞: 圖像壓縮? C6201? FDCT變換? 霍夫曼編碼
?
??? 圖像中含有豐富的信息,在現(xiàn)代科技中將圖像作為一種探測手段,正受到越來越廣泛的青睞。有很多探測設(shè)備,采用掃描成像儀器作為前端探測器。作為一種很常見的情況,成像儀器采集到的圖像要通過無線信道進(jìn)行發(fā)送。但是,圖像數(shù)據(jù)" title="圖像數(shù)據(jù)">圖像數(shù)據(jù)通常都是海量數(shù)據(jù),無線信道的傳輸帶寬無法滿足要求,必須對圖像進(jìn)行壓縮處理,才能通過無線信道進(jìn)行傳輸。?
??? 實(shí)現(xiàn)圖像實(shí)時無線傳輸必須研制專門的圖像壓縮,該壓縮器" title="壓縮器">壓縮器須滿足如下要求:(1)圖像實(shí)時壓縮;(2)能夠較好地保存圖像質(zhì)量。筆者以TI公司的高速DSP芯片TMS320C6201為核心的數(shù)字信號處理板" title="信號處理板">信號處理板作為圖像壓縮器的硬件平臺,通過自行開發(fā)的壓縮程序,實(shí)現(xiàn)了圖像的實(shí)時壓縮。?
1 數(shù)字信號處理板的硬件功能框圖?
??? 數(shù)字信號處理板的硬件功能框圖如圖1所示。TMS320C6201是一種高性能的定點(diǎn)數(shù)字信號處理器。工作頻率為200MHz時,每個指令周期為5ns,運(yùn)算速度可達(dá)1600MIPS;具有VLIW(甚長指令集)體系結(jié)構(gòu),每周期8個32bit的指令并行執(zhí)行;8個獨(dú)立的功能單元,有兩個16bit乘法器和6個算術(shù)邏輯單元;采用加載存儲體系結(jié)構(gòu),數(shù)據(jù)在多處理單元之間的傳輸依靠32個32bit的通用寄存器。C6000的存儲器尋址空間為32bit,片內(nèi)有1Mbit的SRAM。片內(nèi)RAM被分為兩塊:一是內(nèi)部程序/cache存儲器,二是內(nèi)部數(shù)據(jù)存儲器。32bit外部存儲器接口(EMIF)可與不同存儲器接口,可方便地配置不同速度、不同容量、不同復(fù)雜程度的存儲器。此外,C6000還有兩通道Boot-loading DMA處理器、16bit的主機(jī)接口HPI、兩個多通道緩沖串口(McBSP),并且其片內(nèi)鎖相環(huán)(PLL)時鐘發(fā)生器,可以對輸入時鐘進(jìn)行不同的倍頻處理。這種芯片用來處理圖像壓縮這種運(yùn)算密集型的工作是非常合適的。功能框圖的其它部分不再做介紹。?
?
?
2 圖像壓縮算法?
??? 圖像壓縮中的圖像有彩色和灰度之分??紤]到彩色圖像和灰度圖像的壓縮類似,且大多數(shù)的掃描成象設(shè)備掃的是灰度圖像,所以僅以灰度圖像的壓縮為例介紹DSP上的圖像壓縮。圖像壓縮算法原理圖如圖2所示。
?
?
??? 圖中,首先將原始灰度圖像分為8×8的圖塊,然后對每一圖像塊進(jìn)行FDCT變換,再將變換得到的DCT系數(shù)使用量化表進(jìn)行量化。量化后可得到如下形式的數(shù)據(jù):?
?
?
??? 該數(shù)據(jù)在存儲器中存放的順序如下:?
?
???
?
??? 在存儲器中,非零數(shù)據(jù)和零數(shù)據(jù)交替存放,不便于壓縮,所以要對數(shù)據(jù)進(jìn)行重排列,數(shù)據(jù)的重排列形式如下:?
?
???
?
??? 變換完成后再根據(jù)編碼表對DC系數(shù)和AC系數(shù)分別進(jìn)行編碼,就完成了圖像的壓縮。?
3 利用DSP芯片進(jìn)行圖像壓縮?
3.1 圖像壓縮器的工作過程?
??? 圖像壓縮器工作過程方框圖如圖3所示。?
?
?
??? 圖像數(shù)據(jù)通過I/O接口送入數(shù)字信號處理板,由DSP芯片中的DMA控制器負(fù)責(zé)將數(shù)據(jù)放入輸入緩沖區(qū)中,DSP對緩沖的圖像數(shù)據(jù)進(jìn)行壓縮后,通過HPI接口將壓縮數(shù)據(jù)送出。?
3.2 編程介紹?
??? 這里主要介紹壓縮參數(shù)初始化和壓縮程序。?
3.2.1 壓縮參數(shù)初始化?
??? 由圖2所示的圖像壓縮算法可知,圖像壓縮過程中需要量化表和編碼表,量化表如圖4(a)所示。?
?
?
??? 量化操作就是把8×8圖塊進(jìn)行FDCT變換,將變換后的的DCT系數(shù)用量化表元素來除。由于DSP中有硬件乘法器和移位指令,為了充分提高程序的執(zhí)行速度,應(yīng)該將除法運(yùn)算轉(zhuǎn)化為乘法運(yùn)算和移位運(yùn)算,對上面的量化表元素逐個求倒數(shù)并用16進(jìn)制表示,如圖4(b)所示。?
??? 編碼表有兩個,一個是直流差值編碼表,另一個是交流系數(shù)編碼表,如圖5所示。?
?
?
??? 編碼表中的最左端的一列代表中間碼字,具體編碼時要根據(jù)8x8圖塊的DCT系數(shù)產(chǎn)生中間碼字,再由中間碼字查編碼表,將中間碼字轉(zhuǎn)換為霍夫曼碼,完成編碼。在DSP程序初始化階段要生成量化表和編碼表,量化表可直接將圖4(b)所示的量化表元素代入來得到,編碼表就要按照霍夫曼碼的編碼方法生成霍夫曼碼來得到。由于在壓縮過程中要頻繁地查找編碼表,因此,編碼表的組織形式對程序的執(zhí)行效率影響很大。?
3.2.2 壓縮程序?
??? 圖像壓縮包括FDCT變換、標(biāo)量量化、Zigzag掃描和編碼等幾個步驟,下面分別介紹。?
3.2.2.1FDCT變換?
??? DCT變換公式如下:?
???
??? 式中,CU,CV=
??? 具體壓縮的時候要采用DCT變換的快速算法來加快程序的運(yùn)行速度,將二維的DCT變換分解為兩個一維的DCT變換,可以有效地降低計算量。CCS2.0(Code Composer Studio)中提供了一個成熟的C語言函數(shù)庫,里面包含了進(jìn)行FDCT變換的函數(shù)。函數(shù)原型如下:?
??? void fdct_8×8(short *dct_data, unsigned num_fdcts);?
??? 函數(shù)中dct_data指針指向待變換的圖像數(shù)據(jù),num_fdcts是進(jìn)行DCT變換的圖像塊的數(shù)目。該函數(shù)可以對一大塊連續(xù)存放的圖像塊進(jìn)行DCT變換,特別針對TMS320C6201 DSP芯片的特點(diǎn)進(jìn)行了優(yōu)化??紤]到存儲器的等待時間和指令的并行等問題,執(zhí)行效率非常高,具體的程序開銷可以通過如下公式計算:?
??? 時鐘周期" title="時鐘周期">時鐘周期數(shù)=48+160*num_fdcts;?
??? 要在自己的工程中使用這個函數(shù),必須把img62x.lib函數(shù)庫添加到工程中,并且在主程序文件中包含fdct_8×8.h頭文件。?
3.2.2.2 標(biāo)量量化?
??? 所謂標(biāo)量量化就是對8×8圖像塊的DCT變換系數(shù)使用量化表逐個相除并四舍五入。CCS2.0提供了一個量化函數(shù),其原型如下:?
void quantize?
(?
??? short?????? *data,????? /* Data to be quantized. */?
??? int? ?????? num_blks,? /*Number of 64-element blocks.*/?
??? int???? blk_size,?????? /*Block size (multiple of 8). */?
??? const short *recip_tbl, ??? /*Quant. values (reciprocals). */?
??? int???? q_pt??????????? /*Q-point of Quant values.*/?
??? );?
??? 將圖4(b)所示的量化表元素代入程序,blk_size為64,q_pt為16,data指向量化數(shù)據(jù),即可進(jìn)行快速的量化。該程序同樣經(jīng)過了優(yōu)化,具體的程序開銷可按如下公式計算:?
??? 時鐘周期數(shù)= 25+(blk_size/16)*(4+num_blks*12)?
??? 該函數(shù)同樣包含在img62x.lib庫中,程序中應(yīng)包含quantize.h頭文件。?
3.2.2.3 ZigZag掃描?
??? ZigZag掃描就是對數(shù)據(jù)進(jìn)行重排列。該部分功能簡單、運(yùn)算量也不大,但是對存儲器的訪問非常頻繁,而且影響處理器執(zhí)行速度的主要是對存儲器的訪問速度。一般情況下,CPU訪問內(nèi)部存儲器需要4個時鐘周期,訪問外部存儲器的速度要比內(nèi)部存儲器的速度慢得多,具體情況應(yīng)根據(jù)實(shí)際使用的外部存儲器的類型而定。由于TMS3206201 DSP芯片每秒鐘最多可以執(zhí)行8條指令,如果讓DSP芯片經(jīng)常處于等待狀態(tài)是非常大的浪費(fèi)。解決該問題的最有效的辦法是充分利用數(shù)據(jù)總線的寬度并讓軟件進(jìn)行流水線執(zhí)行。TMS320C6201的數(shù)據(jù)總線寬度是32位,一般情況下DCT系數(shù)使用一個短整型數(shù),只有16位寬度,如果每次同時從存儲器中讀寫兩個數(shù),則可以減少一半訪問存儲器的次數(shù)。由于TMS320C6201有8個功能單元,CPU可以在處理當(dāng)前數(shù)據(jù)的同時去存儲器取下一個數(shù)據(jù)。通過流水線,CPU可以做到每周期訪問一次存儲器,這樣可以使程序的執(zhí)行效率大大提高。一般情況下軟件的流水線安排是由編譯優(yōu)化系統(tǒng)完成的,程序員所要做的是讓自己的程序符合流水線執(zhí)行的要求,并且讓優(yōu)化后的流水線周期盡量短。流水線的要求主要有以下幾點(diǎn):?
??? (1)程序所使用的寄存器數(shù)目不能超過32個;?
??? (2)程序所使用的條件寄存器數(shù)目不能超過5個;?
??? (3)程序中不能含有分支語句,可能的話盡量使用條件指令;?
??? (4)一個寄存器中的變量值不能存放太長時間,實(shí)在不行就換個寄存器存放;?
??? (5)程序所使用的CPU左右兩邊的資源盡量平衡,一般情況下,平衡的資源使用換來的是比較短的流水線周期;?
??? (6)程序中包含的指令不能太多。?
??? 對于用線性匯編語言編寫的程序,應(yīng)該在程序編寫時注意這些問題。對一個用C語言編寫的程序,可以通過觀察編譯系統(tǒng)產(chǎn)生的優(yōu)化后的匯編語言文件來獲得相關(guān)的信息。具體程序略。?
3.2.2.4 編 碼?
??? 編碼部分主要是對量化后的DCT系數(shù)進(jìn)行處理,主要利用了相鄰圖像塊之間的相關(guān)性、量化后的DCT系數(shù)矩陣的連零特性和霍夫曼編碼應(yīng)進(jìn)行壓縮編碼。該部分主要涉及了查表、移位運(yùn)算和存儲器讀寫。DC差值/AC系數(shù)等級表如圖6所示。
?
?
??? DC系數(shù)的編碼流程圖如圖7所示。?
?
?
??? AC系數(shù)的編碼流程圖如圖8所示。?
?
?
??? 其中,ZZ(K)編碼是對不為零的AC DCT系數(shù)進(jìn)行編碼,編碼方法可參考DC差值編碼。?
??? 由于在AC編碼過程當(dāng)中分支語句比較多,為了程序的流水線執(zhí)行,同時為了指令的并行性,大量地使用了條件指令。但是應(yīng)該注意,在TMS320C6201中只有A1、A2、B0、B1、B2五個條件寄存器,不可能滿足所有的需要,因此一定要盡量簡化程序。在實(shí)際使用中,使用該壓縮器壓縮一幅512×512的灰度圖像需要的時間不到55ms,配合適當(dāng)?shù)臄?shù)據(jù)接口可滿足對數(shù)據(jù)率為32Mbit/s的掃描圖像進(jìn)行實(shí)時壓縮。?
參考文獻(xiàn)?
1 TMS320C62x/C67x CPU and Instruction Set User’s?Guide. From HTTP://www.ti.com?
2 TMS320C6201/C6701 Peripherals User’s Guide. From?HTTP://www.ti.com?
3 TMS320C6x Optimizing C Compiler User’s Guide. From??HTTP://www.ti.com?
4 TMS320C6x Assembly Language Tools User’s Guide.From?HTTP://www.ti.com?
5 張維谷,林福宗. 圖像文件格式(上)——Windows編程.北京:清華大學(xué)出版社,1996?
6 任麗香,馬素芬,李芳惠.TMS320C6000系列DSPs的原理與應(yīng)用.北京:電子工業(yè)出版社,2000?
7 何 斌,馬天予,王運(yùn)堅.Visual C++ 數(shù)字圖像處理.北京:人民郵電出版社,2001