public FFT(COMPLEX[,] Input) { nx = Width = Input.GetLength(0); ny = Height = Input.GetLength(1); Fourier = Input; }
public void FFTPlot(COMPLEX[,] Output) { int i, j; float max; FFTLog = new float[nx, ny]; FFTPhaseLog = new float[nx, ny]; FourierMagnitude = new float[nx, ny]; FourierPhase = new float[nx, ny]; FFTNormalized = new int[nx, ny]; FFTPhaseNormalized = new int[nx, ny]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { FourierMagnitude[i, j] = Output[i, j].Magnitude(); FourierPhase[i, j] = Output[i, j].Phase(); FFTLog[i, j] = (float)Math.Log(1 + FourierMagnitude[i, j]); FFTPhaseLog[i, j] = (float)Math.Log(1 + Math.Abs(FourierPhase[i, j])); } max = FFTLog[0, 0]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { if (FFTLog[i, j] > max) max = FFTLog[i, j]; } for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { FFTLog[i, j] = FFTLog[i, j] / max; } for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { FFTNormalized[i, j] = (int)(2000 * FFTLog[i, j]); } FourierPlot = Displayimage(FFTNormalized); FFTPhaseLog[0, 0] = 0; max = FFTPhaseLog[1, 1]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { if (FFTPhaseLog[i, j] > max) max = FFTPhaseLog[i, j]; } for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { FFTPhaseLog[i, j] = FFTPhaseLog[i, j] / max; } for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { FFTPhaseNormalized[i, j] = (int)(255 * FFTPhaseLog[i, j]); } PhasePlot = Displayimage(FFTPhaseNormalized); }
public void InverseFFT(COMPLEX[,] Fourier) { int i, j; Output = new COMPLEX[nx, ny]; Output = FFT2D(Fourier, nx, ny, -1); for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) { GreyImage[i, j] = (int)Output[i, j].Magnitude(); } Obj = Displayimage(GreyImage); return; }
public COMPLEX[,] FFT2D(COMPLEX[,] c, int nx, int ny, int dir) { int i, j; int m; double[] real; double[] imag; COMPLEX[,] output; output = c; real = new double[nx]; imag = new double[nx]; for (j = 0; j < ny; j++) { for (i = 0; i < nx; i++) { real[i] = c[i, j].real; imag[i] = c[i, j].imag; } m = (int)Math.Log((double)nx, 2); FFT1D(dir, m, ref real, ref imag); for (i = 0; i < nx; i++) { // c[i,j].real = real[i]; // c[i,j].imag = imag[i]; output[i, j].real = real[i]; output[i, j].imag = imag[i]; } } real = new double[ny]; imag = new double[ny]; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { //real[j] = c[i,j].real; //imag[j] = c[i,j].imag; real[j] = output[i, j].real; imag[j] = output[i, j].imag; } m = (int)Math.Log((double)ny, 2); FFT1D(dir, m, ref real, ref imag); for (j = 0; j < ny; j++) { //c[i,j].real = real[j]; //c[i,j].imag = imag[j]; output[i, j].real = real[j]; output[i, j].imag = imag[j]; } } // return(true); return (output); }