// Perform a single 2D FFT by performing nx+ny 1D FFTs // fft_2d(complex* x, int nx, int ny, int x_stride, int y_stride) // 1. Perform 1D FFTs along rows // Element x[i,j] is located at x[i * x_stride + j * y_stride] // So each row starts at x + 0 * x_stride + j * y_stride, has length nx, and stride x_stride // 2. Perform 1D FFTs along columns // Element x[i,j] is located at x[i * x_stride + j * y_stride] // So each column starts at x + i * x_stride + 0 * y_stride, has length ny, and stride y_stride void fft_2d(complex* x, int nx, int ny, int x_stride, int y_stride) { int i, j; for(j=0; j<ny; j++) fft_1d(x + j * y_stride, nx, x_stride, Wkn_fft); for(i=0; i<nx; i++) fft_1d(x + i * x_stride, ny, y_stride, Wkn_fft); }
/*---------------------------------------------------------------------------*/ static void fft_2d(double * data, int nn, int mm, int isign, double * copy) { int i, j, index1, index2; /* Transform by ROWS for forward transform */ if (isign == 1) { index1 = 0; for (i = 0; i < mm; i++) { fft_1d(data+index1, nn, isign); index1 += (nn << 1); } } /* Transform by COLUMNS */ for (j = 0; j < nn; j++) { /* Copy pixels into temp array */ index1 = (j << 1); index2 = 0; for (i = 0; i < mm; i++) { copy[index2++] = data[index1]; copy[index2++] = data[index1 + 1]; index1 += (nn << 1); } /* Perform transform */ fft_1d(copy, mm, isign); /* Copy pixels back into data array */ index1 = (j << 1); index2 = 0; for (i = 0; i < mm; i++) { data[index1] = copy[index2++]; data[index1 + 1] = copy[index2++]; index1 += (nn << 1); } } /* Transform by ROWS for inverse transform */ if (isign == -1) { index1 = 0; for (i = 0; i < mm; i++) { fft_1d(data+index1, nn, isign); index1 += (nn << 1); } } }