FFT的迭代程式實現 hdu1402

2021-06-22 12:30:15 字數 1689 閱讀 1927

《快速傅利葉變換fft的迭代實現》描述了最簡單的fft的迭代實現,在此基礎上可以用它進行大整數乘法或者多項式乘法。不過,還需要考慮idft的快速實現。idft有2種實現方式。第一種仿照fft,觀察idft的定義式,和dft的定義本質上沒有區別,利用單位復根的性質可以寫出ifft。第二種方法則利用共軛的性質:

即:逆變換等於共軛的變換的共軛,所以可以復用fft的實現**。關鍵演算法確定後,還要實現諸如確定補齊長度、位倒置、複數運算、輸入輸出轉換等具體問題。hdu1402,用fft做大數乘法。

當然,這個程式還有很多可以優化的地方,在迴圈控制等方面,優化以後的效果也相當顯著。大家可以去uoj的模板題看看跑的最快的fft是怎麼寫的。

#include #include #include #include using namespace std;

#define eps 1e-6

#define is0(x) ( -eps < (x) && (x) < eps )

double const pi = acos(-1.0);

//定義複數及其運算

struct complex_t

complex_t(complex_t const&rhs):real(rhs.real),imag(rhs.imag){}

};complex_t operator + (complex_t const&lhs,complex_t const&rhs)

complex_t operator - (complex_t const&lhs,complex_t const&rhs)

complex_t operator * (complex_t const&lhs,complex_t const&rhs)

//定義全域性陣列

#define size 65536

int size = 0;

char a[size];

char b[size];

char c[size+size] = ;

complex_t xa[size+size],ya[size+size];

complex_t xb[size+size],yb[size+size];

complex_t xc[size+size],yc[size+size];

//將字串轉為複數序列,n為序列長度,非字串長度

void string2complex(char const s,int n,complex_t c)

return;

}//雷德演算法,調整系數字置,n為陣列長度,從0開始

void rader(complex_t const a,int n,complex_t b)

}//fft,n為序列長度

void fft(complex_t const x,int n,complex_t y)}}

}int main(){

while( eof != scanf("%s%s",a,b) ){

//確定序列長度

int la = strlen(a);

int lb = strlen(b);

size = la + lb;

for(int i=0;;++i){

if( size <= (1<

2 FFT演算法的實現

最近有乙個專案,要開始用資料訊號處理的一些知識,今天開始寫出自己的軌跡,有興趣的朋友可以關注一下!m 已經完成!本週內完成2 fft演算法實現的c 要求動態輸入長度值!1116 今天進展紀錄 完成了框架設計 完成了一些複數操作相關的子函式 在動態分配完結構體陣列記憶體空間操作的時候出現了一些問題 無...

FFT的C語言演算法實現

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

FFT的C語言演算法實現

fft計算的理 式 將n的數值的fft按照奇數和偶數項拆分為兩個n 2的fft,推出乙個迭代關係 將離散dft某點的傅利葉變換看做偶數字置和奇數字置離散點的傅利葉變換的合成,如上述的合成關係,w k是二者的合成橋梁。以八點時間抽取基2fft為例,其butterfly結構圖如下 在執行蝶形運算之前,先...