摘 要: 二維傅立葉變換" title="傅立葉變換">傅立葉變換" title="快速傅立葉變換" title="快速傅立葉變換">快速傅立葉變換">快速傅立葉變換(FFT)在一個傳統(tǒng)概念的處理機(jī)上實現(xiàn)時,,需要芯片具有更多的邏輯資源,。本文給出了基于FPGA的自定義處理機(jī)(CCM)的二維FFT算法和實現(xiàn)。在CCM的Splash-2平臺上實現(xiàn)了二維FFT,,計算速度達(dá)到180Mflops,,最快速度超過Sparc-10工作站的23倍。同時,,對于一個N×N圖像,,這種實現(xiàn)方法可以滿足二維FFT所需要的O(N2log2N)次的浮點算術(shù)運算。
關(guān)鍵詞: 自定義處理機(jī)(CCM),;二維,;快速傅立葉變換(FFT); 圖像,;Splash-2
?
當(dāng)被處理的圖像像素相對較小時,,可以直接采用空間域濾波的方法。但隨著像素的增多,,計算量也隨之增大,。針對這種情況,本文對像素較大的圖像,,采用了一種將圖像先從空域轉(zhuǎn)換到頻域,,執(zhí)行點到點的乘法濾波,然后通過反傅立葉變換,,將頻域內(nèi)濾波器圖像再轉(zhuǎn)換到空間域的方法,。在此基礎(chǔ)上,對二維快速傅立葉變換采用了基于FPGA的CCM的Splash-2平臺實現(xiàn)方式,,目的是為了對視頻信號進(jìn)行實時濾波,。實現(xiàn)過程中需要對浮點數(shù)" title="浮點數(shù)">浮點數(shù)進(jìn)行計算,采用了CCM可以自定義數(shù)據(jù)格式和算法數(shù)據(jù)流以滿足應(yīng)用的需要,。
1 用傅立葉變換進(jìn)行圖像濾波
圖1是用快速傅立葉變換進(jìn)行圖像濾波處理的實現(xiàn)過程[1],,其中,預(yù)處理階段包括確定圖像大小,、獲得填充參數(shù)和生成一個濾波函數(shù)等過程,;后處理階段包括計算結(jié)果的實部" title="實部">實部,修剪圖像以及將圖像進(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點DFT所需的復(fù)雜乘法和加法運算次數(shù)與N2成正比。由于一維DFT可以被分解,,所以進(jìn)行乘法與加法運算的次數(shù)正比于N×log2N,。而FFT算法通過“分而治之”的方法來實現(xiàn)其較高的計算效率。通過時間與頻率采樣的分組,,具有N個值的DFT運算可以表示成兩點DFT的組合方式,。這兩點DFT稱為蝶形運算,它需要一次復(fù)乘和兩次復(fù)加來實現(xiàn),。蝶形結(jié)構(gòu)的符號如圖2所示(左側(cè):基2的蝶形結(jié)構(gòu)),。
?
用FFT“分而治之”的方法,一個8點的FFT的計算如圖2所示,。N點FFT的每一級運算由N/2基2的蝶形組成,,總共有l(wèi)og2N次運算。因此,,每個FFT共有(N/2)×log2N個蝶形結(jié)構(gòu)。一個二維FFT可以拆分為兩組一維的DFT運算,,且每個DFT可以用一維的FFT來計算,。此外,數(shù)據(jù)以倒位序輸入而以正常的線性順序輸出,。
2 浮點算法
2.1 浮點格式的表示
為了實現(xiàn)本文給出的FFT運算,,在此設(shè)計了一個較小的18bit的浮點格式。用這種格式來滿足兩種特定要求:(1)動態(tài)范圍需要非常大,,以便能夠準(zhǔn)確地表示一個實數(shù)的大小,、正負(fù);(2)進(jìn)入Splash-2平臺的XILINX 4010處理器的數(shù)據(jù)通道寬度為36bit,,且每一個時鐘周期" title="時鐘周期">時鐘周期內(nèi)都輸入復(fù)數(shù)的實部與虛部,。基于這些要求,,使用的浮點格式如圖3所示,。
?
2.2 浮點加法減法與乘法
為了在每個時鐘周期產(chǎn)生一個結(jié)果,開發(fā)浮點加減法程序來實現(xiàn)管道化單元,,所實現(xiàn)的浮點加法與減法算法與最傳統(tǒng)的處理器相似,。
浮點乘法與整數(shù)乘法類似。因為浮點數(shù)是以“符號-數(shù)字”的形式存儲,,乘法器僅需要處理無符號整數(shù),,與浮點加法器的結(jié)構(gòu)類似[3],浮點乘法器單元也是每個時鐘周期產(chǎn)生一次結(jié)果,,這種設(shè)計的瓶頸是整數(shù)乘法器,。
本文將VHDL語言放在XILINX芯片相應(yīng)開發(fā)工具ISE中進(jìn)行編譯,,同時給出時延、速度等相關(guān)參數(shù),。
浮點運算單元還與FIR濾波器組合一起使用,。FFT運算以10MHz工作,轉(zhuǎn)換的結(jié)果存儲在Splash-2開發(fā)板的存儲器中,。算術(shù)單元的最大時鐘速度至少可以工作在10MHz,。
3 FFT的實現(xiàn)
本文從一個幀緩沖區(qū)得到連續(xù)的視頻圖像提供給FFT和IFFT參與并行計算從而構(gòu)建出濾波算法。以下討論用于實現(xiàn)FFT,、FFT中的蝶形操作以及濾波處理的再循環(huán)算法,。
3.1 FFT再循環(huán)算法
為了計算二維的FFT,需要設(shè)計一個通過蝶形運算的數(shù)據(jù)循環(huán)算法,。圖4給出了相應(yīng)的結(jié)構(gòu)圖,。
?
?
兩列存儲器用來存儲FFT的每一級運算的輸入輸出數(shù)據(jù)。每一列存儲器包括三個處理單元,,用來把兩個18bit浮點數(shù)的實部與虛部存儲到它們的本地內(nèi)存,。由于本地內(nèi)存只有16bit寬,先將兩個18bit浮點數(shù)值進(jìn)行分割,,然后按順序放在三個存儲單元中,。為了計算輸入圖像的FFT,來自于幀緩沖區(qū)中的數(shù)據(jù)幀從8bit的整數(shù)被轉(zhuǎn)換為18bit的浮點數(shù)存儲在第一列中,。在計算二維FFT時,,首先計算圖像每一行的一維FFT,然后計算行變換后每一列的FFT,。一維FFT的計算與圖2中所示方法相同,。FFT的第一級通過從第一列存儲區(qū)以倒位序讀取數(shù)據(jù)采樣點的每一行,然后將它送給蝶形操作進(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 蝶形實現(xiàn)
蝶形操作是FFT算法的核心,。蝶形運算框圖如圖2所示,,它包括了一次復(fù)乘與兩次浮點加法、減法,。復(fù)乘包括4次乘法和兩次加減,。每個時鐘周期內(nèi)以10MHz進(jìn)行8次浮點操作。蝶形操作的計算量為80Mflops,。圖5表示在Splash-2平臺上如何將蝶形運算在5個處理單元之間進(jìn)行分割計算,。
復(fù)乘的實部與虛部分別用下式來表示:
圖2中蝶形運算輸入A與輸入B如圖5中的f(x)所示。A值先送入計算,,在下個時鐘周期再送入B的值,。輸入A不與旋轉(zhuǎn)因子相乘而是通過多路選擇開關(guān)對它乘1加0無改變地通過循環(huán)運算。當(dāng)B的實部與虛部送入時,,它們依次通過4個處理單元來得到復(fù)乘結(jié)果,。處理單元1(PE1)讀出相應(yīng)旋轉(zhuǎn)因子的實部并將它與B的實部相乘,計算結(jié)果與旋轉(zhuǎn)因子送到處理單元3(PE3),,B的實部與虛部送到處理單元2(PE2),。PE2將B的虛部與相應(yīng)旋轉(zhuǎn)因子相乘結(jié)果送入PE3。PE3從PE1中讀取B.re
.re,,把它與從PE2中讀取的B.im
.im相加,,得到復(fù)乘實部的最終結(jié)果
.re;復(fù)乘虛部
.im可用同樣的方法在PE3與PE4中得到,。在第一個時鐘周期內(nèi)將A與
相加得到X,在第二個時鐘周期內(nèi)將A減去
得到Y(jié),,這樣就完成了蝶形運算,。
?
由于存儲器數(shù)據(jù)總線的寬度僅為16bit,在本地PE1,、PE2的存儲器中無法存儲18bit格式的旋轉(zhuǎn)因子,。因此從18bit浮點指數(shù)域中減去2bit來產(chǎn)生一個較小的16bit格式,而用歐拉定理可以將旋轉(zhuǎn)因子表示成正余弦函數(shù)的形式,,因此浮點數(shù)的值將不會有大于0的指數(shù),。因此,指數(shù)域范圍從0~-31變化,,這樣指數(shù)域的長度從7bit減到5bit,。當(dāng)旋轉(zhuǎn)因子被讀入處理單元時,在相應(yīng)運算單元中進(jìn)行一次從16bit格式到18bit格式的轉(zhuǎn)換即可,。
3.3 濾波
當(dāng)輸入圖像轉(zhuǎn)換到頻域時,,矩陣濾波系數(shù)H(u,v)和轉(zhuǎn)換后的圖像可以通過濾波器得到濾波后的圖像。矩陣H(u,,v)元素值的范圍為0~1.0,,它與蝶形運算旋轉(zhuǎn)因子以相同的的存儲方式存儲在本地的存儲器中。濾波系數(shù)存儲在X15和X16芯片的本地存儲器中,。濾波器芯片包括一個浮點乘法單元和濾波系數(shù)地址邏輯單元,,X15與X16用來對轉(zhuǎn)換后圖像的實部和虛部分別進(jìn)行濾波。
不同類型的濾波器如理想濾波器以及其他類型濾波器可以先計算,,然后從宿主機(jī)下載到開發(fā)平臺的存儲器中,。
由于CCM的靈活性,浮點格式可以通過自定義方式以最小的比特數(shù)來達(dá)到最大精度,。利用Splash-2的并行結(jié)構(gòu),,地址計算、蝶形運算以及濾波可以并行地進(jìn)行計算,。通過蝶形運算操作,,每個時鐘周期內(nèi)可以以10MHz的速度得到一個實數(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).