《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 基于二維FFT的圖像濾波方法及實(shí)現(xiàn)

基于二維FFT的圖像濾波方法及實(shí)現(xiàn)

2008-12-03
作者:鄒德財1,2,吳海濤1,,盧曉春1

  摘 要: 二維傅立葉變換" title="傅立葉變換">傅立葉變換" title="快速傅立葉變換" title="快速傅立葉變換">快速傅立葉變換">快速傅立葉變換(FFT)在一個傳統(tǒng)概念的處理機(jī)上實(shí)現(xiàn)時,,需要芯片具有更多的邏輯資源。本文給出了基于FPGA的自定義處理機(jī)(CCM)的二維FFT算法和實(shí)現(xiàn),。在CCM的Splash-2平臺上實(shí)現(xiàn)了二維FFT,計算速度達(dá)到180Mflops,最快速度超過Sparc-10工作站的23倍,。同時,對于一個N×N圖像,,這種實(shí)現(xiàn)方法可以滿足二維FFT所需要的O(N2log2N)次的浮點(diǎn)算術(shù)運(yùn)算,。
  關(guān)鍵詞: 自定義處理機(jī)(CCM);二維,;快速傅立葉變換(FFT),; 圖像;Splash-2

?

  當(dāng)被處理的圖像像素相對較小時,,可以直接采用空間域?yàn)V波的方法,。但隨著像素的增多,計算量也隨之增大,。針對這種情況,,本文對像素較大的圖像,,采用了一種將圖像先從空域轉(zhuǎn)換到頻域,執(zhí)行點(diǎn)到點(diǎn)的乘法濾波,,然后通過反傅立葉變換,,將頻域內(nèi)濾波器圖像再轉(zhuǎn)換到空間域的方法。在此基礎(chǔ)上,,對二維快速傅立葉變換采用了基于FPGA的CCM的Splash-2平臺實(shí)現(xiàn)方式,,目的是為了對視頻信號進(jìn)行實(shí)時濾波。實(shí)現(xiàn)過程中需要對浮點(diǎn)數(shù)" title="浮點(diǎn)數(shù)">浮點(diǎn)數(shù)進(jìn)行計算,,采用了CCM可以自定義數(shù)據(jù)格式和算法數(shù)據(jù)流以滿足應(yīng)用的需要,。
1 用傅立葉變換進(jìn)行圖像濾波
  圖1是用快速傅立葉變換進(jìn)行圖像濾波處理的實(shí)現(xiàn)過程[1],其中,,預(yù)處理階段包括確定圖像大小,、獲得填充參數(shù)和生成一個濾波函數(shù)等過程;后處理階段包括計算結(jié)果的實(shí)部" title="實(shí)部">實(shí)部,,修剪圖像以及將圖像進(jìn)行轉(zhuǎn)換等操作,,其他部分將在以下環(huán)節(jié)分別進(jìn)行介紹。

?

1.1 離散傅立葉變換(DFT)
  一個N×N圖像的二維的DFT,,f(x,,y)定義為:
  

  二維的DFT變換可以分解成多個一維的傅立葉變換,則(1)式等同于:
  

  公式(1),、(2)表明一個N×N的二維DFT可以通過先進(jìn)行N個一維DFT(行),,然后再進(jìn)行另外N個一維DFT(列)來計算,即所謂的行列分解法[2],。
1.2 快速傅立葉變換(FFT)
? 執(zhí)行一個N點(diǎn)DFT所需的復(fù)雜乘法和加法運(yùn)算次數(shù)與N2成正比,。由于一維DFT可以被分解,所以進(jìn)行乘法與加法運(yùn)算的次數(shù)正比于N×log2N,。而FFT算法通過“分而治之”的方法來實(shí)現(xiàn)其較高的計算效率,。通過時間與頻率采樣的分組,具有N個值的DFT運(yùn)算可以表示成兩點(diǎn)DFT的組合方式,。這兩點(diǎn)DFT稱為蝶形運(yùn)算,,它需要一次復(fù)乘和兩次復(fù)加來實(shí)現(xiàn)。蝶形結(jié)構(gòu)的符號如圖2所示(左側(cè):基2的蝶形結(jié)構(gòu)),。

?

  用FFT“分而治之”的方法,,一個8點(diǎn)的FFT的計算如圖2所示。N點(diǎn)FFT的每一級運(yùn)算由N/2基2的蝶形組成,,總共有l(wèi)og2N次運(yùn)算,。因此,每個FFT共有(N/2)×log2N個蝶形結(jié)構(gòu)。一個二維FFT可以拆分為兩組一維的DFT運(yùn)算,,且每個DFT可以用一維的FFT來計算,。此外,數(shù)據(jù)以倒位序輸入而以正常的線性順序輸出,。
2 浮點(diǎn)算法
2.1 浮點(diǎn)格式的表示

  為了實(shí)現(xiàn)本文給出的FFT運(yùn)算,,在此設(shè)計了一個較小的18bit的浮點(diǎn)格式。用這種格式來滿足兩種特定要求:(1)動態(tài)范圍需要非常大,,以便能夠準(zhǔn)確地表示一個實(shí)數(shù)的大小,、正負(fù);(2)進(jìn)入Splash-2平臺的XILINX 4010處理器的數(shù)據(jù)通道寬度為36bit,,且每一個時鐘周期" title="時鐘周期">時鐘周期內(nèi)都輸入復(fù)數(shù)的實(shí)部與虛部,。基于這些要求,,使用的浮點(diǎn)格式如圖3所示。

?

2.2 浮點(diǎn)加法減法與乘法
  為了在每個時鐘周期產(chǎn)生一個結(jié)果,,開發(fā)浮點(diǎn)加減法程序來實(shí)現(xiàn)管道化單元,,所實(shí)現(xiàn)的浮點(diǎn)加法與減法算法與最傳統(tǒng)的處理器相似。
  浮點(diǎn)乘法與整數(shù)乘法類似,。因?yàn)楦↑c(diǎn)數(shù)是以“符號-數(shù)字”的形式存儲,,乘法器僅需要處理無符號整數(shù),與浮點(diǎn)加法器的結(jié)構(gòu)類似[3],,浮點(diǎn)乘法器單元也是每個時鐘周期產(chǎn)生一次結(jié)果,,這種設(shè)計的瓶頸是整數(shù)乘法器。
  本文將VHDL語言放在XILINX芯片相應(yīng)開發(fā)工具ISE中進(jìn)行編譯,,同時給出時延,、速度等相關(guān)參數(shù)。
  浮點(diǎn)運(yùn)算單元還與FIR濾波器組合一起使用,。FFT運(yùn)算以10MHz工作,,轉(zhuǎn)換的結(jié)果存儲在Splash-2開發(fā)板的存儲器中。算術(shù)單元的最大時鐘速度至少可以工作在10MHz,。
3 FFT的實(shí)現(xiàn)
  本文從一個幀緩沖區(qū)得到連續(xù)的視頻圖像提供給FFT和IFFT參與并行計算從而構(gòu)建出濾波算法,。以下討論用于實(shí)現(xiàn)FFT、FFT中的蝶形操作以及濾波處理的再循環(huán)算法,。
3.1 FFT再循環(huán)算法
  為了計算二維的FFT,,需要設(shè)計一個通過蝶形運(yùn)算的數(shù)據(jù)循環(huán)算法。圖4給出了相應(yīng)的結(jié)構(gòu)圖,。

?

?

  兩列存儲器用來存儲FFT的每一級運(yùn)算的輸入輸出數(shù)據(jù),。每一列存儲器包括三個處理單元,用來把兩個18bit浮點(diǎn)數(shù)的實(shí)部與虛部存儲到它們的本地內(nèi)存。由于本地內(nèi)存只有16bit寬,,先將兩個18bit浮點(diǎn)數(shù)值進(jìn)行分割,,然后按順序放在三個存儲單元中。為了計算輸入圖像的FFT,,來自于幀緩沖區(qū)中的數(shù)據(jù)幀從8bit的整數(shù)被轉(zhuǎn)換為18bit的浮點(diǎn)數(shù)存儲在第一列中,。在計算二維FFT時,首先計算圖像每一行的一維FFT,,然后計算行變換后每一列的FFT,。一維FFT的計算與圖2中所示方法相同。FFT的第一級通過從第一列存儲區(qū)以倒位序讀取數(shù)據(jù)采樣點(diǎn)的每一行,,然后將它送給蝶形操作進(jìn)行計算,。蝶形計算的結(jié)果存儲在第二列存儲區(qū)。當(dāng)?shù)谝患壷械牡斡嬎阃瓿蓵r,,開始第二級計算,,從第二列存儲區(qū)中順序讀取數(shù)據(jù)然后送入蝶形處理器,這一操作的結(jié)果存儲在第一列存儲區(qū),。這一循環(huán)方法通過從一個存儲區(qū)中讀數(shù)而在另一外存儲區(qū)存儲計算結(jié)果來進(jìn)行,。當(dāng)圖中每一行一維FFT計算完時循環(huán)終止。第二組一維FFT與第一組以相同的方法進(jìn)行計算,,直到第二組的FFT計算完第一組的所有結(jié)果,。當(dāng)最后一次FFT的最后一級計算完時,數(shù)據(jù)從X11傳到X15進(jìn)行濾波,。一次完整的二維FFT過程包括2×N2×log2N次蝶形操作,。
3.2 蝶形實(shí)現(xiàn)
  蝶形操作是FFT算法的核心。蝶形運(yùn)算框圖如圖2所示,,它包括了一次復(fù)乘與兩次浮點(diǎn)加法,、減法。復(fù)乘包括4次乘法和兩次加減,。每個時鐘周期內(nèi)以10MHz進(jìn)行8次浮點(diǎn)操作,。蝶形操作的計算量為80Mflops。圖5表示在Splash-2平臺上如何將蝶形運(yùn)算在5個處理單元之間進(jìn)行分割計算,。
  復(fù)乘的實(shí)部與虛部分別用下式來表示:
  
  圖2中蝶形運(yùn)算輸入A與輸入B如圖5中的f(x)所示,。A值先送入計算,在下個時鐘周期再送入B的值,。輸入A不與旋轉(zhuǎn)因子相乘而是通過多路選擇開關(guān)對它乘1加0無改變地通過循環(huán)運(yùn)算,。當(dāng)B的實(shí)部與虛部送入時,它們依次通過4個處理單元來得到復(fù)乘結(jié)果,。處理單元1(PE1)讀出相應(yīng)旋轉(zhuǎn)因子的實(shí)部并將它與B的實(shí)部相乘,,計算結(jié)果與旋轉(zhuǎn)因子送到處理單元3(PE3),,B的實(shí)部與虛部送到處理單元2(PE2)。PE2將B的虛部與相應(yīng)旋轉(zhuǎn)因子相乘結(jié)果送入PE3,。PE3從PE1中讀取B.re.re,,把它與從PE2中讀取的B.im.im相加,得到復(fù)乘實(shí)部的最終結(jié)果.re,;復(fù)乘虛部.im可用同樣的方法在PE3與PE4中得到,。在第一個時鐘周期內(nèi)將A與相加得到X,在第二個時鐘周期內(nèi)將A減去得到Y(jié),,這樣就完成了蝶形運(yùn)算,。

?

  由于存儲器數(shù)據(jù)總線的寬度僅為16bit,在本地PE1,、PE2的存儲器中無法存儲18bit格式的旋轉(zhuǎn)因子,。因此從18bit浮點(diǎn)指數(shù)域中減去2bit來產(chǎn)生一個較小的16bit格式,而用歐拉定理可以將旋轉(zhuǎn)因子表示成正余弦函數(shù)的形式,,因此浮點(diǎn)數(shù)的值將不會有大于0的指數(shù),。因此,指數(shù)域范圍從0~-31變化,,這樣指數(shù)域的長度從7bit減到5bit,。當(dāng)旋轉(zhuǎn)因子被讀入處理單元時,在相應(yīng)運(yùn)算單元中進(jìn)行一次從16bit格式到18bit格式的轉(zhuǎn)換即可,。
3.3 濾波
  當(dāng)輸入圖像轉(zhuǎn)換到頻域時,,矩陣濾波系數(shù)H(u,,v)和轉(zhuǎn)換后的圖像可以通過濾波器得到濾波后的圖像,。矩陣H(u,v)元素值的范圍為0~1.0,,它與蝶形運(yùn)算旋轉(zhuǎn)因子以相同的的存儲方式存儲在本地的存儲器中,。濾波系數(shù)存儲在X15和X16芯片的本地存儲器中。濾波器芯片包括一個浮點(diǎn)乘法單元和濾波系數(shù)地址邏輯單元,,X15與X16用來對轉(zhuǎn)換后圖像的實(shí)部和虛部分別進(jìn)行濾波,。
  不同類型的濾波器如理想濾波器以及其他類型濾波器可以先計算,然后從宿主機(jī)下載到開發(fā)平臺的存儲器中,。
  由于CCM的靈活性,,浮點(diǎn)格式可以通過自定義方式以最小的比特數(shù)來達(dá)到最大精度。利用Splash-2的并行結(jié)構(gòu),,地址計算,、蝶形運(yùn)算以及濾波可以并行地進(jìn)行計算。通過蝶形運(yùn)算操作,,每個時鐘周期內(nèi)可以以10MHz的速度得到一個實(shí)數(shù)或復(fù)數(shù)結(jié)果,。這種應(yīng)用的性能類似于一個典型的DSP處理器所達(dá)到的性能,。


參考文獻(xiàn)
[1] RAFAE1 C G,RICHARD E W,,STEVEN L E.數(shù)字圖像處理.北京:電子工業(yè)出版社,,2006.
[2] DAN E D,RUSSELL M M.多維數(shù)字信號處理.北京:科學(xué)出版社,,1991.
[3] SHIRAZI N,,WALTERS A P A.Quantitative analysis of floating point arithmetic on FPGA based custom computing?machines.IEEE Symposium on FPGAs for Custom Computing Machines,1995,,(4).

本站內(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)和其它問題,,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]