引言
DFT(Discrete Fourier Transformation)是數(shù)字信號分析與處理如圖形、語音及圖像等領(lǐng)域的重要變換工具,直接計算DFT的計算量與變換區(qū)間長度N的平方成正比。當(dāng)N較大時,因計算量太大,直接用DFT算法進行譜分析和信號的實時處理是不切實際的??焖俑盗⑷~變換(Fast Fourier Transformation,簡稱FFT)使DFT運算效率提高1~2個數(shù)量級。其原因是當(dāng)N較大時,對DFT進行了基4和基2分解運算。FFT算法除了必需的數(shù)據(jù)存儲器ram和旋轉(zhuǎn)因子rom外,仍需較復(fù)雜的運算和控制電路單元,即使現(xiàn)在,實現(xiàn)長點數(shù)的FFT仍然是很困難。本文提出的FFT實現(xiàn)算法是基于FPGA之上的,算法完成對一個序列的FFT計算,完全由脈沖觸發(fā),外部只輸入一脈沖頭和輸入數(shù)據(jù),便可以得到該脈沖頭作為起始標(biāo)志的N點FFT輸出結(jié)果。由于使用了雙ram,該算法是流型(Pipelined)的,可以連續(xù)計算N點復(fù)數(shù)輸入FFT,即輸入可以是分段N點連續(xù)復(fù)數(shù)數(shù)據(jù)流。采用DIF(Decimation In Frequency)-FFT和DIT(Decimation In Time)-FFT對于算法本身來說是無關(guān)緊要的,因為兩種情況下只是存儲器的讀寫地址有所變動而已,不影響算法的結(jié)構(gòu)和流程,也不會對算法復(fù)雜度有何影響。算法實現(xiàn)的可以是基2/4混合基FFT,也可以是純基4FFT和純基2FFT運算。
傅立葉變換和逆變換
對于變換長度為N的序列x(n)其傅立葉變換可以表示如下:
N | nk | |
X(k)=DFT[x(n)] = Σ x(n)W | ||
n=0 |
式(1)
其中,W=exp(-2π/N)。 當(dāng)點數(shù)N較大時,必須對式(1)進行基4/基2分解,以短點數(shù)實現(xiàn)長點數(shù)的變換。而IDFT的實現(xiàn)在DFT的基礎(chǔ)上就顯得較為簡單了:
式(2)
由式(2)可以看出,在FFT運算模塊的基礎(chǔ)上,只需將輸入序列進行取共軛后再進行FFT運算,輸出結(jié)果再取一次共軛便實現(xiàn)了對輸入序列的IDFT運算,因子1/N對于不同的數(shù)據(jù)表示格式具體實現(xiàn)時的處理方式是不一樣的。IDFT在FFT的基礎(chǔ)上輸入和輸出均有一次共軛操作,但它們共用一個內(nèi)核,仍然是十分方便的。
基4和基2
基4和基2運算流圖及信號之間的運算關(guān)系如圖1所示:
![]() | ![]() |
(a)基4蝶形算法 | (b)基2蝶形算法 |
以基4為例,令A(yù)=r0+j×i0;B=r1+j×i1;C=r2+j×i2;D=r3+j×i3;Wk0=c0+j×s0:Wk1=c1+j×s1;Wk2=c2+j×s2;Wk3=c3+j×s3。分別代入圖1中的基4運算的四個等式中有:
A'=[r0+(r1×c1-i1×s1)+(r2×c2-i2×s2)+(r3×c3-i3×s3)]+j[i0+(i1×c1+r1×s1)+(i2×c2+r2×s2)+(i3×c3+r3×s3)] 式(3)
B'=[r0+(i1×c1+r1×s1)-(r2×c2-i2×s2)-(i3×c3+r3×s3)]+j[i0-(r1×c1-i1×s1)-(i2×c2+r2×s2)+(r3×c3-i3×s3)] 式(4)
C'=[r0-(r1×c1-i1×s1)+(r2×c2-i2×s2)-(r3×c3-i3×s3)]+j[i0-(i1×c1+r1×s1)+(i2×c2+r2×s2)-(i3×c3+r3×s3)] 式(5)
D'=[r0-(i1×c1+r1×s1)-(r2×c2-i2×s2)+(i3×c3+r3×s3)]+j[i0+(r1×c1-i1×s1)-(i2×c2+r2×s2)-(r3×c3-i3×s3)] 式(6)
可以看出,式(3)至式(6)有多個公共項和類似項,這一點得到充分利用之后可以大大縮減基4和基2運算模塊中的乘法器的個數(shù),如上面A'至D'的四個等式中的這三對類似項:(r1×c1-i1×s1)與(i1×c1+r1×s1)、(r2×c2-i2×s2)與(i2×c2+r2×s2)、(r3×c3-i3×s3)與(i3×c3+r3×s3)以高于輸入數(shù)據(jù)率的時鐘進行時分復(fù)用,最終可以做到只需要3個甚至1個復(fù)數(shù)乘法器便可以實現(xiàn)?;?運算之所以采用圖1-(b)中的形式進行基2運算,是為了將基本模塊做成基4/2復(fù)用模塊,它對于N有著更大的適用性和可借鑒性。在基4、基2和基4/2模塊的基礎(chǔ)上,構(gòu)建基16、基8和基16/8模塊有著非常大的意義。
算法實現(xiàn)
傅立葉變換實現(xiàn)時首先進行基2、基4分解,一般來說,如果算法使用基4實現(xiàn),雖然使用的資源多了一些,但速度上的好處足以彌補。如果資源充足,使用基16、基8或基16/8復(fù)用模塊,速度可以大大提高。一般FFT實現(xiàn)簡單框圖如圖2所示。
在圖2中,運算模塊即為基2/4/8/16模塊或它們的復(fù)用模塊,Rom表中存儲的是N點旋轉(zhuǎn)因子表??刂颇K產(chǎn)生所有的控制信號,存儲器1和2的讀寫地址、寫使能、運算模塊的啟動信號及因子表的讀地址等信號。當(dāng)然對于運算模塊為基16/8復(fù)用模塊時,控制模塊就需要產(chǎn)生模式選擇信號,如對于運算模塊是基4/2模塊時,該信號就決定了內(nèi)部運算模塊是進行基4運算還是基2運算。存儲器1作為當(dāng)前輸入標(biāo)志對應(yīng)輸入N點數(shù)據(jù)的緩沖器,存儲器2作為中間結(jié)果存儲器,用于存儲運算模塊計算出的各Pass的結(jié)果。在圖中的各種地址、使能和數(shù)據(jù)的緊密配合下,經(jīng)過一定延時后輸出計算結(jié)果及其對應(yīng)指示標(biāo)志。圖2只是一定點或浮點的FFT實現(xiàn)模塊,如果是塊浮點運算,則必須加入一個數(shù)據(jù)因子控制器,控制每遍運算過程中的數(shù)據(jù)大小,并根據(jù)各個Pass的乘性因子之和的大小,對最終輸出進行大小控制,以保證每段FFT運算輸出增益一致。
外部輸入為N點數(shù)據(jù)段流和啟動信號(N點之間如無間隔,則每N數(shù)據(jù)點輸入一脈沖信號),一方面,外部數(shù)據(jù)存入存儲器1中,同時通過控制模塊的控制,讀出存儲器1中的前段N點數(shù)據(jù)和Rom表中的因子及相關(guān)控制信號送入運算核心模塊進行各個Pass的運算,每個Pass的輸出都存入存儲器2中,最后一個Pass的計算結(jié)果存入存儲器2中,并在下一個啟動頭到來后,輸出計算結(jié)果。對圖2的實現(xiàn),除去運算模塊,關(guān)鍵是各個Pass數(shù)據(jù)因子讀寫地址及控制信號的配合。
速度、資源和精度
假定輸入數(shù)據(jù)的速率為fin,則每數(shù)據(jù)的持續(xù)時間T=1/fin,運算模塊的計算時鐘頻率為fa,對于N(N=2p,p即為Pass數(shù)目)點FFT計算時延與Pass數(shù)目直接相關(guān)。如果使用基2運算不考慮控制開銷,純粹的計算時延為td=p×N×T×fin/fa。顯然在fa>p× fin時,在N點內(nèi)可完成FFT運算。否則不能完成,即不能實現(xiàn)流型的變換。這在N很大且輸入數(shù)據(jù)速率較高時以FPGA實現(xiàn)幾乎是不可能的,而且內(nèi)部計算時鐘過高容易導(dǎo)致電路的工作不穩(wěn)定。設(shè)基2時的最小可流型工作運算頻率為fa0,則使用基4實現(xiàn)流型的變換,計算時鐘fa= fa0就可以。而使用基8時計算時鐘fa= fa0便可完成,基16時為fa0的1/4。上面所討論的是純基運算,當(dāng)N不為4的冪次方時(如N=2048=16×16×8,運算模塊為基16/8復(fù)用模塊),而又希望使用較低倍的時鐘完成運算時,圖2中的運算模塊必然包括基4/2復(fù)用模塊(即基16/8復(fù)用模塊),這也就是前面提到復(fù)用模塊的主要用意。由上面的分析可以得出結(jié)論,如果計算使用的基越大,完成速度越快。 但是,使用基16/8模塊所使用的邏輯資源要比基4/2模塊多將近一倍,這是因為基16/8復(fù)用模塊是以基4模塊和基4/2復(fù)用模塊構(gòu)建而成。當(dāng)然,可以直接實現(xiàn)基16/8復(fù)用模塊,但用FPGA很難解決復(fù)雜度和成本問題。另外,如果流型運算間隔比N點數(shù)據(jù)長度長一倍以上,可以考慮在較低的計算時鐘下使用基2運算模塊實現(xiàn)流型FFT。
運算結(jié)果的精度直接與計算過程中數(shù)據(jù)和因子位數(shù)(浮點算法)相關(guān),如果中間計算的位數(shù)、存儲數(shù)據(jù)位數(shù)和Rom表中的位數(shù)越大,輸出精度就越大。當(dāng)然,位數(shù)增大后邏輯運算資源和存儲資源都會直線上升。
浮點、塊浮點和定點FFT
根據(jù)運算過程中對數(shù)據(jù)位數(shù)取位和表示形式的不同,可以將FFT分為浮點FFT、塊浮點FFT和定點FFT。它們在實現(xiàn)時對于系統(tǒng)資源的要求是不同的,而且有著不同的適用范圍。
浮點FFT是基于數(shù)據(jù)表示為浮點的基礎(chǔ)之上的,即數(shù)據(jù)是由一純小數(shù)和一因子組成,輸入要轉(zhuǎn)成純小數(shù)和因子的浮點表示形式,所有計算過程中保存應(yīng)得計算結(jié)果大小,而輸出要變成所需大小的定點表示形式。只要因子位數(shù)足夠大,浮點FFT計算是不會溢出的。而定點則是所有計算過程中都是定點運算,如果各個Pass的截位規(guī)則不適當(dāng),很容易出現(xiàn)溢出,必須要有溢出控制。塊浮點是介于它們之間的一種運算機制,它是根據(jù)本Pass的輸入數(shù)據(jù)的大小,在計算之前進行控制(數(shù)據(jù)上移一比特或下移一比特或乘以一特定因子),可以保證不溢出,但一般也需要溢出控制。
浮點運算沒有溢出,信號平均信噪比高,但由于因子的運算必然導(dǎo)致電路復(fù)雜,實現(xiàn)困難。定點運算實現(xiàn)簡單,難以保證不溢出,需要統(tǒng)計得出合適的截位規(guī)則,否則溢出嚴(yán)重導(dǎo)致輸出結(jié)果錯誤。塊浮點由于每個Pass(包括最后輸出前)結(jié)束后有一統(tǒng)計控制過程,延時較大,但是可以保證不溢出而且電路又相對浮點來說簡單得多。 應(yīng)根據(jù)具體應(yīng)用的具體要求,選擇合適的FFT。如果要求精度,并且要解決頻域很高的單頻干擾,就必須使用浮點的FFT,使用數(shù)據(jù)位數(shù)很大的定點和塊浮點也能解決這個問題,但位數(shù)的確定十分困難。如果不要求高精度,邏輯資源和Rom比較緊張,可考慮定點運算。如果輸入在頻域集中于幾個點上或者對精度要求一般,可以慢速處理,可以采用塊浮點運算,就能夠保證這幾點的信噪比,而忽略其他點處的信噪比。
- 用FPG(5717)
- FT算法(5189)
相關(guān)推薦
FFT 算法的一種 FPGA 實現(xiàn)
FFT算法的FPGA實現(xiàn)
FFT的基本原理及算法結(jié)構(gòu)
FFT至簡設(shè)計法實現(xiàn)法_FFT算法_蝶形運算_fpga
FPGA實現(xiàn)高速FFT處理器的設(shè)計
用FPGA實現(xiàn)FFT測頻
DFT算法與FFT算法的優(yōu)劣分析
HLS中FFT的反向輸入算法不能實現(xiàn)
一種基于FPGA的可配置FFT IP核實現(xiàn)設(shè)計
一種基于Xilinx FPGA的電力諧波檢測設(shè)計
分析種基于FPGA實現(xiàn)的FFT插值正弦波頻率估計新算法
基于FPGA的FFT算法硬件實現(xiàn)
基于FPGA的超高速FFT硬件實現(xiàn)
基于DSP的FFT算法實現(xiàn)
基于改進的CORDIC算法的FFT復(fù)乘及其FPGA實現(xiàn)
如何在FPGA上實現(xiàn)硬件上的FFT算法
嵌入式系統(tǒng)中怎么實現(xiàn)FFT算法?
淺談實數(shù)FFT算法及其C語言的設(shè)計實現(xiàn)案
硬件實現(xiàn)EMD算法用那種架構(gòu)比較好?
第32章 實數(shù)FFT的實現(xiàn)
請教一個關(guān)于fft算法的問題,DFT算法與FFT算法在應(yīng)用上有什么區(qū)別?
基于FPGA的超高速FFT硬件實現(xiàn)

利用CORDIC 算法在FPGA 中實現(xiàn)可參數(shù)化的FFT

一種基于FPGA實現(xiàn)的FFT結(jié)構(gòu)

基于Stratix系列FPGA 的FFT模塊設(shè)計與實現(xiàn)

基于FPGA的FFT處理器的設(shè)計

基于FPGA的FFT處理器的研究與設(shè)計

利用CORDIC算法在FPGA中實現(xiàn)可參數(shù)化的FFT

一種塊遞推實時FFT算法模塊設(shè)計與實現(xiàn)

利用FFT IP Core實現(xiàn)FFT算法

N為合數(shù)的FFT算法


FFT算法的應(yīng)用


用FPGA實現(xiàn)FFT算法


用C語言實現(xiàn)FFT算法

用FPGA實現(xiàn)FFT算法


固定幾何結(jié)構(gòu)的FFT算法及其FPGA實現(xiàn)


用FPGA實現(xiàn)FFT算法


基于FPGA的高速定點FFT算法的設(shè)計方案


基于FPGA的apFFT算法實現(xiàn)

基于改進FFT算法的OFDM調(diào)制解調(diào)模塊設(shè)計

FPGA內(nèi)嵌的塊RAM在FFT算法中的應(yīng)用

基于FPGA的高速高階流水線工作FFT設(shè)計

高速高階FPGA流水線工作FFT設(shè)計

基于并行FFT的pn碼快速捕獲算法實現(xiàn)

fft原理及實現(xiàn)

LTE系統(tǒng)中FFT的實現(xiàn)


實數(shù)FFT算法的設(shè)計及其C語言實現(xiàn)


基于FPGA的FFT信號處理器的設(shè)計與實現(xiàn)

DSP集成開發(fā)環(huán)境中的混合編程及FFT算法的實現(xiàn)

采用TMS320F2812的分裂基FFT算法的實現(xiàn)

FPGA的電力諧波檢測的各部分電路組成及其設(shè)計與實現(xiàn)

數(shù)字信號處理技術(shù)FFT算法與FPGA的FFT變換設(shè)計

以FPGA實現(xiàn)FFT算法

fft算法是什么_如何提高fft算法分辨率


基于FPGA的FFT實現(xiàn)方案

基于Xilinx FPGA 實現(xiàn)FFT算法的電力諧波檢測的設(shè)計方案詳解


DSP芯片在基于FFT算法的電力系統(tǒng)諧波檢測裝置中的應(yīng)用

基于FPGA-IPCore的FFT仿真與硬件實現(xiàn)

淺談FFT算法原理 基于FPGA的FFT算法的硬件實現(xiàn)


基于Quartus II的綜合仿真實現(xiàn)FFT IP核的FFT算法


采用FPGA實現(xiàn)FFT算法


基于FPGA器件實現(xiàn)微波接力機中的FFT模塊設(shè)計


LTE物理上行共享信道中FFT算法分析與FPGA實現(xiàn)

使用FPGA實現(xiàn)流水線結(jié)構(gòu)的FFT處理器論文講解

如何使用FPGA和CPLD實現(xiàn)FFT算法與仿真分析

如何使用FPGA實現(xiàn)FFT的研究

如何使用FPGA實現(xiàn)基于修正Rife算法的正弦波頻率估計

如何使用FPGA實現(xiàn)全并行結(jié)構(gòu)FFT

用FPGA實現(xiàn)FFT算法的方法

傅里葉變換(FFT)的主要思想與算法

利用FFT算法實現(xiàn)快速傅里葉變換

采用FPGA實現(xiàn)FFT算法示例


基2FFT的verilog代碼實現(xiàn)及仿真


從Xilinx FFT IP核到FPGA實現(xiàn)OFDM


如何用FPGA實現(xiàn)FFT算法?

評論