/* download chapt. 12.2 from "Numerical Recipies in C" to find out more about the arguments of this subroutine (read bottom part of page 506 and pages 507,508) the real part is stored in the odd locations of the array (data[1], data[3], data[5]. etc) and the imaginary part in the even locations (data[2], data[4], data[6], etc. Important: the elements in the array data must be stored from data[1] to data[2*nn] - data[0] is not used !!! (be careful when you call fft() ...) nn is the length of the input (should be a power of 2, warning: the program does not check for this !!!) also, when you take the forward FT, the values are not multiplied by 1/N -- you must do it yourself isign: 1 Forward FFT, isign: -1 Inverse FFT */ #include #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr void fft(float data[], unsigned long nn, int isign) { unsigned long n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta; float tempr,tempi; n=nn << 1; j=1; for (i=1;i i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=n >> 1; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=mmax << 1; theta=isign*(6.28318530717959/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m