r175: *** empty log message ***
[ctsim.git] / libctsim / filter.cpp
index 84d2e7b4e080f877d9d162973d548e70131be084..d7d8b973c61a41f233d5a03a7c1dd3b894a5f8fc 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: filter.cpp,v 1.23 2000/07/31 14:48:35 kevin Exp $
+**  $Id: filter.cpp,v 1.24 2000/08/03 09:57:33 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
@@ -121,6 +121,23 @@ const char* SignalFilter::s_aszDomainTitle[] = {
 const int SignalFilter::s_iDomainCount = sizeof(s_aszDomainName) / sizeof(const char*);
 
 
+const int SignalFilter::FREQUENCY_FILTER_INVALID = -1;
+const int SignalFilter::FREQUENCY_FILTER_DIRECT_FREQUENCY = 0;
+const int SignalFilter::FREQUENCY_FILTER_INVERSE_SPATIAL = 1;
+    
+const char* SignalFilter::s_aszFrequencyFilterName[] = {
+  {"direct_frequency"},
+  {"inverse_spatial"},
+};
+
+const char* SignalFilter::s_aszFrequencyFilterTitle[] = {
+  {"Direct Frequency"},
+  {"Inverse Spatial"},
+};
+
+const int SignalFilter::s_iFrequencyFilterCount = sizeof(s_aszFrequencyFilterName) / sizeof(const char*);
+
+
 /* NAME
  *   SignalFilter::SignalFilter     Construct a signal
  *
@@ -135,7 +152,7 @@ const int SignalFilter::s_iDomainCount = sizeof(s_aszDomainName) / sizeof(const
  *   int domain                FREQUENCY or SPATIAL domain wanted
  */
 
-SignalFilter::SignalFilter (const char* filterName, const char* filterMethodName, double bw, double signalIncrement, int nSignalPoints, double param, const char* domainName, int zeropad = 0, int preinterpolationFactor = 1)
+SignalFilter::SignalFilter (const char* filterName, const char* filterMethodName, double bw, double signalIncrement, int nSignalPoints, double param, const char* domainName, const char* frequencyFilterName, int zeropad = 0, int preinterpolationFactor = 1)
   : m_vecFilter(NULL), m_vecFourierCosTable(NULL), m_vecFourierSinTable(NULL), m_fail(false)
 {
   m_idFilter = convertFilterNameToID (filterName);
@@ -159,13 +176,20 @@ SignalFilter::SignalFilter (const char* filterName, const char* filterMethodName
     m_failMessage += domainName;
     return;
   }
-  init (m_idFilter, m_idFilterMethod, bw, signalIncrement, nSignalPoints, param, m_idDomain, zeropad, preinterpolationFactor);
+  m_idFrequencyFilter = convertFrequencyFilterNameToID (frequencyFilterName);
+  if (m_idFrequencyFilter == FREQUENCY_FILTER_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid frequency filter name ";
+    m_failMessage += frequencyFilterName;
+    return;
+  }
+  init (m_idFilter, m_idFilterMethod, bw, signalIncrement, nSignalPoints, param, m_idDomain, m_idFrequencyFilter, zeropad, preinterpolationFactor);
 }
 
-SignalFilter::SignalFilter (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double param, const int domainID, int zeropad = 0, int preinterpolationFactor = 1)
+SignalFilter::SignalFilter (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double param, const int domainID, int frequencyFilterID, int zeropad = 0, int preinterpolationFactor = 1)
   : m_vecFilter(NULL), m_vecFourierCosTable(NULL), m_vecFourierSinTable(NULL), m_fail(false)
 {
-  init (filterID, filterMethodID, bw, signalIncrement, nSignalPoints, param, domainID, zeropad, preinterpolationFactor);
+  init (filterID, filterMethodID, bw, signalIncrement, nSignalPoints, param, domainID, frequencyFilterID, zeropad, preinterpolationFactor);
 }
 
 SignalFilter::SignalFilter (const char* filterName, const char* domainName, double bw, double param)
@@ -192,13 +216,14 @@ SignalFilter::SignalFilter (const char* filterName, const char* domainName, doub
 }
 
 void
-SignalFilter::init (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double filterParam, const int domainID, int zeropad, int preinterpolationFactor)
+SignalFilter::init (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double filterParam, const int domainID, const int frequencyFilterID, int zeropad, int preinterpolationFactor)
 {
   m_bw = bw;
   m_idFilter = filterID;
   m_idDomain = domainID;
   m_idFilterMethod = filterMethodID;
-  if (m_idFilter == FILTER_INVALID || m_idDomain == DOMAIN_INVALID || m_idFilterMethod == FILTER_METHOD_INVALID) {
+  m_idFrequencyFilter = frequencyFilterID;
+  if (m_idFilter == FILTER_INVALID || m_idDomain == DOMAIN_INVALID || m_idFilterMethod == FILTER_METHOD_INVALID || m_idFrequencyFilter == FREQUENCY_FILTER_INVALID) {
     m_fail = true;
     return;
   }
@@ -206,6 +231,7 @@ SignalFilter::init (const int filterID, const int filterMethodID, double bw, dou
   m_nameFilter = convertFilterIDToName (m_idFilter);
   m_nameDomain = convertDomainIDToName (m_idDomain);
   m_nameFilterMethod = convertFilterMethodIDToName (m_idFilterMethod);
+  m_nameFrequencyFilter = convertFrequencyFilterIDToName (m_idFrequencyFilter);
   m_nSignalPoints = nSignalPoints;
   m_signalInc = signalIncrement;
   m_filterParam = filterParam;  
@@ -466,6 +492,42 @@ SignalFilter::convertDomainIDToTitle (const int domainID)
   return (title);
 }
 
+int
+SignalFilter::convertFrequencyFilterNameToID (const char* const ffName)
+{
+  int ffID = FREQUENCY_FILTER_INVALID;
+
+  for (int i = 0; i < s_iFrequencyFilterCount; i++)
+   if (strcasecmp (ffName, s_aszFrequencyFilterName[i]) == 0) {
+      ffID = i;
+      break;
+    }
+
+  return (ffID);
+}
+
+const char *
+SignalFilter::convertFrequencyFilterIDToName (const int ffID)
+{
+  static const char *name = "";
+
+  if (ffID >= 0 && ffID < s_iFrequencyFilterCount)
+      return (s_aszFrequencyFilterName [ffID]);
+
+  return (name);
+}
+
+const char *
+SignalFilter::convertFrequencyFilterIDToTitle (const int ffID)
+{
+  static const char *name = "";
+
+  if (ffID >= 0 && ffID < s_iFrequencyFilterCount)
+      return (s_aszFrequencyFilterTitle [ffID]);
+
+  return (name);
+}
+
 void
 SignalFilter::filterSignal (const float input[], double output[]) const
 {