r4062 - in trunk/bse: . tests



Author: timj
Date: 2006-11-04 11:43:43 -0500 (Sat, 04 Nov 2006)
New Revision: 4062

Modified:
   trunk/bse/ChangeLog
   trunk/bse/bsefilter-ellf.c
   trunk/bse/bsefilter.cc
   trunk/bse/bsefilter.h
   trunk/bse/bsemath.h
   trunk/bse/tests/filtertest.cc
Log:
Sat Nov  4 17:38:28 2006  Tim Janik  <timj gtk org>                                                                                                           
                                                                                                                                                              
        * bsemath.h: don't include neither of the C++ <complex> or the C99                                                                                    
        <complex.h> header files. removed compat typedefs. we'll simply resort                                                                                
        to using BseComplex in headers and use <complex> in C++ files.                                                                                        
                                                                                                                                                              
        * bsefilter.h: use BseComplex for complex numbers in header files.                                                                                    
                                                                                                                                                              
        * bsefilter.cc: adaptions to BseComplex.                                                                                                              
                                                                                                                                                              
        * bsefilter-ellf.c: use BseComplex instead of C99 complex.                                                                                            
                                                                                                                                                              
        * tests/filtertest.cc: adaptions to BseComplex. fixed elliptic filter                                                                                 
        test to really use stopband_edges, not stopband_db.                                                                                                   
                                                                                                                                                              



Modified: trunk/bse/ChangeLog
===================================================================
--- trunk/bse/ChangeLog	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/ChangeLog	2006-11-04 16:43:43 UTC (rev 4062)
@@ -1,3 +1,18 @@
+Sat Nov  4 17:38:28 2006  Tim Janik  <timj gtk org>
+
+	* bsemath.h: don't include neither of the C++ <complex> or the C99
+	<complex.h> header files. removed compat typedefs. we'll simply resort
+	to using BseComplex in headers and use <complex> in C++ files.
+
+	* bsefilter.h: use BseComplex for complex numbers in header files.
+
+	* bsefilter.cc: adaptions to BseComplex.
+
+	* bsefilter-ellf.c: use BseComplex instead of C99 complex.
+
+	* tests/filtertest.cc: adaptions to BseComplex. fixed elliptic filter
+	test to really use stopband_edges, not stopband_db.
+
 Fri Nov  3 02:19:09 2006  Tim Janik  <timj gtk org>
 
 	* bsefilter.h, bsefilter.cc: removed transfer funciton nominator and

Modified: trunk/bse/bsefilter-ellf.c
===================================================================
--- trunk/bse/bsefilter-ellf.c	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/bsefilter-ellf.c	2006-11-04 16:43:43 UTC (rev 4062)
@@ -191,10 +191,10 @@
     {
       double a = ds.zcpz[i].r, b = ds.zcpz[i].i;
       if (b >= 0.0)
-        fid->zp[fid->n_poles++] = a + I * b;
+        fid->zp[fid->n_poles++] = bse_complex (a, b);
       a = ds.zcpz[ds.n_solved_poles + i].r, b = ds.zcpz[ds.n_solved_poles + i].i;
       if (b >= 0.0)
-        fid->zz[fid->n_zeros++] = a + I * b;
+        fid->zz[fid->n_zeros++] = bse_complex (a, b);
     }
   for (i = 0; i <= fid->order; i++)
     {
@@ -1599,45 +1599,34 @@
                ds->numerator_accu / ds->denominator_accu * ds->gain_scale);
 #endif
   /* calculate gain by evaluating poles and zeros */
+  BseComplex z;
   switch (ifr->type)
     {
-      Complex z, num, den;
-      uint i;
     case BSE_IIR_FILTER_LOW_PASS:
     case BSE_IIR_FILTER_BAND_STOP:
     case BSE_IIR_FILTER_HIGH_PASS:
       if (ifr->type == BSE_IIR_FILTER_HIGH_PASS)
-        z = -1 + I * 0;
+        z = bse_complex (-1, 0);
       else
-        z = +1 + I * 0;
-      num = 1;
-      den = 1;
-      for (i = 0; i < ds->n_solved_poles; i++)
-        {
-          const Complex zero = ds->zcpz[ds->n_solved_poles + i].r + I * ds->zcpz[ds->n_solved_poles + i].i;
-          const Complex pole = ds->zcpz[i].r + I * ds->zcpz[i].i;
-          num = num * (z - zero);
-          den = den * (z - pole);
-        }
-      ds->numerator_accu = cabs (num);
-      ds->denominator_accu = cabs (den);
+        z = bse_complex (+1, 0);
       break;
     case BSE_IIR_FILTER_BAND_PASS:
       /* cgam = cos (band_pass_center_frequency) */
-      z = ds->cgam + I * sin (PIO2 - asin (ds->cgam)); /* PI/2 - asin (cgam) = acos (cgam) = band-center-frequency */
-      num = 1;
-      den = 1;
-      for (i = 0; i < ds->n_solved_poles; i++)
-        {
-          const Complex zero = ds->zcpz[ds->n_solved_poles + i].r + I * ds->zcpz[ds->n_solved_poles + i].i;
-          const Complex pole = ds->zcpz[i].r + I * ds->zcpz[i].i;
-          num = num * (z - zero);
-          den = den * (z - pole);
-        }
-      ds->numerator_accu = cabs (num);
-      ds->denominator_accu = cabs (den);
+      z = bse_complex (ds->cgam, sin (PIO2 - asin (ds->cgam))); /* PI/2 - asin (cgam) = acos (cgam) = band-center-frequency */
       break;
     }
+  BseComplex num = bse_complex (+1, 0);
+  BseComplex den = bse_complex (+1, 0);
+  uint i;
+  for (i = 0; i < ds->n_solved_poles; i++)
+    {
+      const BseComplex zero = bse_complex (ds->zcpz[ds->n_solved_poles + i].r, ds->zcpz[ds->n_solved_poles + i].i);
+      const BseComplex pole = bse_complex (ds->zcpz[i].r, ds->zcpz[i].i);
+      num = bse_complex_mul (num, bse_complex_sub (z, zero));
+      den = bse_complex_mul (den, bse_complex_sub (z, pole));
+    }
+  ds->numerator_accu = bse_complex_abs (num);
+  ds->denominator_accu = bse_complex_abs (den);
   ellf_debugf ("FILTERGAIN-bse:  %.17g / %.17g * scale = %.17g\n", ds->numerator_accu, ds->denominator_accu,
                ds->numerator_accu / ds->denominator_accu * ds->gain_scale);
   return 0;

Modified: trunk/bse/bsefilter.cc
===================================================================
--- trunk/bse/bsefilter.cc	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/bsefilter.cc	2006-11-04 16:43:43 UTC (rev 4062)
@@ -84,15 +84,15 @@
   for (uint i = 0; i < fid->n_zeros; i++)
     {
       String u ("Zero:");
-      u += " " + string_from_double (real (fid->zz[i]));
-      u += " + " + string_from_double (imag (fid->zz[i])) + "*i";
+      u += " " + string_from_double (fid->zz[i].re);
+      u += " + " + string_from_double (fid->zz[i].im) + "*i";
       s += "\n" + u;
     }
   for (uint i = 0; i < fid->n_poles; i++)
     {
       String u ("Pole:");
-      u += " " + string_from_double (real (fid->zp[i]));
-      u += " + " + string_from_double (imag (fid->zp[i])) + "*i";
+      u += " " + string_from_double (fid->zp[i].re);
+      u += " + " + string_from_double (fid->zp[i].im) + "*i";
       s += "\n" + u;
     }
   String u;

Modified: trunk/bse/bsefilter.h
===================================================================
--- trunk/bse/bsefilter.h	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/bsefilter.h	2006-11-04 16:43:43 UTC (rev 4062)
@@ -56,15 +56,15 @@
 #define BSE_IIR_CARRAY_SIZE		(4 * BSE_IIR_MAX_ORDER + 2) /* size of arrays used to store coefficients */
 
 typedef struct {
-  double  sampling_frequency;		/* same as BseIIRFilterRequest.sampling_frequency */
-  uint 	  order;
-  double  center_frequency;
+  double     sampling_frequency;		/* same as BseIIRFilterRequest.sampling_frequency */
+  uint 	     order;
+  double     center_frequency;
   /* z-plane poles and zeros */
-  double  gain;
-  uint    n_zeros;
-  Complex zz[BSE_IIR_CARRAY_SIZE / 2];	/* z-plane zeros [order] */
-  uint    n_poles;
-  Complex zp[BSE_IIR_CARRAY_SIZE / 2];	/* z-plane poles [order] */
+  double     gain;
+  uint       n_zeros;
+  BseComplex zz[BSE_IIR_CARRAY_SIZE / 2];	/* z-plane zeros [order] */
+  uint       n_poles;
+  BseComplex zp[BSE_IIR_CARRAY_SIZE / 2];	/* z-plane poles [order] */
   /* normalized z-plane transfer function */
   // double zn[BSE_IIR_CARRAY_SIZE];	/* numerator coefficients [order+1] */
   // double zd[BSE_IIR_CARRAY_SIZE];	/* denominator coefficients [order+1] */

Modified: trunk/bse/bsemath.h
===================================================================
--- trunk/bse/bsemath.h	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/bsemath.h	2006-11-04 16:43:43 UTC (rev 4062)
@@ -22,19 +22,6 @@
 
 #include <bse/bsedefs.h>
 #include <bse/bseieee754.h> 	/* provides math.h */
-#ifdef __cplusplus
-#include <complex>		/* C++ complex numbers */
-typedef std::complex<float>	  ComplexFloat;
-typedef std::complex<double>      ComplexDouble;
-typedef std::complex<long double> ComplexLongDouble;
-static const std::complex<float>  I (0, 1.0);
-#else
-#include <complex.h>		/* C99 complex numbers */
-typedef _Complex float		  ComplexFloat;
-typedef _Complex double           ComplexDouble;
-typedef _Complex long double      ComplexLongDouble;
-#endif
-typedef ComplexDouble Complex;
 
 G_BEGIN_DECLS
 

Modified: trunk/bse/tests/filtertest.cc
===================================================================
--- trunk/bse/tests/filtertest.cc	2006-11-04 16:37:39 UTC (rev 4061)
+++ trunk/bse/tests/filtertest.cc	2006-11-04 16:43:43 UTC (rev 4062)
@@ -25,7 +25,9 @@
 #include <bse/bseglobals.h> // FIXME
 #include "topconfig.h"
 #include <math.h>
+#include <complex>
 
+typedef std::complex<double> Complex;
 using namespace Birnet;
 using std::max;
 using std::min;
@@ -37,11 +39,11 @@
 }
 
 static inline uint
-complex_find_nearest (const Complex *zp,
-                      uint           n_zps,
-                      const Complex *zps)
+complex_find_nearest (const BseComplex *zp,
+                      uint              n_zps,
+                      const Complex    *zps)
 {
-  const Complex z = *zp;
+  const Complex z = Complex (zp->re, zp->im);
   uint j = 0;
   double last = sqr (real (z) - real (zps[j])) + sqr (imag (z) - imag (zps[j]));
   if (last == 0.0)
@@ -61,9 +63,9 @@
 }
 
 static double
-compare_zeros (uint           n_zeros,
-               const Complex *czeros,
-               const double  *rizeros)
+compare_zeros (uint              n_zeros,
+               const BseComplex *czeros,
+               const double     *rizeros)
 {
   Complex *z2 = (Complex*) alloca (sizeof (Complex) * n_zeros);
   for (uint i = 0; i < n_zeros; i++)
@@ -72,8 +74,8 @@
   for (uint i = 0; i < n_zeros; i++)
     {
       uint j = complex_find_nearest (&czeros[i], n_zeros - i, z2);
-      double reps = fabs (real (z2[j]) - real (czeros[i]));
-      double ieps = fabs (imag (z2[j]) - imag (czeros[i]));
+      double reps = fabs (real (z2[j]) - czeros[i].re);
+      double ieps = fabs (imag (z2[j]) - czeros[i].im);
       z2[j] = z2[n_zeros - i - 1]; // optimization of: swap (z2[last], z2[j]);
       max_eps = max (max_eps, max (reps, ieps));
     }
@@ -97,15 +99,15 @@
   Complex num (1, 0), den (1, 0);
   for (uint i = 0; i < fdes->n_zeros; i++)
     {
-      num = num * (z - fdes->zz[i]);
-      if (imag (fdes->zz[i]) != 0.0)
-        num = num * (z - conj (fdes->zz[i]));
+      num = num * (z - Complex (fdes->zz[i].re, fdes->zz[i].im));
+      if (fdes->zz[i].im != 0.0)
+        num = num * (z - std::conj (Complex (fdes->zz[i].re, fdes->zz[i].im)));
     }
   for (uint i = 0; i < fdes->n_poles; i++)
     {
-      den = den * (z - fdes->zp[i]);
-      if (imag (fdes->zp[i]) != 0.0)
-        den = den * (z - conj (fdes->zp[i]));
+      den = den * (z - Complex (fdes->zp[i].re, fdes->zp[i].im));
+      if (fdes->zp[i].im != 0.0)
+        den = den * (z - std::conj (Complex (fdes->zp[i].re, fdes->zp[i].im)));
     }
   Complex r = fdes->gain * num / den;
   double freq_magnitude = abs (r);
@@ -636,6 +638,7 @@
   /* generate filter requirements */
   filter_index = 0;
   frequest.kind = BSE_IIR_FILTER_ELLIPTIC;
+  frequest.stopband_edge = 0;
   for (oix = 0; oix < n_orders; oix++)
     for (pbe1 = 0.15; pbe1 <= 0.46; pbe1 += 0.15)
       {
@@ -667,6 +670,7 @@
   /* generate filter requirements */
   filter_index = 0;
   frequest.kind = BSE_IIR_FILTER_ELLIPTIC;
+  frequest.stopband_db = 0;
   for (oix = 0; oix < n_orders; oix++)
     for (pbe1 = 0.1; pbe1 <= 0.46; pbe1 += 0.15)
       {
@@ -709,7 +713,7 @@
   /* include predesigned filters */
 #include "filtercatalog.cc"
 
-  uint skip_count = 0, tick_count = 8;
+  uint skip_count = 0, tick_count = 3;
   if (sfi_init_settings().test_quick)
     {
       tick_count = 1;




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]