基于Altera MegaCore實(shí)現(xiàn)FFT的方法
0 引 言
FFT(快速傅里葉變換)是計(jì)算離散傅里葉變換(DFT)的高效算法,它把計(jì)算N 點(diǎn)DFT 的乘法運(yùn)算量從N2 次下降到N/2log2N 次。FFT 的出現(xiàn)對(duì)數(shù)字信號(hào)處理的發(fā)展起著至關(guān)重要的作用,它可應(yīng)用于傅里葉變換所能涉及的任何領(lǐng)域,為廣泛應(yīng)用數(shù)學(xué)方法處理數(shù)字信號(hào)開(kāi)辟了新局面[ 1 ] 。
傳統(tǒng)的FFT 實(shí)現(xiàn)方法是通過(guò)軟件(軟件編程)和硬件(專(zhuān)用芯片ASIC)這兩種方法來(lái)實(shí)現(xiàn),而近年來(lái),F(xiàn)PGA 發(fā)展十分迅速,這給FFT 設(shè)計(jì)提供了一個(gè)新思路[2]。為了更好地滿足設(shè)計(jì)人員的需要,各大公司相繼推出了I P 模塊,本文提出了一種采用Altera 公司的IP Core FFT MegaCore來(lái)實(shí)現(xiàn)FFT 的簡(jiǎn)單方法。
1 FFT MegaCore核的性能
Altera 公司的FFT MegaCore 是一個(gè)高性能、高參數(shù)化的快速傅里葉變換處理器,可以高效的完成FFT 和IFFT 運(yùn)算,支持的器件系列包括Stratix Ⅱ、StratixGX、StratixⅡGX、Stratix、Cyclone、CycloneⅡ以及CycloneⅢ等,采用基2/4頻域抽取(DIF)FFT算法,運(yùn)算長(zhǎng)度從64 到16384,使用嵌入式內(nèi)存,系統(tǒng)最大時(shí)鐘頻率大于300MHz。FFT 處理器可以設(shè)置兩種不同的引擎結(jié)構(gòu):四輸出和單輸出,結(jié)構(gòu)圖如圖1 和圖2 所示[3]。
為了增加F F T 兆核函數(shù)的總吞吐量,也可以在一個(gè)FFT 兆核函數(shù)變量中使用多個(gè)并行引擎。復(fù)取樣數(shù)據(jù)X[k,m]從內(nèi)部存儲(chǔ)器并行讀出并由變換開(kāi)關(guān)(SW)重新排序,排序后的取樣數(shù)據(jù)由基4 處理器處理并得到復(fù)數(shù)輸出G [ k ,m],由于基4 按頻率抽選(DIF)分解方法固有的數(shù)字特點(diǎn),在蝶形處理器[ 4 ]輸出上僅需要3 個(gè)復(fù)數(shù)乘法器完成3 次乘旋轉(zhuǎn)因子( 有一個(gè)因子為1 ,不需要乘) 計(jì)算。這種實(shí)現(xiàn)結(jié)構(gòu)在一個(gè)單時(shí)鐘周期內(nèi)計(jì)算所有四個(gè)基4 蝶形復(fù)數(shù)輸出。同時(shí),為了辨別取樣數(shù)據(jù)的最大動(dòng)態(tài)范圍,四個(gè)輸出由塊浮點(diǎn)單元(BFPU)并行估計(jì),丟棄適當(dāng)?shù)淖畹臀?LSB),在寫(xiě)入內(nèi)部存儲(chǔ)器之前對(duì)復(fù)數(shù)值進(jìn)行四舍五入并行重新排序。
若要求轉(zhuǎn)換時(shí)間盡量小,四輸出是最佳選擇;若要求資源盡量少,單輸出比較合適。FFT 處理器支持3 種I/O 數(shù)據(jù)流結(jié)構(gòu):連續(xù)型、緩沖突發(fā)型、突發(fā)型。連續(xù)型允許在處理過(guò)程中連續(xù)輸入數(shù)據(jù);緩沖突發(fā)型與連續(xù)型相比,占用內(nèi)存資源較小,但這是以減少平均吞吐量為代價(jià)的;突發(fā)型與緩沖突發(fā)型類(lèi)似,但占用內(nèi)存資源更少,也是以減少平均吞吐量為代價(jià)的。
圖1 FFT處理器四輸出引擎結(jié)構(gòu)
圖2 FFT處理器單輸出引擎結(jié)構(gòu)
2 整體方案
整體方案設(shè)計(jì)框圖如圖3 所示。輸入緩沖器和輸出緩沖器分別存儲(chǔ)預(yù)處理數(shù)據(jù)和F F T 變換結(jié)果,F(xiàn) F T 運(yùn)算器負(fù)責(zé)F F T 運(yùn)算;控制器為輸入緩沖器和輸出緩沖器提供讀寫(xiě)地址和控制運(yùn)算時(shí)序及緩沖器的讀寫(xiě)操作。下面重點(diǎn)介紹FFT 運(yùn)算器的實(shí)現(xiàn)。
圖3 整體方案設(shè)計(jì)框圖
3 FFT運(yùn)算器的實(shí)現(xiàn)
FFT 運(yùn)算器采用FFT MegaCore 實(shí)現(xiàn),用Quartus Ⅱ仿真軟件設(shè)計(jì)時(shí)產(chǎn)生的FFT MegaCore 模塊圖如圖4 所示[5]。這里采用器件為Altera 公司的Stratix 系列,變化域長(zhǎng)度設(shè)置為6 4 ,數(shù)據(jù)量精度為2 4 b i t ,旋轉(zhuǎn)因子量化精度為24bit。引擎結(jié)構(gòu)可以選四輸出,I/O數(shù)據(jù)流結(jié)構(gòu)選連續(xù)型[3]。在工程中,設(shè)計(jì)者也可以根據(jù)實(shí)際情況選擇其他的參數(shù)設(shè)置。
圖4 FFT MegaCore模塊
在F P G A 硬件設(shè)計(jì)中,一個(gè)乘法器占用的資源要遠(yuǎn)大于一個(gè)加法器占用的資源,而該模塊主要是完成復(fù)數(shù)乘法運(yùn)算,我們則可以通過(guò)數(shù)學(xué)變換減少乘法器的數(shù)量。例如兩個(gè)復(fù)數(shù)a+jb 和c+jd 的乘積結(jié)果e+jf,其中e=ac-bd,f=ad+bc,變換得e=(a+b)c-b(c+d),f=(a+b)c-a(c-d),可以看出實(shí)際上是增加三個(gè)加法器來(lái)減少一個(gè)乘法器。
FFT MegaCore 端口定義如下。
clk:輸入,F(xiàn)FT 系統(tǒng)時(shí)鐘信號(hào);
reset:輸入,F(xiàn)FT高有效同步復(fù)位信號(hào),低時(shí)FFT工作;
master_sink_dav:輸入,指示主接收器數(shù)據(jù)有效信號(hào);
master_sink_sop:輸入,輸入數(shù)據(jù)包起始位置指示信號(hào);
inv_i:輸入,轉(zhuǎn)換方向控制信號(hào),低有效時(shí)做FFT,高有效時(shí)做IFFT;
data_real_in[23..0]:輸入,輸入實(shí)部數(shù)據(jù);
data_imag_in[23..0]:輸入,輸入虛部數(shù)據(jù);
master_source_dav:輸入,指示FFT 模塊收到的數(shù)據(jù)是否有效;
master_sink_ena:輸出,指示數(shù)據(jù)是否寫(xiě)入輸入緩存中;
fft_real_out[23..0]:輸出,輸出實(shí)部數(shù)據(jù);
fft_imag_out[23..0]:輸出,輸出虛部數(shù)據(jù);
master_source_ena:輸出,指示輸出數(shù)據(jù)是否有效;
master_source_sop:輸出,輸出數(shù)據(jù)包起始位置指示信號(hào);
master_source_eop:輸出,輸出數(shù)據(jù)包結(jié)束位置指示信號(hào);
exponent_out[5..0]:輸出,每一個(gè)數(shù)據(jù)輸出時(shí)的一個(gè)比例因子,用來(lái)保持?jǐn)?shù)據(jù)精度和內(nèi)部最大信噪比。工作流程:系統(tǒng)復(fù)位后,數(shù)據(jù)源將master_sink_dav 置位,表示有數(shù)據(jù)等待輸入;作為回應(yīng)FFT Core 將master_sink_ena 置位,表示可以接收數(shù)據(jù);數(shù)據(jù)源加在第一個(gè)復(fù)數(shù)數(shù)據(jù),同時(shí)master_sink_sop 置位,表示輸入數(shù)據(jù)包起始位置;下一個(gè)時(shí)鐘,master_sink_sop 被清零,輸入數(shù)據(jù)按順序加入,輸入數(shù)據(jù)達(dá)到設(shè)置值時(shí),系統(tǒng)啟動(dòng)FFT 運(yùn)算。通過(guò)inv_i 信號(hào)的置位和清零可以改變單個(gè)數(shù)據(jù)包的FFT 轉(zhuǎn)換方向,inv_i必須與master_sink_sop嚴(yán)格同步。當(dāng)FFT轉(zhuǎn)換結(jié)束時(shí)master_source_ena置位,輸出運(yùn)算結(jié)果;在輸出過(guò)程中master_source_sop和master_source_eop信號(hào)被置位,表示輸出數(shù)據(jù)包的起始位置和結(jié)束位置;e x p o n e n t_out 為比例因子,是IP Core 通過(guò)每一次參數(shù)的設(shè)定自動(dòng)計(jì)算出來(lái)的,對(duì)于每個(gè)數(shù)據(jù)包來(lái)講,它產(chǎn)生的e x p o n e n t_out 的值是不同的。
4 結(jié) 論
本文介紹了一種采用Altera 公司的FFT MegaCore 實(shí)現(xiàn)快速傅里葉變換的方法,該方法非常簡(jiǎn)單,能進(jìn)一層次簡(jiǎn)化開(kāi)發(fā)的流程,縮短工程開(kāi)發(fā)周期,節(jié)約成本,因此在實(shí)際工程中是一種很好的應(yīng)用。