Search code examples
c++fftw

FFTW forward and back ward yield in different results why?


I am trying to FFT an image using the library from http://www.fftw.org/. basically i want to do a forward transform and then the backward transform to get the input image i have chosen. Then I would like to get my input back with the backward FFT, but it doesn't work. Here is my code :

double n[w][h][2];
double im[w][h][2];

const int Lx = w;
 const int Lt = h;
 int var_x;
 int var_t;


 fftw_complex *in, *out, *result;
 fftw_plan p;
 fftw_plan inv_p;

 in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Lx*Lt);
 out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Lx*Lt);
 result = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *Lx *Lt);

 p = fftw_plan_dft_2d(Lx, Lt, in, out, FFTW_FORWARD, FFTW_MEASURE);



 for (int x = 0; x < Lx; x++)
 {
     for (int t = 0; t < Lt; t++)
     {
         in[t + Lt*x][0] = n[x][t][0];
         in[t + Lt*x][1] = 0;
     }
 }

 fftw_execute(p);

 for (int x = 0; x < Lx; x++)
 {
     for (int t = 0; t < Lt; t++)
     {
         n[x][t][0] = out[t + Lt*x][0];
         n[x][t][1] = out[t + Lt*x][1];
     }
 }



 inv_p = fftw_plan_dft_2d(Lx, Lt, out, result, FFTW_BACKWARD, FFTW_MEASURE);

 fftw_execute(inv_p);

 for (int x = 0; x < Lx; x++)
 {
     for (int t = 0; t < Lt; t++)
     {
         im[x][t][0] = result[t + Lt*x][0];
         im[x][t][1] = result[t + Lt*x][1];
         std::cout<<im[x][t][0]<<std::endl;
     }
 }

 fftw_destroy_plan(p);
 fftw_free(in);
 fftw_free(out);

As you can see, I just try to perform a normal FFT, then to reverse it. The problem is that my output 'im' is just full of 0, instead of 1 and 0...

So what's wrong with my code ?

Thank you :)


Solution

  • This is the corrected version of the code which is now working - thank you to everybody who helped me to fix all the problems.

     double n[w][h][2];
     double im[w][h][2];
    
     const int Lx = w;
     const int Lt = h;
     int var_x;
     int var_t;
    
     fftw_complex *in, *out, *result;
     fftw_plan p;
     fftw_plan inv_p;
    
     in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Lx*Lt);
     out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Lx*Lt);
     result = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *Lx *Lt);
    
     p = fftw_plan_dft_2d(Lx, Lt, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    
     for (int x = 0; x < Lx; x++)
     {
         for (int t = 0; t < Lt; t++)
         {
             in[t + Lt*x][0] = n[x][t][0];
             in[t + Lt*x][1] = 0;
         }
     }
    
     fftw_execute(p);
    
     for (int x = 0; x < Lx; x++)
     {
         for (int t = 0; t < Lt; t++)
         {
             n[x][t][0] = out[t + Lt*x][0];
             n[x][t][1] = out[t + Lt*x][1];
         }
     }
    
     inv_p = fftw_plan_dft_2d(Lx, Lt, out, result, FFTW_BACKWARD, FFTW_ESTIMATE);
    
     fftw_execute(inv_p);
    
     for (int x = 0; x < Lx; x++)
     {
         for (int t = 0; t < Lt; t++)
         {
             im[x][t][0] = result[t + Lt*x][0];
             im[x][t][1] = result[t + Lt*x][1];
             std::cout<<im[x][t][0]<<std::endl;
         }
     }
    
     fftw_destroy_plan(p);
     fftw_destroy_plan(inv_p);
     fftw_free(in);
     fftw_free(out);
     fftw_free(result);