r573: no message
[ctsim.git] / libctsim / filter.cpp
index f4a10f3186dbbeb6da08a3fbdc810ee11a4b8e27..f86478653bbf4d93a814c66a51db717b93d289be 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2000 Kevin Rosenberg
 **
-**  $Id: filter.cpp,v 1.36 2001/02/11 04:56:37 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
@@ -32,39 +32,45 @@ 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_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 int SignalFilter::s_iReconstructFilterCount = 5;
-
-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"},
 };
@@ -76,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"},
 };
@@ -439,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;
@@ -491,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;
@@ -525,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;
@@ -534,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));