// Perform a single 2D FFT by performing nx+ny 1D FFTs
// fft_2d(complex* x, int nx, int ny, int x_stride, int y_stride)
// 1. Perform 1D FFTs along rows
//    Element x[i,j] is located at x[i * x_stride + j * y_stride]
//    So each row starts at x + 0 * x_stride + j * y_stride, has length nx, and stride x_stride
// 2. Perform 1D FFTs along columns
//    Element x[i,j] is located at x[i * x_stride + j * y_stride]
//    So each column starts at x + i * x_stride + 0 * y_stride, has length ny, and stride y_stride
void fft_2d(complex* x, int nx, int ny, int x_stride, int y_stride) {
  int i, j;

  for(j=0; j<ny; j++)
    fft_1d(x + j * y_stride, nx, x_stride, Wkn_fft);
  for(i=0; i<nx; i++)
    fft_1d(x + i * x_stride, ny, y_stride, Wkn_fft);
}
Beispiel #2
0
Datei: fft.c Projekt: dk/IPA
/*---------------------------------------------------------------------------*/
static void fft_2d(double * data, int nn, int mm, int isign, double * copy)
{
   int i, j, index1, index2;

   /* Transform by ROWS for forward transform */
   if (isign == 1)
   {
      index1 = 0;
      for (i = 0; i < mm; i++)
      {
         fft_1d(data+index1, nn, isign);
	 index1 += (nn << 1);
      }
   }
   
   /* Transform by COLUMNS */
   for (j = 0; j < nn; j++)
   {
      /* Copy pixels into temp array */
      index1 = (j << 1);
      index2 = 0;
      for (i = 0; i < mm; i++)
      {
	 copy[index2++] = data[index1];
	 copy[index2++] = data[index1 + 1];
	 index1 += (nn << 1);
      }

      /* Perform transform */
      fft_1d(copy, mm, isign);

      /* Copy pixels back into data array */
      index1 = (j << 1);
      index2 = 0;
      for (i = 0; i < mm; i++)
      {
	 data[index1] = copy[index2++];
	 data[index1 + 1] = copy[index2++];
	 index1 += (nn << 1);
      }
   }

   /* Transform by ROWS for inverse transform */
   if (isign == -1)
   {
      index1 = 0;
      for (i = 0; i < mm; i++)
      {
	 fft_1d(data+index1, nn, isign);
	 index1 += (nn << 1);
      }
   }
}