+#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