X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Ffilter.cpp;h=5a4b0ef5fdccb6889b8b5012fb11a474c9f93630;hb=fd1d136a94a6d20013f38d6a997bdfefad0f5e98;hp=941d905ea76512f78814763a11ce62bd5de2b02a;hpb=2a39ee3b125e3e2e68bbba2ac15a65039456ff7e;p=ctsim.git diff --git a/libctsim/filter.cpp b/libctsim/filter.cpp index 941d905..5a4b0ef 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.26 2000/08/22 07:02:48 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 @@ -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 (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); @@ -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 (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));