hi,all.I wrote this program to implement the FFT algorithm.Running with wrong answer.can anybody tell me what mistake i made?thanks!
Code:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.1415926
#define N 16 //the length
#define W_RE (cos(-2.0*PI/N))
#define W_IM (sin(-2.0*PI/N))
void recursive_fft(double [],int,double [],double []);
int main(){
double x[N] = {0.5751,0.4514,0.0439,0.0272,
0.3127,0.0129,0.3840,0.6831,
0.0928,0.0353,0.6124,0.6085,
0.0158,0.0164,0.1901,0.5869};
double y_re[N],y_im[N];
recursive_fft(x,N,y_re,y_im);
/*output*/
for(int i = 0;i<N;i++){
printf("%lf",y_re[i]);
if(y_im[i])
printf(" + %lfi",y_im[i]);
printf("\n");
}
return 0;
}
/*x is the input DFT,len_x is the length
*y_re and y_im ===> real part and image part of the result
* */
void recursive_fft(double x[],int len_x,\
double y_re[],double y_im[]){
double re_w = 1.0,im_w = 0;
double x_even[len_x/2],x_odd[len_x/2];
double y1_re[len_x/2] ,y1_im[len_x/2] ;
double y2_re[len_x/2] ,y2_im[len_x/2] ;
int index_even = 0,index_odd = 0;
for(int i=0;i<len_x/2;i++){
y1_re[i] = y1_im[i] = y2_re[i] = y2_im[i] = 0;
}
if(1 == len_x){
y_re[0] = x[0];y_im[0] = 0;
return ;
}
for(int i = 0;i<len_x;i++){
if(i % 2 == 0){/*even */
x_even[index_even++] = x[i];
}else{
x_odd[index_odd++] = x[i];
}
}
recursive_fft(x_odd,index_odd,y1_re,y1_im);
recursive_fft(x_even,index_even,y2_re,y2_im);
for(int k = 0;k<len_x/2;k++){
y_re[k] = y1_re[k]*re_w - im_w*y1_im[k] + y2_re[k];
y_im[k] = y1_im[k]*re_w + y1_re[k]*im_w + y2_im[k];
y_re[k+len_x/2] = im_w*y1_im[k] - y1_re[k]*re_w + y2_re[k];
y_im[k+len_x/2] = -1*y1_im[k]*re_w - y1_re[k]*im_w + y2_im[k];
re_w = re_w*W_RE - im_w*W_IM;
im_w = im_w*W_RE + re_w*W_IM;
}
}