X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Ffilter.cpp;h=f86478653bbf4d93a814c66a51db717b93d289be;hp=3a0e1c799aad5d156e402653b0050b933890d51a;hb=9776c9a12ba53419d34563a5ec57c90e3d6798f4;hpb=a5139613f6b92aeb8db9daa87f021c78d17d82a5 diff --git a/libctsim/filter.cpp b/libctsim/filter.cpp index 3a0e1c7..f864786 100644 --- a/libctsim/filter.cpp +++ b/libctsim/filter.cpp @@ -7,9 +7,9 @@ ** Date Started: Aug 1984 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2000 Kevin Rosenberg ** -** $Id: filter.cpp,v 1.27 2000/08/22 16:49:56 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 @@ -30,39 +30,47 @@ 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_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 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"}, }; @@ -74,12 +82,12 @@ const int SignalFilter::DOMAIN_INVALID = -1; 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"}, }; @@ -364,12 +372,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); } @@ -436,12 +445,18 @@ SignalFilter::frequencyResponse (int filterID, double bw, double u, double param 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; @@ -488,9 +503,11 @@ SignalFilter::haveAnalyticSpatial (int filterID) 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; @@ -522,6 +539,9 @@ SignalFilter::spatialResponseAnalytic (int filterID, double bw, double x, double 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; @@ -531,6 +551,9 @@ SignalFilter::spatialResponseAnalytic (int filterID, double bw, double x, double 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)); @@ -558,30 +581,21 @@ SignalFilter::spatialResponseAnalytic (int filterID, double bw, double x, double } -/* 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 - */