r326: FFTW additions, filter image generation
[ctsim.git] / libctsim / procsignal.cpp
index a7933b21eb2a4ffb508c88d5caa35ffc834d3723..8c45da42d91300ef3c04902dad49ba5255a58548 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: procsignal.cpp,v 1.11 2000/12/29 15:45:06 kevin Exp $
+**  $Id: procsignal.cpp,v 1.12 2001/01/01 10:14:34 kevin Exp $
 **
 **  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
 **
 **  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
@@ -199,7 +199,7 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw
         pEZPlot->plot (pSGP);
       }
 #endif
         pEZPlot->plot (pSGP);
       }
 #endif
-      ProcessSignal::finiteFourierTransform (adFrequencyFilter, m_adFilter, m_nFilterPoints, -1);
+      ProcessSignal::finiteFourierTransform (adFrequencyFilter, m_adFilter, m_nFilterPoints, FORWARD);
       delete adFrequencyFilter;\r
 #ifdef HAVE_SGP
       if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
       delete adFrequencyFilter;\r
 #ifdef HAVE_SGP
       if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
@@ -370,10 +370,10 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw
       
       m_adFilter = new double [m_nFilterPoints];
       std::complex<double>* acInverseFilter = new std::complex<double> [m_nFilterPoints];\r
       
       m_adFilter = new double [m_nFilterPoints];
       std::complex<double>* acInverseFilter = new std::complex<double> [m_nFilterPoints];\r
-      finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, 1);
+      finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, BACKWARD);
       delete adSpatialFilter;\r
       for (i = 0; i < m_nFilterPoints; i++)
       delete adSpatialFilter;\r
       for (i = 0; i < m_nFilterPoints; i++)
-        m_adFilter[i] = std::abs(acInverseFilter[i]) * m_dSignalInc;
+        m_adFilter[i] = std::abs (acInverseFilter[i]) * m_dSignalInc;
       delete acInverseFilter;\r
 #ifdef HAVE_SGP
       if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
       delete acInverseFilter;\r
 #ifdef HAVE_SGP
       if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
@@ -553,12 +553,12 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const
     for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
       inputSignal[i] = 0;  // zeropad
     std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
     for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
       inputSignal[i] = 0;  // zeropad
     std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
-    finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, -1);\r
+    finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, FORWARD);\r
     delete inputSignal;
     for (i = 0; i < m_nFilterPoints; i++)
       fftSignal[i] *= m_adFilter[i];
     double* inverseFourier = new double [m_nFilterPoints];
     delete inputSignal;
     for (i = 0; i < m_nFilterPoints; i++)
       fftSignal[i] *= m_adFilter[i];
     double* inverseFourier = new double [m_nFilterPoints];
-    finiteFourierTransform (fftSignal, inverseFourier, m_nFilterPoints, 1);\r
+    finiteFourierTransform (fftSignal, inverseFourier, m_nFilterPoints, BACKWARD);\r
     delete fftSignal;
     for (i = 0; i < m_nSignalPoints; i++) 
       output[i] = inverseFourier[i];\r
     delete fftSignal;
     for (i = 0; i < m_nSignalPoints; i++) 
       output[i] = inverseFourier[i];\r
@@ -570,12 +570,12 @@ ProcessSignal::filterSignal (const float constInput[], double output[]) const
     for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
       inputSignal[i] = 0;  // zeropad
     std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
     for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
       inputSignal[i] = 0;  // zeropad
     std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
-    finiteFourierTransform (inputSignal, fftSignal, -1);\r
+    finiteFourierTransform (inputSignal, fftSignal, FORWARD);\r
     delete inputSignal;
     for (i = 0; i < m_nFilterPoints; i++)
       fftSignal[i] *= m_adFilter[i];
     double* inverseFourier = new double [m_nFilterPoints];
     delete inputSignal;
     for (i = 0; i < m_nFilterPoints; i++)
       fftSignal[i] *= m_adFilter[i];
     double* inverseFourier = new double [m_nFilterPoints];
-    finiteFourierTransform (fftSignal, inverseFourier, 1);\r
+    finiteFourierTransform (fftSignal, inverseFourier, BACKWARD);\r
     delete fftSignal;
     for (i = 0; i < m_nSignalPoints; i++) 
       output[i] = inverseFourier[i];\r
     delete fftSignal;
     for (i = 0; i < m_nSignalPoints; i++) 
       output[i] = inverseFourier[i];\r
@@ -733,8 +733,8 @@ ProcessSignal::finiteFourierTransform (const std::complex<double> input[], std::
     std::complex<double> sum (0,0);
     for (int j = 0; j < n; j++) {
       double angle = i * j * angleIncrement;
     std::complex<double> sum (0,0);
     for (int j = 0; j < n; j++) {
       double angle = i * j * angleIncrement;
-      std::complex<double> exponentTerm (cos(angle), sin(angle));
-      sum += input[j] * exponentTerm;
+      std::complex<double> exponentTerm (cos(angle), sin(angle));\r
+      sum += input[j] * exponentTerm;\r
     }
     if (direction < 0) {
       sum /= n;
     }
     if (direction < 0) {
       sum /= n;
@@ -878,10 +878,17 @@ ProcessSignal::shuffleNaturalToFourierOrder (double* pdVector, const int n)
   } else {     // Even\r
     int iHalfN = n / 2;\r
     pdTemp[0] = pdVector[iHalfN];\r
   } else {     // Even\r
     int iHalfN = n / 2;\r
     pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
     for (i = 0; i < iHalfN; i++)\r
       pdTemp[i + 1] = pdVector[i + iHalfN];\r
     for (i = 0; i < iHalfN - 1; i++)\r
       pdTemp[i + iHalfN + 1] = pdVector[i];\r
     for (i = 0; i < iHalfN; i++)\r
       pdTemp[i + 1] = pdVector[i + iHalfN];\r
     for (i = 0; i < iHalfN - 1; i++)\r
       pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+    for (i = 0; i < iHalfN - 1; i++)\r
+      pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
   }\r
   \r
   for (i = 0; i < n; i++)\r
   }\r
   \r
   for (i = 0; i < n; i++)\r
@@ -905,10 +912,17 @@ ProcessSignal::shuffleNaturalToFourierOrder (std::complex<double>* pdVector, con
   } else {     // Even\r
     int iHalfN = n / 2;\r
     pdTemp[0] = pdVector[iHalfN];\r
   } else {     // Even\r
     int iHalfN = n / 2;\r
     pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
     for (i = 0; i < iHalfN; i++)\r
       pdTemp[i + 1] = pdVector[i + iHalfN];\r
     for (i = 0; i < iHalfN - 1; i++)\r
       pdTemp[i + iHalfN + 1] = pdVector[i];\r
     for (i = 0; i < iHalfN; i++)\r
       pdTemp[i + 1] = pdVector[i + iHalfN];\r
     for (i = 0; i < iHalfN - 1; i++)\r
       pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+    for (i = 0; i < iHalfN - 1; i++)\r
+      pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
   }\r
   \r
   for (i = 0; i < n; i++)\r
   }\r
   \r
   for (i = 0; i < n; i++)\r
@@ -916,7 +930,43 @@ ProcessSignal::shuffleNaturalToFourierOrder (std::complex<double>* pdVector, con
   delete [] pdTemp;\r
 }\r
 \r
   delete [] pdTemp;\r
 }\r
 \r
-
+\r
+void\r
+ProcessSignal::shuffleNaturalToFourierOrder (float* pdVector, const int n)\r
+{\r
+  float* pdTemp = new float [n];\r
+  int i;\r
+  if (n % 2) { // Odd\r
+    int iHalfN = (n - 1) / 2;\r
+    \r
+    pdTemp[0] = pdVector[iHalfN];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + 1] = pdVector[i + 1 + iHalfN];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + iHalfN + 1] = pdVector[i];\r
+  } else {     // Even\r
+    int iHalfN = n / 2;\r
+    pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + 1] = pdVector[i + iHalfN];\r
+    for (i = 0; i < iHalfN - 1; i++)\r
+      pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+    for (i = 0; i < iHalfN - 1; i++)\r
+      pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
+  }\r
+  \r
+  for (i = 0; i < n; i++)\r
+    pdVector[i] = pdTemp[i];\r
+  delete pdTemp;\r
+}\r
+\r
+\r
+\r
 void\r
 ProcessSignal::shuffleFourierToNaturalOrder (double* pdVector, const int n)\r
 {\r
 void\r
 ProcessSignal::shuffleFourierToNaturalOrder (double* pdVector, const int n)\r
 {\r
@@ -944,6 +994,7 @@ ProcessSignal::shuffleFourierToNaturalOrder (double* pdVector, const int n)
   delete pdTemp;\r
 }\r
 \r
   delete pdTemp;\r
 }\r
 \r
+\r
 void\r
 ProcessSignal::shuffleFourierToNaturalOrder (std::complex<double>* pdVector, const int n)\r
 {\r
 void\r
 ProcessSignal::shuffleFourierToNaturalOrder (std::complex<double>* pdVector, const int n)\r
 {\r
@@ -971,3 +1022,33 @@ ProcessSignal::shuffleFourierToNaturalOrder (std::complex<double>* pdVector, con
   delete [] pdTemp;\r
 }\r
 \r
   delete [] pdTemp;\r
 }\r
 \r
+\r
+\r
+\r
+void\r
+ProcessSignal::shuffleFourierToNaturalOrder (float* pVector, const int n)\r
+{\r
+  float* pTemp = new float [n];\r
+  int i;\r
+  if (n % 2) { // Odd\r
+    int iHalfN = (n - 1) / 2;\r
+    \r
+    pTemp[iHalfN] = pVector[0];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pTemp[i + 1 + iHalfN] = pVector[i + 1];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pTemp[i] = pVector[i + iHalfN + 1];\r
+  } else {     // Even\r
+    int iHalfN = n / 2;\r
+    pTemp[iHalfN] = pVector[0];\r
+    for (i = 0; i < iHalfN; i++)\r
+      pTemp[i] = pVector[i + iHalfN];\r
+    for (i = 0; i < iHalfN - 1; i++)\r
+      pTemp[i + iHalfN + 1] = pVector[i+1];\r
+  }\r
+  \r
+  for (i = 0; i < n; i++)\r
+    pVector[i] = pTemp[i];\r
+  delete [] pTemp;\r
+}\r
+\r