用c語言實現的FFT

2021-09-29 03:11:03 字數 3240 閱讀 2661

一、對fft的介紹

1. fft(fast fourier transformation),即為快速傅利葉變換,是離散傅利葉變換的快速演算法,它是根據離散傅利葉變換的奇、偶、虛、實等特性,對離散傅利葉變換的演算法進行改進獲得的。

2.fft演算法的基本原理

fft演算法是把長序列的dft逐次分解為較短序列的dft。

按照抽取方式的不同可分為dit-fft(按時間抽取)和dif-fft(按頻率抽取)演算法。按蝶形運算的構成不同可分為基2,基4,基8,以及任意因子的型別。

3.迭代關係

4、本次程式的基本過程

我們這次所研究的是數字訊號處理中的fft演算法,我們這次所用的數碼訊號是複數型別的。

(1)所以首先,我們先定義了乙個複數結構體,因為是進行複數的運算,我們又相繼定義複數的加減乘運算的函式。

(2)緊接著,我們定義了進行fft計算的fft()快速傅利葉變換函式initw()  初始化變換核函式即旋轉因子的計算,change() 變址函式,output()輸出傅利葉變換的結果的函式。

(3)定義主函式,並呼叫定義好的相關子函式,利用fft()中的蝶形運算以及change()函式來完成從時間域上選取的dit-fft。

二、fft中碼位倒置排序

1、碼位倒置的實現方法:

(1)簡單的利用按位與、或迴圈實現

(2)利用公式推導的迭代方法

2、為什麼要進行碼位倒置

因為由於fft的計算特性,如果按照正常順序輸入,而沒有進行碼位倒置的話,就會以亂序輸出,就不便於我們後續對訊號的相關性質進行研究了,所以dit-fft演算法就是在進行fft計算之前,進行分奇偶後的碼位倒置運算,即二進位制數的倒位。       

3、倒位序由奇偶分組造成,以n=8為例,說明如下:

三、蝶形運算

按照上述公式的規律進行逐級分解,直到2點dft,如下是n=8時的蝶形演算法分析圖:

四、fft演算法中蝶形演算法的基本思想分析

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

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

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

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

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

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

五、用c語言實現的fft演算法如下:

"font-size:18px;"

>#include

#include

#include

#define n 1000

/*定義複數型別*/

typedef

struct

complex;

complex x[n]

,*w;

/*輸入序列,變換核*/

int size_x=0;

/*輸入序列的大小,在本程式中僅限2的次冪*/

double pi;

/*圓周率*/

void

fft();

/*快速傅利葉變換*/

void

initw()

;/*初始化變換核*/

void

change()

;/*變址*/

void

add(complex ,complex ,complex *);

/*複數加法*/

void

mul(complex ,complex ,complex *);

/*複數乘法*/

void

sub(complex ,complex ,complex *);

/*複數減法*/

void

output()

;/*輸出快速傅利葉變換的結果*/

intmain()

printf

("輸出倒序後的序列\n");

initw()

;//呼叫變換核

fft();

//呼叫快速傅利葉變換

printf

("輸出fft後的結果\n");

output()

;//呼叫輸出傅利葉變換結果函式

return0;

}/*快速傅利葉變換*/

void

fft()}

}}/*初始化變換核,定義乙個變換核,相當於旋轉因子wap*/

void

initw()

}/*變址計算,將x(n)碼位倒置*/

void

change()

if(j>i)

//將x(n)的碼位互換

}output()

;}/*輸出傅利葉變換的結果*/

void

output()

}void

add(complex a,complex b,complex *c)

//複數加法的定義

void

mul(complex a,complex b,complex *c)

//複數乘法的定義

void

sub(complex a,complex b,complex *c)

//複數減法的定義

<

/span>

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 定義乙個結構體表示複...

C語言實現FFT演算法

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

8點FFT的C語言實現

說明 1 處理的物件是複數,使用的是純c語言 2 程式針對的是n 8的fft 3 因為是按時間抽選,所以輸入為倒位序,輸出為正常序,因此輸入資料要進行倒位序 請注意後面的更正!c檔案 include fft.h complex wn0 complex wn1 complex wn2 complex ...