/************************************************************************** * fft.c * * makecint -A -dl fft.sl -c fft.c **************************************************************************/ #include #include #define FFT_MAX 4096 #define G__FFTSL /* #define G__STDFFT */ /*******************************************************************/ /* dft_cal.c 1996 1/8 M.Goto */ /*******************************************************************/ int dft_cal(double *x,double *re,double *im,int ndat) { int i,j,m; double *s,*c; double *rei,*imi; double a,b; double sums,sumc; fprintf(stderr,"original data points=%d DFT data points=%d\n",ndat,ndat); s = (double*)malloc(sizeof(double)*(ndat)); c = (double*)malloc(sizeof(double)*(ndat)); rei = (double*)malloc(sizeof(double)*(ndat)); imi = (double*)malloc(sizeof(double)*(ndat)); /* prepare sin,cos table and copy input data */ a=0 ; b=3.141592*2/ndat; for(i=0;i n) { n *= 2 ; m++ ; } if(ndat!=n) { dft_cal(x,re,im,ndat); return(0); } fprintf(stderr ,"original data points=%d FFT data points=%d m=%d n=2**m \n" , ndat , n , m ); /* ndat=n/2; */ s = (double*)malloc(sizeof(double)*(n/2+1)); c = (double*)malloc(sizeof(double)*(n/2+1)); /* initialize sin cos table */ a=0 ; b=3.141592*2/n; for(i=0;i<=n/2;i++) { s[i] = sin(a); c[i] = cos(a); /* c[i] = sqrt(1-s[i]*s[i]); */ a += b; } /* Butterfly */ l=n; h=1; for (g=1;g<=m;g++) { l /= 2 ; k=0 ; for (q=1;q<=h;q++) { p=0 ; for (i=k;i<=l+k-1;i++) { j=i+l ; a = re[i] - re[j]; b = im[i] - im[j]; re[i] = re[i] + re[j]; im[i] = im[i] + im[j]; if (p == 0) { re[j] = a; im[j] = b; } else { re[j] = a*c[p] + b*s[p]; im[j] = b*c[p] - a*s[p]; } p=p+h; } k=k+l+l; } h=h+h; } free((void*)c); free((void*)s); /* Bit Reversal */ for (i=1;i<=n-1;i++) { q=i; k=n/2; j=0; for (l=1;l<=m;l++) { j=j+k*(q%2); /* j=j+k*mod(q,2) */ q /= 2; /* q=int(q/2) */ k /= 2; } if (i < j) { tmp= re[i]; re[i]=re[j]; re[j]=tmp; tmp=im[i]; im[i]=im[j]; im[j]=tmp; } } /* compen */ tmp= re[n/2-1]; re[n/2-1] = re[n/2+1] ; re[n/2+1] = tmp; tmp= im[n/2-1]; im[n/2-1]=im[n/2+1]; im[n/2+1]=tmp; return(0); } /*******************************************************************/ /* fft.c 1987 1/8 M.Goto */ /*******************************************************************/ int fft(double *x,double *re,double *im,int ndat) { int i; double dT,T,dfreq; fft_cal(x,re,im,ndat); dT= x[1]-x[0]; T = ndat * dT ; dfreq = 1 / T ; for (i=0;i