r384: Added first vesion of EZPlotDialog
[ctsim.git] / libctsim / procsignal.cpp
index c40e2972ad606290afef9a33ec7dd0f9a8f96355..67641fd52f5b306fde9469c25845c107bb749c07 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: procsignal.cpp,v 1.15 2001/01/12 03:49:07 kevin Exp $
+**  $Id: procsignal.cpp,v 1.19 2001/01/12 16:41:56 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
 
 #include "ct.h"
 
+#ifdef HAVE_WXWINDOWS
+#include "../src/dlgezplot.h"
+#endif
+
 // FilterMethod ID/Names
 const int ProcessSignal::FILTER_METHOD_INVALID = -1;
 const int ProcessSignal::FILTER_METHOD_CONVOLUTION = 0;
@@ -280,7 +284,8 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw
         m_dFilterMax -= m_dFilterInc;
       }
       
-      SignalFilter filter (m_idFilter, m_dFilterMin, m_dFilterMax, m_nFilterPoints, m_dBandwidth, m_dFilterParam, SignalFilter::DOMAIN_FREQUENCY);
+      SignalFilter filter (m_idFilter, m_dFilterMin, m_dFilterMax, m_nFilterPoints, m_dBandwidth, 
+                 m_dFilterParam, SignalFilter::DOMAIN_FREQUENCY);
       m_adFilter = new double [m_nFilterPoints];
       filter.copyFilterData (m_adFilter, 0, m_nFilterPoints);
       
@@ -347,21 +352,22 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw
         std::cout << "nFilterPoints = " << m_nFilterPoints << endl;
 #endif
       double* adSpatialFilter = new double [m_nFilterPoints];
-      SignalFilter filter (m_idFilter, m_dFilterMin, m_dFilterMax, nSpatialPoints, m_dBandwidth, m_dFilterParam, SignalFilter::DOMAIN_SPATIAL);
+      SignalFilter filter (m_idFilter, m_dFilterMin, m_dFilterMax, nSpatialPoints, m_dBandwidth, 
+                 m_dFilterParam, SignalFilter::DOMAIN_SPATIAL);
       filter.copyFilterData (adSpatialFilter, 0, nSpatialPoints);
-#ifdef HAVE_SGP
-      EZPlot* pEZPlot = NULL;
-      if (pSGP && m_traceLevel >= Trace::TRACE_PLOT) {
-        pEZPlot = new EZPlot;
-        pEZPlot->ezset ("title Spatial Filter: Natural Order");
-        pEZPlot->ezset ("ylength 0.50");
-        pEZPlot->ezset ("yporigin 0.00");
-        pEZPlot->addCurve (adSpatialFilter, nSpatialPoints);
-        pEZPlot->plot (pSGP);
-        delete pEZPlot;
+#if defined(HAVE_WXWINDOWS) && defined(DEBUG)
+      EZPlotDialog pEZPlotDlg = NULL;
+      if (g_bRunningWXWindows && m_traceLevel > 0) {
+        pEZPlotDlg = new EZPlotDialog;
+        pEZPlot->getEZPlot()->ezset ("title Spatial Filter: Natural Order");
+        pEZPlot->getEZPlot()->ezset ("ylength 0.50");
+        pEZPlot->getEZPlot()->ezset ("yporigin 0.00");
+        pEZPlot->getEZPlot()->addCurve (adSpatialFilter, nSpatialPoints);
       }
 #endif
 
+// #define PRE_JAN_2001 1
+#ifdef PRE_JAN_2001
       if (m_idGeometry == Scanner::GEOMETRY_EQUILINEAR) {
         for (i = 0; i < m_nFilterPoints; i++)
           adSpatialFilter[i] *= 0.5;
@@ -387,15 +393,46 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw
       for (i = 0; i < m_nFilterPoints; i++)
         m_adFilter[i] = std::abs (acInverseFilter[i]) * m_dSignalInc;
       delete acInverseFilter;
+#else
+      for (i = nSpatialPoints; i < m_nFilterPoints; i++)
+        adSpatialFilter[i] = 0;
+      
+//       for (i = 0; i < m_nFilterPoints; i++)
+//               adSpatialFilter[i] /= m_dSignalInc;
 
-#ifdef HAVE_SGP
-      if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
-        pEZPlot->ezset ("title Spatial Filter: Inverse");
-        pEZPlot->ezset ("ylength 0.50");
-        pEZPlot->ezset ("yporigin 0.50");
-        pEZPlot->addCurve (m_adFilter, m_nFilterPoints);
-        pEZPlot->plot (pSGP);
-        delete pEZPlot;
+      std::complex<double>* acInverseFilter = new std::complex<double> [m_nFilterPoints];
+      finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, FORWARD);
+      delete adSpatialFilter;
+      m_adFilter = new double [m_nFilterPoints];
+      for (i = 0; i < m_nFilterPoints; i++)
+                 m_adFilter[i] = std::abs(acInverseFilter[i]);
+      delete acInverseFilter;
+
+      if (m_idGeometry == Scanner::GEOMETRY_EQUILINEAR) {
+        for (i = 0; i < m_nFilterPoints; i++)
+          m_adFilter[i] *= 0.5;
+      } else if (m_idGeometry == Scanner::GEOMETRY_EQUIANGULAR) {
+        for (i = 0; i < m_nFilterPoints; i++) {
+          int iDetFromZero = i - ((m_nFilterPoints - 1) / 2);
+          double sinScale = sin (iDetFromZero * m_dSignalInc);
+          if (fabs(sinScale) < 1E-7)
+            sinScale = 1;
+          else
+            sinScale = (iDetFromZero * m_dSignalInc) / sinScale;
+          double dScale = 0.5 * sinScale * sinScale;
+          m_adFilter[i] *= dScale;
+        }
+      }
+#endif
+
+#if defined(HAVE_WXWINDOWS) && defined(DEBUG)
+      if (g_bRunningWXWindows && pEZPlotDlg && m_traceLevel > 0) {
+        pEZPlotDlg->getEZPlot()->ezset ("title Spatial Filter: Inverse");
+        pEZPlotDlg->getEZPlot()->ezset ("ylength 0.50");
+        pEZPlotDlg->getEZPlot()->ezset ("yporigin 0.50");
+        pEZPlotDlg->getEZPlot()->addCurve (m_adFilter, m_nFilterPoints);
+        pEZPlotDlg->ShowModal();
+        delete pEZPlotDlg;
       }
 #endif
     }