I am trying to perform an FFT image using the library http://www.fftw.org/ so that I can perform convolution in the frequency domain. But I canโt figure out how to make it work. To understand how to do this, I try to forward the FFT image as an array of pixelcolors, and then back to the FFT to get the same array of pixels. That's what I'm doing:
fftw_plan planR, planG, planB; fftw_complex *inR, *inG, *inB, *outR, *outG, *outB, *resultR, *resultG, *resultB; //Allocate arrays. inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); inG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); inB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); resultR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); resultG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); resultB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); //Fill in arrays with the pixelcolors. for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int currentIndex = ((y * width) + (x)) * 3; inR[y * width + x][0] = pixelColors[currentIndex]; inG[y * width + x][0] = pixelColors[currentIndex + 1]; inB[y * width + x][0] = pixelColors[currentIndex + 2]; } } //Forward plans. planR = fftw_plan_dft_2d(width, width, inR, outR, FFTW_FORWARD, FFTW_MEASURE); planG = fftw_plan_dft_2d(width, width, inG, outG, FFTW_FORWARD, FFTW_MEASURE); planB = fftw_plan_dft_2d(width, width, inB, outB, FFTW_FORWARD, FFTW_MEASURE); //Forward FFT. fftw_execute(planR); fftw_execute(planG); fftw_execute(planB); //Backward plans. planR = fftw_plan_dft_2d(width, width, outR, resultR, FFTW_BACKWARD, FFTW_MEASURE); planG = fftw_plan_dft_2d(width, width, outG, resultG, FFTW_BACKWARD, FFTW_MEASURE); planB = fftw_plan_dft_2d(width, width, outB, resultB, FFTW_BACKWARD, FFTW_MEASURE); //Backward fft fftw_execute(planR); fftw_execute(planG); fftw_execute(planB); //Overwrite the pixelcolors with the result. for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int currentIndex = ((y * width) + (x)) * 3; pixelColors[currentIndex] = resultR[y * width + x][0]; pixelColors[currentIndex + 1] = resultG[y * width + x][0]; pixelColors[currentIndex + 2] = resultB[y * width + x][0]; } }
Can someone please show me an example of how to forward an FFT image and then back an FFT image using FFTW to get the same result? I looked at a lot of examples showing how to use FFTW for FFT, but I canโt understand how this relates to my situation when I have an array of pixels representing the image.