void fft2x(Complex a[], int n, int nmax, int flag) { int i, iter, j, k; Complex *p, *w; if(n < 2) { fprintf(stderr, "Error : Illegal parameter in fft2()\n"); return; } iter = 0; i = n; while((i /= 2) != 0) iter++; j = 1; for(i = 1; i <= iter; i++) j *= 2; if(n != j) { fprintf(stderr, "Error : n != 2 ^ k in fft2x()\n"); return; } w = (Complex *)malloc(n * sizeof(Complex)); if(w == NULL) { fprintf(stderr, "Error : Out of memory in fft2x()\n"); return; } for(j = 0; j < n; j++, k += nmax) { for(i = 0, p = a + j; i < n; i++, p += nmax) *(w + i) = *p; fft1x(w, n, iter, flag); for(i = 0, p = a + j; i < n; i++, p += nmax) *p = *(w + i); } for(i = k = 0; i < n; i++, k += nmax) { for(j = 0, p = a + k; j < n; j++) *(w + j) = *p++; fft1x(w, n, iter, flag); for(j = 0, p = a + k; j < n; j++) *p++ = *(w + j); } free((char *)w); return; }
int main(void) { static double ar[8] = { 0., 0., 0., 1., 1., 0., 0., 0.}; static double ai[8] = { 0., 0., 0., 0., 0., 0., 0., 0.}; static double ar2[16] = { 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0.}; static double ai2[16] = { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}; Complex a[8], a2[16]; int flag, i, iter, j, k, n, nmax; iter = 0; n = 8; #ifndef CPX for(i = 0; i < n; i++) a[i] = tocomplex(ar[i], ai[i]); print(ar, ai, n); #else printx(a, n); #endif /* forward FFT */ flag = 0; #ifndef CPX fft1(ar, ai, n, iter, flag); print(ar, ai, n); #else fft1x(a, n, iter, flag); printx(a, n); #endif /* reverse FFT */ flag = 1; #ifndef CPX fft1(ar, ai, n, iter, flag); print(ar, ai, n); #else fft1x(a, n, iter, flag); printx(a, n); #endif n = nmax = 4; for(i = k = 0; i < n; i++) for(j = 0; j < n; j++, k++) a2[k] = tocomplex(ar2[k], ai2[k]); #ifndef CPX print2(ar2, ai2, n, nmax); #else print2x(a2, n, nmax); #endif flag = 0; #ifndef CPX fft2(ar2, ai2, n, nmax, flag); print2(ar2, ai2, n, nmax); #else fft2x(a2, n, nmax, flag); print2x(a2, n, nmax); #endif flag = 1; #ifndef CPX fft2(ar2, ai2, n, nmax, flag); print2(ar2, ai2, n, nmax); #else fft2x(a2, n, nmax, flag); print2x(a2, n, nmax); #endif return 1; }