static void FFT(ref Complex[] data, FFTDirection direction) { int n = data.Length; int i, j, istep; int m, mmax; double r, r1, theta, w_r, w_i, temp_r, temp_i; r = Math.PI; if(FFTDirection.Forward == direction) { r = -r; } j = 0; for(i = 0; i < n; i++) { if(i < j) { temp_r = data[j].Re; temp_i = data[j].Im; data[j].Re = data[i].Re; data[j].Im = data[i].Im; data[i].Re = temp_r; data[i].Im = temp_i; } m = n >> 1; while(j >= m) { j -= m; m = (m + 1) / 2; } j += m; } mmax = 1; while(mmax < n) { istep = mmax << 1; r1 = r / (double)mmax; for(m = 0; m < mmax; m++) { theta = r1 * m; w_r = Math.Cos(theta); w_i = Math.Sin(theta); for(i = m; i < n; i += istep) { j = i + mmax; temp_r = w_r * data[j].Re - w_i * data[j].Im; temp_i = w_r * data[j].Im + w_i * data[j].Re; data[j].Re = data[i].Re - temp_r; data[j].Im = data[i].Im - temp_i; data[i].Re += temp_r; data[i].Im += temp_i; } } mmax = istep; } if(FFTDirection.Reverse == direction) for(i = 0; i < n; i++) { data[i].Re /= (double)n; data[i].Im /= (double)n; } }
public static Complex[,] GetPictureFFT(Complex[,] image, int dim, FFTDirection direction) { Complex[] data = new Complex[dim]; for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) { data[j] = image[j, i]; } FFT(ref data, direction); for (int j = 0; j < dim; j++) { image[j, i] = data[j]; } } data = new Complex[dim]; for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) { data[j] = image[i, j]; } FFT(ref data, direction); for (int j = 0; j < dim; j++) { image[i, j] = data[j]; } } Complex[,] spectrum = new Complex[dim, dim]; for (int i = 0; i < dim / 2; i++) { for (int j = 0; j < dim/2; j++) { spectrum[i, j] = image[i + dim / 2, j + dim / 2]; spectrum[i + dim / 2, j + dim / 2] = image[i, j]; spectrum[i + dim / 2, j] = image[i, j + dim / 2]; spectrum[i, j + dim / 2] = image[i + dim / 2, j]; } } return spectrum; }