** 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
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
*
* 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);
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)
}
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;
}
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;
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
{