I had this bug in my code for about two weeks. I had to write a program to compute the 2 dimensional FFT of an image. That's it. I'll just use FFTW, the most popular open source library for computing FFTs.
The Wrong Solution for computing FFTs with FFTW:
int j;
fftw_plan myplan;
fftw_complex in[x*y], out[x*y];
for (j = 0; j < x*y; j++) {
in[j][0] = r[j];
in[j][1] = i[j];
} // End For
myplan = (dir == 1)? fftw_plan_dft_2d(x, y, in, out, FFTW_FORWARD, FFTW_MEASURE) :
fftw_plan_dft_2d(x, y, in, out, FFTW_BACKWARD, FFTW_MEASURE) ;
fftw_execute(myplan);In these few lines of code lies a problem that I've spent weeks trying to find. There are no syntax errors, nor are there logic errors. Every time I ran this code, the result would be all zeros. If I ran it multiple times, I got the correct results for every execution after the first. I dropped the data into a prepared array, made a plan (as defined by the FFTW C library), then executed that library. Should work, right? Wrong.
The Correct Solution for computing FFTs with FFTW:
int j;
fftw_plan myplan;
fftw_complex in[x*y], out[x*y];
myplan = (dir == 1)? fftw_plan_dft_2d(x, y, in, out, FFTW_FORWARD, FFTW_MEASURE) :
fftw_plan_dft_2d(x, y, in, out, FFTW_BACKWARD, FFTW_MEASURE) ;
for (j = 0; j < x*y; j++) {
in[j][0] = r[j];
in[j][1] = i[j];
} // End For
fftw_execute(myplan);I found buried in the FFTW FAQ that I'm suppose to make a plan before giving it the data. I switched two sets of lines around and everything magically works for reasons I fail to understand. Let this be a lesson to anyone having to use FFTW.

2 comments:
That's because it measures the speed using different pieces of code. For that, it has to write to your reserved memory.
hi , thank you for your post here, and i have the same problem. with you infomation, i get i.
yungui.xu@gmail.com
Post a Comment