這是迭代版的快速傅利葉轉換 (fft)。其實就是翻譯了一下中的**。
實際測試發現兩個陣列的規模都比較小 (<= 50) 的時候,執行是正常的。但是當資料規模到500時,軟體就執行出錯。不清楚原因。但是用遞迴版本就沒問題。
下面是**:
#include
#include
#include
#include
double pi =
3.1415926
;int lim =1;
int r[
1000];
int l;
//定義複數
struct complex
;struct complex add
(struct complex a,
struct complex b)
//複數的加法
struct complex myminus
(struct complex a,
struct complex b)
//複數的減法
struct complex multiply
(struct complex a,
struct complex b)
//複數的乘法
//迭代版本的fft,少了乙個引數
void
fft(
struct complex * a,
int type)
}for
(int mid =
1; mid < lim; mid *=2
)}}}
intmain()
for(
int i =
0; i < m; i++
)//陣列b的初始化
//lim為1, 2, 4, 8, 16, 32....除了1之外,其餘都是偶數
while
(lim < n + m -1)
//可能是蝴蝶操作
for(
int i =
0; i < lim; i++
)//即兩函式的傅利葉變換的乘積等於它們卷積後的傅利葉變換,
//能使傅利葉分析中許多問題的處理得到簡化。
//f(g(x) * f(x)) = f(g(x)) * f(f(x)),其中f表示的是傅利葉變換
fft(a,1)
;//快速傅利葉轉換
fft(b,1)
;//快速傅利葉轉換
for(
int i =
0; i < lim; i++
)fft
(c,-1)
;//對c進行快速傅利葉轉換的逆轉換
//取實數四捨五入,此時虛數部分應當為0或由於浮點誤差接近0
//理論上計算結果應該是虛部為0,但實際上虛部可能有一點誤差
//為了抵消這個誤差,用下面的方法進行處理
//最終顯示c的內容
for(
int i =
0; i < n + m -
1; i++
)printf
("\r\n\r\n");
t2 =
time(0
);printf
("迭代的快速傅利葉轉換fft: %d\r\n"
, t2 - t1)
;return0;
}
蝴蝶操作那部分**是不是必須要用位操作呢?
執行結果如下:
遞迴版的快速傅利葉轉換 FFT ,C語言實現
看了好多個版本的快速傅利葉轉換 fft 看懂了理論部分,但是卻無法把理論聯絡到 也許是我的水平太差了吧。網上看到的版本中大量使用位操作符 和 開始的時候還真的反應不過來。這裡,我不講fft的理論,只是實現一下遞迴版本的fft實現。有說fft是玄科學,我深表贊同。相同的 在a電腦裡執行結果是正確的,用...
快速傅利葉
參考 ae 97 e6 b3 95 e5 ad a6 e4 b9 a0 e7 ac 94 e8 ae b0 hdu大整數乘法 include include include include include using namespace std const double pi acos 1.0 複數...
快速傅利葉(FFT)
快速傅利葉 更加形象的理解傅利葉變換 大概了解之後 從傅利葉級數到傅利葉變換 太大,只能裁剪為兩張 刨根問底的同學 雷德演算法 輸出序列是按自然順序排列的,而輸入序列的順序則是 位元反轉 方式排列的。也就是說,將序號用二進位制表示,然後將二進位制數以相反方向排列,再以這個數作為序號。如011變成11...