r7939: Initial working version of fftw3 conversion -- tested only with pjrec
[ctsim.git] / include / fourier.h
index 8a78620be0797c80cef813b47eb1adba02fde2c7..5215a3a25928ad645869be3c2eeadba9e9b2d875 100644 (file)
@@ -1,4 +1,4 @@
-y/*****************************************************************************
+/*****************************************************************************
 ** FILE IDENTIFICATION
 **
 **   Name:          fourier.h
@@ -7,9 +7,9 @@ y/*****************************************************************************
 **   Date Started:  Dec 2000
 **
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2001 Kevin Rosenberg
+**  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: fourier.h,v 1.3 2001/01/28 19:10:18 kevin Exp $
+**  $Id$
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
@@ -26,6 +26,9 @@ y/*****************************************************************************
 ******************************************************************************/
 
 #include <complex>
+#ifdef HAVE_FFTW
+#include <fftw3.h>
+#endif
 
 class ImageFile;
 
@@ -34,12 +37,78 @@ public:
     static void shuffleFourierToNaturalOrder (ImageFile& im);
     static void shuffleNaturalToFourierOrder (ImageFile& im);
 
+#ifdef HAVE_FFTW
+    static void shuffleFourierToNaturalOrder (fftw_complex* pc, const int n);
+    static void shuffleNaturalToFourierOrder (fftw_complex* pc, const int n);
+#endif
+    
+// Odd Number of Points
+//   Natural Frequency Order: -(n-1)/2...-1,0,1...(n-1)/2
+//   Fourier Frequency Order: 0, 1..(n-1)/2,-(n-1)/2...-1
+// Even Number of Points
+//   Natural Frequency Order: -n/2...-1,0,1...((n/2)-1)
+//   Fourier Frequency Order: 0,1...((n/2)-1),-n/2...-1
+    template<class T>
+    static void shuffleNaturalToFourierOrder (T* pVector, const int n) 
+    {
+      T* pTemp = new T [n];
+      int i;
+      if (isOdd(n)) { // Odd
+        int iHalfN = (n - 1) / 2;
+
+        pTemp[0] = pVector[iHalfN];
+        for (i = 0; i < iHalfN; i++)
+          pTemp[i + 1] = pVector[i + 1 + iHalfN];
+        for (i = 0; i < iHalfN; i++)
+          pTemp[i + iHalfN + 1] = pVector[i];
+      } else {     // Even
+        int iHalfN = n / 2;
+        pTemp[0] = pVector[iHalfN];
+        for (i = 0; i < iHalfN - 1; i++)
+        pTemp[i + 1] = pVector[i + iHalfN + 1];
+        for (i = 0; i < iHalfN; i++)
+          pTemp[i + iHalfN] = pVector[i];
+      }
+
+    for (i = 0; i < n; i++)
+      pVector[i] = pTemp[i];
+    delete pTemp;
+  }
+
+  template<class T>
+  static void shuffleFourierToNaturalOrder (T* pVector, const int n)
+  {
+    T* pTemp = new T [n];
+    int i;
+    if (isOdd(n)) { // Odd
+      int iHalfN = (n - 1) / 2;
+    
+      pTemp[iHalfN] = pVector[0];
+      for (i = 0; i < iHalfN; i++)
+        pTemp[i + 1 + iHalfN] = pVector[i + 1];
+      for (i = 0; i < iHalfN; i++)
+        pTemp[i] = pVector[i + iHalfN + 1];
+    } else {     // Even
+      int iHalfN = n / 2;
+      pTemp[iHalfN] = pVector[0];
+      for (i = 0; i < iHalfN; i++)
+        pTemp[i] = pVector[i + iHalfN];
+      for (i = 0; i < iHalfN - 1; i++)
+        pTemp[i + iHalfN + 1] = pVector[i+1];
+    }
+  
+    for (i = 0; i < n; i++)
+      pVector[i] = pTemp[i];
+    delete pTemp;
+  }
+#if 0
     static void shuffleNaturalToFourierOrder (float* pdVector, const int n);
     static void shuffleNaturalToFourierOrder (double* pdVector, const int n);
     static void shuffleNaturalToFourierOrder (std::complex<double>* pdVector, const int n);
     static void shuffleFourierToNaturalOrder (float* pdVector, const int n);
     static void shuffleFourierToNaturalOrder (double* pdVector, const int n);
     static void shuffleFourierToNaturalOrder (std::complex<double>* pdVector, const int n);
+#endif
+};
 
-}; // namespace Fourier