郭前崗,潘 磊,周西峰
(南京郵電大學(xué) 自動化學(xué)院,江蘇 南京 210046)
在信息社會迅猛發(fā)展的21世紀(jì),多媒體信息日益增多,其中人類主要依靠圖像來接收各種各樣的信息。圖像中包含如此巨大的數(shù)據(jù)量,如果不經(jīng)過壓縮,不僅超出了計(jì)算機(jī)的存儲和計(jì)算能力,而且無法完成信息的實(shí)時傳輸。圖像的高速傳輸和所需巨大的存儲容量已成為數(shù)字圖像通信的最大障礙。離散余弦變換(DCT)由于其變換特點(diǎn)被認(rèn)為是性能最接近K—L變換的準(zhǔn)最佳變換,現(xiàn)在已經(jīng)是最流行的圖像壓縮變換技術(shù),并已經(jīng)在 JPEG、MPEG-1/2/4、H.26x等國際編碼標(biāo)準(zhǔn)中獲得了廣泛的應(yīng)用[1]。
由于集成電子技術(shù)的高速發(fā)展和廣泛運(yùn)用,數(shù)字圖像處理也由軟件向硬件過渡并得到了非常迅速的發(fā)展。FPGA作為當(dāng)今運(yùn)用極為廣泛的可編程邏輯器件,也是數(shù)字圖像處理的理想器件。目前,利用FPGA進(jìn)行圖像處理主要是直接在FPGA上利用硬件描述語言或EDA軟件進(jìn)行設(shè)計(jì),這種設(shè)計(jì)方法的最大優(yōu)點(diǎn)就是速度快,可以利用流水線實(shí)現(xiàn),具有一定的靈活性。
基于行列分解的2D-DCT由于算法規(guī)律性強(qiáng)、實(shí)現(xiàn)結(jié)構(gòu)直觀、時序控制簡單而被廣泛應(yīng)用。本文提出使用行列分解法和分布式算法來實(shí)現(xiàn)2D-DCT,可以減少硬件資源,提高運(yùn)算速度,具有一定的現(xiàn)實(shí)意義。
離散余弦變換經(jīng)常使用在信號處理和圖像處理中,用于對信號和圖像進(jìn)行有損數(shù)據(jù)壓縮。這是由于離散余弦變換具有很強(qiáng)的“能量集中”特性,使圖像的主要信息集中在變換后的低頻上,并且能夠去掉像素間較強(qiáng)的相關(guān)性,讓圖像的信息集中在少數(shù)幾個系數(shù)上,以減少冗余達(dá)到對圖像進(jìn)行壓縮的目的。
設(shè) f(x,y)(x=0,1,…,N-1;y=0,1,…,M-1)為 N×M的二維信號序列,則其二維離散余弦變換定義為:
其中,u=0,1,…,L,…,N-1是水平方向的頻率,v=0,1,…,L,…,M-1,是垂直方向的頻率,F(xiàn)(u,v)是頻域的系數(shù)值,f(x,y)是空間域的系數(shù)值,C(u)=由于二維離散余弦變換具有行列分解性[2],即把2D-DCT
分解為 2個 1D-DCT來求解,因此欲求 F(u,v),可以先對 f(x,y)每一行數(shù)據(jù)作一維離散余弦變換得到 F(x,
y),然后再對每一列數(shù)據(jù)進(jìn)行一維離散余弦變換便可得到 F(u,v),整個計(jì)算流程如圖 1所示。 因此式(1)可改寫成:
圖1 2D-DCT的計(jì)算流程
式(2)方括號中的部分就是1D-DCT的計(jì)算公式。由于DCT在M=N=8時變換的平均性能最好,因此本文采用8×8的數(shù)據(jù)塊作為變換對象。
根據(jù)2D-DCT的行列分解性及2D-DCT的計(jì)算流程所設(shè)計(jì)的系統(tǒng)框圖如圖2所示,整個系統(tǒng)由控制模塊、1D-DCT模塊和行列轉(zhuǎn)換模塊3個模塊組成。
圖2 2D-DCT系統(tǒng)模塊設(shè)計(jì)框圖
在每個時鐘的上升沿從數(shù)據(jù)輸入端輸入一個數(shù)據(jù),8個時鐘周期后,輸入的就是8×8數(shù)據(jù)塊的一行數(shù)據(jù)。同時,控制模塊給1D-DCT模塊一個信號,通知它對這8個數(shù)據(jù)進(jìn)行1D-DCT變換,并且在計(jì)算完之后把結(jié)果存進(jìn)行列轉(zhuǎn)換模塊中。如此反復(fù)8次后,就對8×8數(shù)據(jù)塊完成了行變換,所得到的64個數(shù)據(jù)依然是以8×8的矩陣形式存放在行列轉(zhuǎn)換模塊中。之后控制模塊分8次從行列轉(zhuǎn)換模塊中讀出8×8矩陣的每一列數(shù)據(jù),再送入1D-DCT模塊中進(jìn)行變換,變換后的數(shù)據(jù)就是8×8數(shù)據(jù)塊的2D-DCT變換結(jié)果。
控制模塊用于保持整個模塊設(shè)計(jì)的時鐘同步,并且使用控制信號來控制1D-DCT模塊狀態(tài)之間的轉(zhuǎn)換。1D-DCT模塊有空閑狀態(tài)和1D-DCT變換狀態(tài)2個狀態(tài)。當(dāng)控制信號控制整個系統(tǒng)復(fù)位時,控制模塊通知1D-DCT模塊進(jìn)入空閑狀態(tài);當(dāng)需要計(jì)算的數(shù)據(jù)輸入完成時,控制模塊通知1D-DCT模塊進(jìn)入1D-DCT變換狀態(tài)。1D-DCT模塊的狀態(tài)轉(zhuǎn)移圖如圖3所示。
設(shè) X=[X(0),X(1),X(2),X(3),X(4),X(5),X(6),X(7)]為輸入的一行信號序列,Y=[Y(0),Y(1),Y(2),Y(3),Y(4),Y(5),Y(6),Y(7)]為 1D-DCT 變換后輸出的信號序列,根據(jù)1D-DCT的數(shù)學(xué)定義式[3]并且在經(jīng)過合并同類項(xiàng)后得到:
圖4 8輸入1D-DCT結(jié)構(gòu)
由于FPGA中硬件乘法器資源有限,直接應(yīng)用乘法會消耗大量的資源。本方案中使用分布式算法[4]來實(shí)現(xiàn)乘法,它是一種適合FPGA的乘加運(yùn)算,與傳統(tǒng)算法實(shí)現(xiàn)乘加運(yùn)算的區(qū)別在于,執(zhí)行部分積運(yùn)算的先后順序不一樣。分布式算法在實(shí)現(xiàn)乘加功能時,首先將各輸入數(shù)據(jù)的每一對應(yīng)位產(chǎn)生的部分積預(yù)先進(jìn)行相加,形成相應(yīng)的部分積,然后再對各個部分積累加形成最終結(jié)果;而傳統(tǒng)算法是所有乘積已經(jīng)產(chǎn)生之后再相加完成乘加運(yùn)算的。與傳統(tǒng)算法相比,分布式算法可極大地減少硬件電路的規(guī)模,提高電路的執(zhí)行速度。分布式乘法器結(jié)構(gòu)如圖5所示。
圖5 分布式乘法器
其中Cn為常系數(shù)。這種乘法器不僅能夠有效地減少硬件資源,而且在增加輸出端口時能夠減小數(shù)據(jù)傳輸所帶來的延遲和布局布線面積[5]。
本文使用同步動態(tài)隨機(jī)存儲器(SDRAM)來存儲第一次1D-DCT的中間結(jié)果及數(shù)據(jù)的行列轉(zhuǎn)換。由于SDRAM與系統(tǒng)時鐘同步,因此避免了不必要的等待周期,減少了數(shù)據(jù)存儲時間。SDRAM的核心結(jié)構(gòu)由多個內(nèi)存單元組成,這些內(nèi)存單元又分成由行和列組成的二維陣列。2D-DCT變換首先是對8×8數(shù)據(jù)塊的每一行數(shù)據(jù)進(jìn)行1D-DCT變換,然后將結(jié)果放入SDRAM中,每一行的結(jié)果就占SDRAM中的一行內(nèi)存。SDRAM通過采用地址線行列復(fù)用技術(shù)讀取其儲存的內(nèi)容,訪問這些內(nèi)存時,在地址線上依次給出行地址和列地址[6],讀出SDRAM中的每一列數(shù)據(jù),再重新送入1D-DCT模塊中進(jìn)行1DDCT變換,這樣就完成了整個2D-DCT的變換。
整個設(shè)計(jì)采用Verilog HDL語言進(jìn)行編程,使用Xilinx公司的 Spartan3E系列 FPGA(XC3S500E)實(shí)現(xiàn),時鐘晶振為50 MHz,SDRAM容量為512 MB,位寬為16 bit,同步時鐘能達(dá)到100 MHz。使用的編程軟件是ISE,仿真軟件是ModelSim。
圖6是用ModelSim仿真軟件仿真出來的2D-DCT的仿真結(jié)果及執(zhí)行結(jié)果。其中,din是8 bit數(shù)據(jù)輸入端口,dout是經(jīng)變換后12 bit數(shù)據(jù)輸出端口。由執(zhí)行結(jié)果可以看出,從輸入端口輸入的64個數(shù)據(jù)在經(jīng)過2D-DCT變換后,所得到的結(jié)果與期望值一致。
圖6 2D-DCT仿真結(jié)果及執(zhí)行結(jié)果
本文提出了分布式算法和行列分解法相結(jié)合的方案來實(shí)現(xiàn)2D-DCT,該方案不僅能夠減少硬件資源的使用,提高資源的利用率,并能提高運(yùn)算速度,能夠滿足數(shù)字圖像和視頻壓縮的實(shí)時性要求。在查找表中所使用的值取的精度不夠高,所以存在一定的誤差,但這種誤差不會引起人眼視覺上的差別,是允許存在的。因此,該方案可作為用FPGA來進(jìn)行數(shù)字圖像和視頻壓縮中的一部分。
[1]王相海,宋傳鳴.圖像及視頻可分級編碼[M].北京:科學(xué)出版社,2009.
[2]王新年,張濤.數(shù)字圖像壓縮技術(shù)實(shí)用教程[M].北京:機(jī)械工業(yè)出版社,2009.
[3]KASSEM A,HAMAD M,HAIDAMOUS E.Image compression on FPGA using DCT[C].IEEE International Conference on the Engineering Applications, 2009(7):320-323.
[4]FAKHR W,EL-BANNA H.An efficient implementation of the1D DCT using FPGA technology[C].11th IEEE International Conference and Workshop on the Engineering of Computer-Based Systems, 2004(7): 356-360.
[5]PRASOON A K, RAJAN K.4×4 2-D DCT for H.264/AVC[C].International Conference on Advances in Computing,Communication and Control, 2009(5):573-576.
[6]NAVINER L,DANGER J L.Efficient implementation for high accuracy DCT processor based on FPGA [C].42nd Midwest Symposium on Circuits and System, 1999,8(1):508-511.