r348: fix linefeed problem
[ctsim.git] / libctsim / filter.cpp
index 941d905ea76512f78814763a11ce62bd5de2b02a..60f97c8e9b7f27319a3fc1a0dcb088f06e360b00 100644 (file)
@@ -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.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 (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));