** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.20 2000/07/22 15:45:33 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
int SignalFilter::N_INTEGRAL=500; //static member
const int SignalFilter::FILTER_INVALID = -1 ;
-const int SignalFilter::FILTER_BANDLIMIT = 0;
-const int SignalFilter::FILTER_SINC = 1;
-const int SignalFilter::FILTER_G_HAMMING = 2;
-const int SignalFilter::FILTER_COSINE = 3;
-const int SignalFilter::FILTER_TRIANGLE = 4;
-const int SignalFilter::FILTER_ABS_BANDLIMIT = 5; // filter times |x = |
-const int SignalFilter::FILTER_ABS_SINC = 6;
-const int SignalFilter::FILTER_ABS_G_HAMMING = 7;
-const int SignalFilter::FILTER_ABS_COSINE = 8;
-const int SignalFilter::FILTER_SHEPP = 9;
+const int SignalFilter::FILTER_ABS_BANDLIMIT = 0; // filter times |x = |
+const int SignalFilter::FILTER_ABS_SINC = 1;
+const int SignalFilter::FILTER_ABS_G_HAMMING = 2;
+const int SignalFilter::FILTER_ABS_COSINE = 3;
+const int SignalFilter::FILTER_SHEPP = 4;
+const int SignalFilter::FILTER_BANDLIMIT = 5;
+const int SignalFilter::FILTER_SINC = 6;
+const int SignalFilter::FILTER_G_HAMMING = 7;
+const int SignalFilter::FILTER_COSINE = 8;
+const int SignalFilter::FILTER_TRIANGLE = 9;
const char* SignalFilter::s_aszFilterName[] = {
- {"bandlimit"},
- {"sinc"},
- {"hamming"},
- {"cosine"},
- {"triangle"},
{"abs_bandlimit"},
{"abs_sinc"},
{"abs_hamming"},
{"abs_cosine"},
{"shepp"},
+ {"bandlimit"},
+ {"sinc"},
+ {"hamming"},
+ {"cosine"},
+ {"triangle"},
};
const char* SignalFilter::s_aszFilterTitle[] = {
- {"Bandlimit"},
- {"Sinc"},
- {"Hamming"},
- {"Cosine"},
- {"Triangle"},
{"Abs(w) * Bandlimit"},
{"Abs(w) * Sinc"},
{"Abs(w) * Hamming"},
{"Abs(w) * Cosine"},
{"Shepp"},
+ {"Bandlimit"},
+ {"Sinc"},
+ {"Hamming"},
+ {"Cosine"},
+ {"Triangle"},
};
const int SignalFilter::s_iFilterCount = sizeof(s_aszFilterName) / sizeof(const char*);
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_vecFilter = NULL;
- m_vecFourierCosTable = NULL;
- m_vecFourierSinTable = NULL;
m_idFilter = convertFilterNameToID (filterName);
if (m_idFilter == FILTER_INVALID) {
m_fail = true;
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)
+ : m_vecFilter(NULL), m_vecFourierCosTable(NULL), m_vecFourierSinTable(NULL), m_fail(false)
{
m_bw = bw;
m_nSignalPoints = 0;
m_nFilterPoints = 0;
- m_vecFilter = NULL;
- m_vecFourierCosTable = NULL;
- m_vecFourierSinTable = NULL;
m_filterParam = param;
m_idFilter = convertFilterNameToID (filterName);
if (m_idFilter == FILTER_INVALID) {
}
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_fail = false;
+ m_nameFrequencyFilter = convertFrequencyFilterIDToName (m_idFrequencyFilter);
m_nSignalPoints = nSignalPoints;
m_signalInc = signalIncrement;
m_filterParam = filterParam;
} else if (m_idDomain == DOMAIN_SPATIAL) {
double x;
int i;
- for (x = m_filterMin, i = 0; i < m_nFilterPoints; x += m_filterInc, i++)
+ for (x = m_filterMin, i = 0; i < m_nFilterPoints; x += m_filterInc, i++) {
if (haveAnalyticSpatial(m_idFilter))
m_vecFilter[i] = spatialResponseAnalytic (x, m_filterParam);
else
m_vecFilter[i] = spatialResponseCalc (x, m_filterParam);
+#if LIMIT_BANDWIDTH_TRIAL
+ if (i < m_nFilterPoints / 4 || i > (m_nFilterPoints * 3) / 4)
+ m_vecFilter[i] = 0;
+#endif
+ }
} else {
m_failMessage = "Illegal domain name ";
m_failMessage += m_idDomain;
int filterID = FILTER_INVALID;
for (int i = 0; i < s_iFilterCount; i++)
- if (strcasecmp (filterName, s_aszFilterName[i]) == 0) {
- filterID = i;
- break;
- }
+ if (strcasecmp (filterName, s_aszFilterName[i]) == 0) {
+ filterID = i;
+ break;
+ }
return (filterID);
}
static const char *name = "";
if (fmID >= 0 && fmID < s_iFilterMethodCount)
- return (s_aszFilterName [fmID]);
+ return (s_aszFilterMethodName [fmID]);
return (name);
}
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
{