** 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
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);
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;
}
}
SignalFilter::FilterID
SignalFilter::convertFilterNameToID (const char *filterName)
{
- FilterID filterID;
+ FilterID filterID = FILTER_INVALID;
if (strcasecmp (filterName, FILTER_BANDLIMIT_STR) == 0)
filterID = FILTER_BANDLIMIT;
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);
}
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);
}
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
*/
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