X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Ffilter.cpp;h=60f97c8e9b7f27319a3fc1a0dcb088f06e360b00;hb=23f5654dacb1952c15bda92c2606fae3a55e48ad;hp=a88fad5a51c3cb1a663908a81b22dc95f8f7d07b;hpb=e36dfad3f0818b4c3457fbe7277faa6f4ca28dfe;p=ctsim.git diff --git a/libctsim/filter.cpp b/libctsim/filter.cpp index a88fad5..60f97c8 100644 --- a/libctsim/filter.cpp +++ b/libctsim/filter.cpp @@ -9,7 +9,7 @@ ** 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.33 2001/01/02 16:02:13 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 @@ -31,9 +31,9 @@ int SignalFilter::N_INTEGRAL=500; //static member 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; @@ -43,9 +43,9 @@ const int SignalFilter::FILTER_TRIANGLE = 9; const char* SignalFilter::s_aszFilterName[] = { {"abs_bandlimit"}, - {"abs_sinc"}, {"abs_hamming"}, {"abs_cosine"}, + {"abs_sinc"}, {"shepp"}, {"bandlimit"}, {"sinc"}, @@ -56,9 +56,9 @@ const char* SignalFilter::s_aszFilterName[] = { const char* SignalFilter::s_aszFilterTitle[] = { {"Abs(w) * Bandlimit"}, - {"Abs(w) * Sinc"}, {"Abs(w) * Hamming"}, {"Abs(w) * Cosine"}, + {"Abs(w) * Sinc"}, {"Shepp"}, {"Bandlimit"}, {"Sinc"}, @@ -364,12 +364,13 @@ SignalFilter::spatialResponseCalc (int filterID, double bw, double x, double par 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); } @@ -401,31 +402,31 @@ SignalFilter::frequencyResponse (int filterID, double bw, double u, double param 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); @@ -437,13 +438,13 @@ SignalFilter::frequencyResponse (int filterID, double bw, double u, double param 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));