資源簡介
用C語言實現快速付立葉變換和快速付立葉逆變換
代碼片段和文件信息
#include?
#include?
#include?
#define?N?1000
/*定義復數類型*/
typedef?struct{
double?real;
double?img;
}complex;
complex?x[N]?*W;?/*輸入序列變換核*/
int?size_x=0;??????/*輸入序列的大小,在本程序中僅限2的次冪*/
double?PI;?????????/*圓周率*/
void?fft();?????/*快速傅里葉變換*/
void?ifft();
void?initW();???/*初始化變換核*/
void?change();?/*變址*/
void?add(complex?complex?complex?*);?/*復數加法*/
void?mul(complex?complex?complex?*);?/*復數乘法*/
void?sub(complex?complex?complex?*);?/*復數減法*/
void?divi(complex?complex?complex?*);/*復數除法*/
void?output();
int?main(){
int?imethod;?????????????????????????????/*輸出結果*/
system(“cls“);
PI=atan(1)*4;
printf(“Please?input?the?size?of?x:\n“);
scanf(“%d“&size_x);
printf(“Please?input?the?data?in?x[N]:\n“);
for(i=0;i ???scanf(“%lf%lf“&x[i].real&x[i].img);
initW();
printf(“Use?FFT(0)?or?IFFT(1)?\n“);
scanf(“%d“&method);
if(method==0)
???fft();
else
???ifft();
output();
return?0;
}
/*快速傅里葉變換*/
void?fft(){
int?i=0j=0k=0l=0;
complex?updownproduct;
change();
for(i=0;i???l=1<???for(j=0;j ????for(k=0;k ??????mul(x[j+k+l]W[size_x*k/2/l]&product);
??????add(x[j+k]product&up);
??????sub(x[j+k]product&down);
??????x[j+k]=up;
??????x[j+k+l]=down;
????}
???}
}
}
/*快速傅里葉逆變換*/
void?ifft(){
int?i=0j=0k=0l=size_x;
complex?updown;
for(i=0;i(int)(?log(size_x)/log(2)?);i++){???/*一級蝶形運算*/
???l/=2;
???for(j=0;j
評論
共有 條評論