r120: *** empty log message ***
[ctsim.git] / libctsim / filter.cpp
index c62eb24330d59e0c55645e6918977bc73f5d726a..e8038aad7203790f5beb15462dcf96272401abd0 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: filter.cpp,v 1.3 2000/06/22 10:17:28 kevin Exp $
+**  $Id: filter.cpp,v 1.4 2000/06/25 17:32:24 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
  *                     for spatial domain filters.  For ANALYTIC solutions, use numint = 0
  */
 
-SignalFilter::SignalFilter (const char* filterName, double bw, double xmin, double xmax, int n, double param, const char* domainName, int numint)
+SignalFilter::SignalFilter (const char* filterName, double bw, double xmin, double xmax, int n, double param, const char* domainName, int numIntegral = 0)
 {
+  m_vecFilter = NULL;
   m_idFilter = convertFilterNameToID (filterName);
+  if (m_idFilter == FILTER_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid Filter name ";
+    m_failMessage += filterName;
+    return;
+  }
   m_idDomain = convertDomainNameToID (domainName);
-  init (m_idFilter, bw, xmin, xmax, n, param, m_idDomain, numint);
+  if (m_idDomain == DOMAIN_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid domain name ";
+    m_failMessage += domainName;
+    return;
+  }
+  init (m_idFilter, bw, xmin, xmax, n, param, m_idDomain, numIntegral);
 }
 
-SignalFilter::SignalFilter (const FilterID filterID, double bw, double xmin, double xmax, int n, double param, const DomainID domainID, int numint)
+SignalFilter::SignalFilter (const FilterID filterID, double bw, double xmin, double xmax, int n, double param, const DomainID domainID, int numIntegral = 0)
 {
-  init (filterID, bw, xmin, xmax, n, param, domainID, numint);
+  init (filterID, bw, xmin, xmax, n, param, domainID, numIntegral);
+}
+
+SignalFilter::SignalFilter (const char* filterName, const char* domainName, double bw, double param, int numIntegral = 0)
+{
+  m_bw = bw;
+  m_nPoints = 0;
+  m_vecFilter = NULL;
+  m_filterParam = param;  
+  m_numIntegral = numIntegral;
+  m_idFilter = convertFilterNameToID (filterName);
+  if (m_idFilter == FILTER_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid Filter name ";
+    m_failMessage += filterName;
+    return;
+  }
+  m_idDomain = convertDomainNameToID (domainName);
+  if (m_idDomain == DOMAIN_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid domain name ";
+    m_failMessage += domainName;
+    return;
+  }
 }
 
 void
@@ -72,6 +108,8 @@ SignalFilter::init (const FilterID filterID, double bw, double xmin, double xmax
   m_nPoints = n;
   m_xmin = xmin;
   m_xmax = xmax;
+  m_numIntegral = numint;
+  m_filterParam = param;  
   m_vecFilter = new double[n];
 
   double xinc = (m_xmax - m_xmin) / (m_nPoints - 1);
@@ -99,7 +137,8 @@ SignalFilter::init (const FilterID filterID, double bw, double xmin, double xmax
       else
        m_vecFilter[i] = spatialResponseCalc (x, param, numint);
   } else {
-      sys_error (ERR_WARNING, "Illegal domain %d [filt_generate]", m_idDomain);
+      m_failMessage = "Illegal domain name ";
+      m_failMessage += m_idDomain;
       m_fail = true;
   }
 }
@@ -113,7 +152,7 @@ SignalFilter::~SignalFilter (void)
 SignalFilter::FilterID
 SignalFilter::convertFilterNameToID (const char *filterName)
 {
-  FilterID filterID;
+  FilterID filterID = FILTER_INVALID;
 
   if (strcasecmp (filterName, FILTER_BANDLIMIT_STR) == 0)
     filterID = FILTER_BANDLIMIT;
@@ -135,10 +174,6 @@ SignalFilter::convertFilterNameToID (const char *filterName)
     filterID = FILTER_ABS_COSINE;
   else if (strcasecmp (filterName, FILTER_SHEPP_STR) == 0)
     filterID = FILTER_SHEPP;
-  else {
-    sys_error(ERR_WARNING, "Invalid filter type %s\n", filterName);
-    filterID = FILTER_INVALID;
-  }
 
   return (filterID);
 }
@@ -175,14 +210,12 @@ SignalFilter::convertFilterIDToName (const FilterID filterID)
 const SignalFilter::DomainID
 SignalFilter::convertDomainNameToID (const char* const domainName)
 {
-  DomainID dID;
+  DomainID dID = DOMAIN_INVALID;
 
   if (strcasecmp (domainName, DOMAIN_SPATIAL_STR) == 0)
     dID = DOMAIN_SPATIAL;
   else if (strcasecmp (domainName, DOMAIN_FREQ_STR) == 0)
     dID = DOMAIN_FREQ;
-  else
-    dID = DOMAIN_INVALID;
 
   return (dID);
 }
@@ -202,20 +235,28 @@ SignalFilter::convertDomainIDToName (const DomainID domain)
 
 
 double
-SignalFilter::response (const char* filterName, const char* domainName, double bw, double x, double filt_param)
+SignalFilter::response (double x)
 {
   double response = 0;
-  FilterID filterID = convertFilterNameToID (filterName);
-  DomainID domainID = convertDomainNameToID (domainName);
 
-  if (domainID == DOMAIN_SPATIAL)
-    response = spatialResponseAnalytic (filterID, bw, x, filt_param);
-  else if (domainID == DOMAIN_FREQ)
-    response = frequencyResponse (filterID, bw, x, filt_param);
+  if (m_idDomain == DOMAIN_SPATIAL)
+    response = spatialResponse (m_idFilter, m_bw, x, m_filterParam, m_numIntegral);
+  else if (m_idDomain == DOMAIN_FREQ)
+    response = frequencyResponse (m_idFilter, m_bw, x, m_filterParam);
 
   return (response);
 }
 
+
+double 
+SignalFilter::spatialResponse (FilterID filterID, double bw, double x, double param, int nIntegral = 0)
+{
+  if (nIntegral == 0)
+    return spatialResponseAnalytic (filterID, bw, x, param);
+  else
+    return spatialResponseCalc (filterID, bw, x, param, nIntegral);
+}
+
 /* NAME
  *   filter_spatial_response_calc      Calculate filter by discrete inverse fourier
  *                                     transform of filters's frequency
@@ -232,9 +273,9 @@ SignalFilter::response (const char* filterName, const char* domainName, double b
  */
 
 double 
-SignalFilter::spatialResponseCalc (double x, double param, int n) const
+SignalFilter::spatialResponseCalc (double x, double param, int nIntegral) const
 {
-  return (spatialResponseCalc (m_idFilter, m_bw, x, param, n));
+  return (spatialResponseCalc (m_idFilter, m_bw, x, param, nIntegral));
 }
 
 double