** This is part of the CTSim program
** Copyright (c) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.36 2001/02/11 04:56:37 kevin Exp $
+** $Id: filter.cpp,v 1.38 2001/02/22 18:22:40 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::FILTER_INVALID = -1 ;
const int SignalFilter::FILTER_ABS_BANDLIMIT = 0; // filter times |x|
const int SignalFilter::FILTER_ABS_G_HAMMING = 1;
-const int SignalFilter::FILTER_ABS_COSINE = 2;
-const int SignalFilter::FILTER_ABS_SINC = 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 int SignalFilter::s_iReconstructFilterCount = 5;
-
-const char* SignalFilter::s_aszFilterName[] = {
+const int SignalFilter::FILTER_ABS_HANNING = 2;
+const int SignalFilter::FILTER_ABS_COSINE = 3;
+const int SignalFilter::FILTER_ABS_SINC = 4;
+const int SignalFilter::FILTER_SHEPP = 5;
+const int SignalFilter::FILTER_BANDLIMIT = 6;
+const int SignalFilter::FILTER_SINC = 7;
+const int SignalFilter::FILTER_G_HAMMING = 8;
+const int SignalFilter::FILTER_HANNING = 9;
+const int SignalFilter::FILTER_COSINE = 10;
+const int SignalFilter::FILTER_TRIANGLE = 11;
+
+const int SignalFilter::s_iReconstructFilterCount = 4;
+
+const char* const SignalFilter::s_aszFilterName[] = {
{"abs_bandlimit"},
{"abs_hamming"},
+ {"abs_hanning"},
{"abs_cosine"},
- {"abs_sinc"},
{"shepp"},
+ {"abs_sinc"},
{"bandlimit"},
{"sinc"},
{"hamming"},
+ {"hanning"},
{"cosine"},
{"triangle"},
};
-const char* SignalFilter::s_aszFilterTitle[] = {
+const char* const SignalFilter::s_aszFilterTitle[] = {
{"Abs(w) * Bandlimit"},
{"Abs(w) * Hamming"},
+ {"Abs(w) * Hanning"},
{"Abs(w) * Cosine"},
- {"Abs(w) * Sinc"},
{"Shepp"},
+ {"Abs(w) * Sinc"},
{"Bandlimit"},
{"Sinc"},
{"Hamming"},
+ {"Hanning"},
{"Cosine"},
{"Triangle"},
};
const int SignalFilter::DOMAIN_FREQUENCY = 0;
const int SignalFilter::DOMAIN_SPATIAL = 1;
-const char* SignalFilter::s_aszDomainName[] = {
+const char* const SignalFilter::s_aszDomainName[] = {
{"frequency"},
{"spatial"},
};
-const char* SignalFilter::s_aszDomainTitle[] = {
+const char* const SignalFilter::s_aszDomainTitle[] = {
{"Frequency"},
{"Spatial"},
};
case FILTER_ABS_SINC:
q = au * bw * sinc (PI * bw * u, 1.);
break;
+ case FILTER_HANNING:
+ param = 0.54;
+ // follow through to G_HAMMING
case FILTER_G_HAMMING:
if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = param + (1 - param) * cos (TWOPI * u / bw);
break;
+ case FILTER_ABS_HANNING:
+ param = 0.54;
+ // follow through to ABS_G_HAMMING
case FILTER_ABS_G_HAMMING:
if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
case FILTER_TRIANGLE:
case FILTER_COSINE:
case FILTER_G_HAMMING:
+ case FILTER_HANNING:
case FILTER_ABS_BANDLIMIT:
case FILTER_ABS_COSINE:
case FILTER_ABS_G_HAMMING:
+ case FILTER_ABS_HANNING:
case FILTER_SHEPP:
case FILTER_SINC:
haveAnalytic = true;
case FILTER_COSINE:
q = sinc(b-u,w) + sinc(b+u,w);
break;
+ case FILTER_HANNING:
+ param = 0.54;
+ // follow through to G_HAMMING
case FILTER_G_HAMMING:
q = 2 * param * sin(u*w)/u + (1-param) * (sinc(b2-u, w) + sinc(b2+u, w));
break;
case FILTER_ABS_COSINE:
q = integral_abscos(b-u,w) + integral_abscos(b+u,w);
break;
+ case FILTER_ABS_HANNING:
+ param = 0.54;
+ // follow through to ABS_G_HAMMING
case FILTER_ABS_G_HAMMING:
q = 2 * param * integral_abscos(u,w) +
(1-param)*(integral_abscos(u-b2,w)+integral_abscos(u+b2,w));