r4062 - in trunk/bse: . tests
- From: timj svn gnome org
- To: svn-commits-list gnome org
- Subject: r4062 - in trunk/bse: . tests
- Date: Sat, 4 Nov 2006 11:43:44 -0500 (EST)
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]