/* fft1.c: fast Fourier transform base on 2 for one dimensional complex array, direct and inverse, This program is contributed by Jiang Yong, 2003. 1. */ #include #include #include #include "fft.h" static int ifirst=0, sign=-1; static unsigned M, jup[64], kup[64]; static float pi, wr[N], wi[N]; /********* initial **************/ void initial(void) { unsigned long int i, j, ni; float unit, tt; ni = N; M = 0; while (ni > 1) { ni=ni/2; M=M+1; } ni = 1; for(j=0; j %i, ni -> %lu)\n", N, ni); exit(1); } kup[0] = N/2; /* kup[l] = 2 ^ (M - l - 1) */ jup[0] =1; for (j=1;jFFT ** ifft=-1<-->IFFT **/ void fft1(float A[2][N], int ifft) { unsigned long int l, k, i, j, jl0, jl0k, jl1k, reseq, ij; float wrc, wis, ar, ai, x[2][N]; if (ifirst == 0) { initial(), ifirst=1; } if (ifft == -1) for(i=0;i FFT ** ifft=-1 <--> IFFT */ void fft1r2(float A[2][N], float B[2][N], int ifft) { unsigned long int k, j; float norm, c[2][N]; if (ifft != -1) { for (k=0; k eps) { printf("The IDFT of the series isn't real!\n"); exit(0); } } for (j=0; j FFT ** ifft = -1 <--> IFFT */ void fft1r1(float A[2][DN], int ifft) { unsigned long int j, k, dk; float norm, c[2][N], d[2][N], tt, hunit, cosj, sinj; hunit = 4.0 * atan(1.0) / (float)N; if ( ifft != -1) { for (k=0; k eps) { printf("The IDFT of the series {xj} isn't real!\n"); exit(0); } } for (j = 0; j