** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.26 2000/08/22 07:02:48 kevin Exp $
+** $Id: filter.cpp,v 1.34 2001/01/12 03:49:07 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;
+
return (y);
}
switch (filterID) {
case FILTER_BANDLIMIT:
- if (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0.;
else
q = 1;
break;
case FILTER_ABS_BANDLIMIT:
- if (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0.;
else
q = au;
break;
case FILTER_TRIANGLE:
- if (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = 1 - au / bw;
break;
case FILTER_COSINE:
- if (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = cos(PI * u / bw);
break;
case FILTER_ABS_COSINE:
- if (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ 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 (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ 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 (fabs(au) > fabs(bw / 2) + F_EPSILON)
+ if (fabs(au) >= fabs(bw / 2) + F_EPSILON)
q = 0;
else
q = au * (param + (1 - param) * cos(TWOPI * u / bw));
}
-/* NAME
- * sinc Return sin(x)/x function
- *
- * SYNOPSIS
- * v = sinc (x, mult)
- * double v sinc value
- * double x, mult
- *
- * DESCRIPTION
- * v = sin(x * mult) / x;
- */
+// Functions that are inline in filter.h
+
+
+// sinc Return sin(x)/x function
+// v = sinc (x, mult)
+// Calculates sin(x * mult) / x;
+
+// integral_abscos Returns integral of u*cos(u)
+//
+// q = integral_abscos (u, w)
+// double q Integral value
+// double u Integration variable
+// double w Upper integration boundary
+// Returns the value of integral of u*cos(u)*dV for V = 0 to w
-/* NAME
- * integral_abscos Returns integral of u*cos(u)
- *
- * SYNOPSIS
- * q = integral_abscos (u, w)
- * double q Integral value
- * double u Integration variable
- * double w Upper integration boundary
- *
- * DESCRIPTION
- * Returns the value of integral of u*cos(u)*dV for V = 0 to w
- */