FFT的C語言演算法實現

2021-06-21 09:51:31 字數 1968 閱讀 1747

fft計算的理**式:將n的數值的fft按照奇數和偶數項拆分為兩個n/2的fft,推出乙個迭代關係

將離散dft某點的傅利葉變換看做偶數字置和奇數字置離散點的傅利葉變換的合成,如上述的合成關係,w^k是二者的合成橋梁。

以八點時間抽取基2fft為例,其butterfly結構圖如下:

在執行蝶形運算之前,先要將資料按碼位倒置排序,這樣在fft的結果中才會按自然順序排列。

把n點復輸入序列或2n點的是序列兩兩組合為複數按照實部,虛部,實部,虛部……的順序在儲存器中儲存,下面將它們的順序按照碼位倒置的順序重新排列。

碼位倒置的實現方法:(1)簡單的利用按位與、或迴圈實現

(2)利用如下的公式推導出第i項的逆序數與第i-1項逆序數的關係,利用迭代的方法,提高程式的執行效率。

例如(偶數) 01110000——>00001     110                             將該偶數減去1再求其逆序數

(奇數)01110000-1=01101111——>11110     110後面的三項相同,前k+1項不同,在這個奇數的逆序數基礎上減去前k項的加權和在減去第k+1項的加權,即可以得到此偶數對應的逆序數

由此可以得到奇數項的逆序數等於前一項的逆序數加上2^(n-1),而偶數項的逆序數等於前一項的逆序數加上上述的修正項得到,實現程式如下:

碼位倒置之後資料在儲存器中的結構如下(16點實序列):

蝶形運算部分程式如下:

fft 演算法的基本思想分析

我們知道n點fft運算可以分成log2(n)級,每一級都有n/2個碟形,fft的基本思想是用3層迴圈完成全部運算(n點fft)。

第一層迴圈:由於n=2^m需要m級計算,第一層迴圈對運算的級數進行控制。(stages)

第二層迴圈:由於第l級有2^(l-1)個蝶形因子(乘數),第二層迴圈根據乘數進行控制,保證對於每乙個蝶形因子第三層迴圈要執行一次,這樣,第三層迴圈在第二層迴圈控制下,每一級要進行2^(l-1)次迴圈計算。(選擇w)

第三層迴圈:由於第l級共有n/2^l即2^(n-l)個群,並且同一級內不同群的乘數分布相同,當第二層迴圈確定某一乘數後,第三層迴圈要將本級中每個群中具有這一乘數的蝶形計算一次,即第三層迴圈每執行完一次要進行n/2^l個碟形計算。(執行不同group中具有相同w的蝶形運算)

可以得出結論:在每一級中,第三層迴圈完成n/2^l個碟形計算;第二層迴圈使第三層迴圈進行 2^(l-1)次,因此,第二層迴圈完成時,共進行2^(l-1) *n/2^l=n/2個碟形計算。實質是:第

二、第三層迴圈完成了第l級的計算。

其中的istep是具有相同w乘數旋轉因子的子變換在儲存器中的距離,這裡實部、虛部相間排列,故此距離應增加一倍。w旋轉因子採用迭代的方法實現(這裡的程式是別人的,所以未作替換),當然也可以利用matlab產生後放到陣列中,計算時查表獲取,可參照ti的fft庫中的做法。

最後將istep再付給mmax,由於istep時計算蝶形運算時兩資料的間隔,當其大於點數n的時候,外層迴圈結束。個人覺得用stages更清晰些。

FFT的C語言演算法實現

程式如下 fft include include include define n 1000 typedef struct complex void fft 快速傅利葉變換 void ifft 快速傅利葉逆變換 void initw void change void add complex comp...

C語言實現FFT演算法

c語言實現fft演算法 fft1d.c和fft1d.h見 ifndef fft1d h define fft1d h include math.h define pi 3.1415926535897932384626433832795028841971 typedef struct complex ...

C語言實現FFT

參考 fft中的位反轉演算法 include include include define n 1024 int size 0 定義資料長度 double pi 4.0 atan 1 定義 因為tan 4 1 所以arctan 1 4 增加 的精度 typedef struct 定義乙個結構體表示複...