** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.25 2000/08/19 22:59:06 kevin Exp $
+** $Id: filter.cpp,v 1.32 2000/12/04 19:50:57 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_SINC = 1;
-const int SignalFilter::FILTER_ABS_G_HAMMING = 2;
-const int SignalFilter::FILTER_ABS_COSINE = 3;
+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 char* SignalFilter::s_aszFilterName[] = {
{"abs_bandlimit"},
- {"abs_sinc"},
{"abs_hamming"},
{"abs_cosine"},
+ {"abs_sinc"},
{"shepp"},
{"bandlimit"},
{"sinc"},
const char* SignalFilter::s_aszFilterTitle[] = {
{"Abs(w) * Bandlimit"},
- {"Abs(w) * Sinc"},
{"Abs(w) * Hamming"},
{"Abs(w) * Cosine"},
+ {"Abs(w) * Sinc"},
{"Shepp"},
{"Bandlimit"},
{"Sinc"},
double zinc = (zmax - zmin) / (n - 1);
double z = zmin;
- double q [n];
+ double* q = new double [n];
for (int i = 0; i < n; i++, z += zinc)
q[i] = frequencyResponse (filterID, bw, z, param) * cos (TWOPI * z * x);
double y = 2 * integrateSimpson (zmin, zmax, q, n);
-
+ delete q;\r
+
return (y);
}
switch (filterID) {
case FILTER_BANDLIMIT:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0.;
else
q = 1;
break;
case FILTER_ABS_BANDLIMIT:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0.;
else
q = au;
break;
case FILTER_TRIANGLE:
- if (au >= bw)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = 1 - au / bw;
break;
case FILTER_COSINE:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = cos(PI * u / bw);
break;
case FILTER_ABS_COSINE:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = au * cos(PI * u / bw);
q = au * bw * sinc (PI * bw * u, 1.);
break;
case FILTER_G_HAMMING:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = param + (1 - param) * cos (TWOPI * u / bw);
break;
case FILTER_ABS_G_HAMMING:
- if (au >= bw / 2)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = au * (param + (1 - param) * cos(TWOPI * u / bw));