r4108 - in trunk/bse: . tests
- From: stw svn gnome org
- To: svn-commits-list gnome org
- Subject: r4108 - in trunk/bse: . tests
- Date: Mon, 27 Nov 2006 09:24:15 -0500 (EST)
Author: stw
Date: 2006-11-27 09:24:02 -0500 (Mon, 27 Nov 2006)
New Revision: 4108
Modified:
trunk/bse/ChangeLog
trunk/bse/tests/firhandle.cc
Log:
Mon Nov 27 15:19:47 2006 Stefan Westerfeld <stefan space twc de>
* tests/firhandle.cc: Check that the filter is zero phase in the
passband (== no delay).
Modified: trunk/bse/ChangeLog
===================================================================
--- trunk/bse/ChangeLog 2006-11-26 18:14:33 UTC (rev 4107)
+++ trunk/bse/ChangeLog 2006-11-27 14:24:02 UTC (rev 4108)
@@ -1,3 +1,8 @@
+Mon Nov 27 15:19:47 2006 Stefan Westerfeld <stefan space twc de>
+
+ * tests/firhandle.cc: Check that the filter is zero phase in the
+ passband (== no delay).
+
Sun Nov 26 19:08:01 2006 Stefan Westerfeld <stefan space twc de>
* tests/Makefile.am:
Modified: trunk/bse/tests/firhandle.cc
===================================================================
--- trunk/bse/tests/firhandle.cc 2006-11-26 18:14:33 UTC (rev 4107)
+++ trunk/bse/tests/firhandle.cc 2006-11-27 14:24:02 UTC (rev 4108)
@@ -31,6 +31,22 @@
using std::min;
using std::max;
+double
+phase_diff (double p1,
+ double p2)
+{
+ double diff = p1 - p2;
+
+ // normalize to range [-pi..pi]
+ while (diff > M_PI)
+ diff -= 2 * M_PI;
+
+ while (diff < -M_PI)
+ diff += 2 * M_PI;
+
+ return diff;
+}
+
void
test_highpass_with_sine_sweep()
{
@@ -77,6 +93,7 @@
double trans_min_db = 1e19, trans_max_db = -1e19;
double pass1_min_db = 1e19, pass1_max_db = -1e19;
double pass2_min_db = 1e19, pass2_max_db = -1e19;
+ double phase_diff_max = 0;
for (size_t i = ((order + 2) / 2); i < sweep_sin.size() - ((order + 2) / 2); i++)
{
double filtered_sin = gsl_data_handle_peek_value (fir_handle_sin, i, &peek_buffer_sin);
@@ -85,6 +102,8 @@
double level = abs (filtered);
double level_db = bse_db_from_factor (level, -200);
+ // check frequency response
+ // printf ("%f %.17g\n", sweep_freq[i], level_db);
if (sweep_freq[i] < 7050)
{
stop_min_db = min (stop_min_db, level_db);
@@ -105,18 +124,28 @@
pass2_min_db = min (pass2_min_db, level_db);
pass2_max_db = max (pass2_max_db, level_db);
}
- // printf ("%f %f\n", sweep_freq[i], abs (filtered));
+
+ // check phase response in passband
+ std::complex<double> orig (sweep_sin[i], sweep_cos[i]);
+ double abs_phase_diff = fabs (phase_diff (arg (orig), arg (filtered)));
+ if (sweep_freq[i] > 11000)
+ {
+ phase_diff_max = max (phase_diff_max, abs_phase_diff);
+ // printf ("%f %.17g\n", sweep_freq[i], abs_phase_diff);
+ }
}
#if 0
printf ("stop = %f..%f dB\n", stop_min_db, stop_max_db);
printf ("trans = %f..%f dB\n", trans_min_db, trans_max_db);
printf ("pass1 = %f..%f dB\n", pass1_min_db, pass1_max_db);
printf ("pass2 = %f..%f dB\n", pass2_min_db, pass2_max_db);
+ printf ("max phase diff = %f\n", phase_diff_max);
#endif
TASSERT (stop_max_db < -75);
TASSERT (trans_min_db > -77 && trans_max_db < -2.8);
TASSERT (pass1_min_db > -2.82 && pass1_max_db < -0.002);
TASSERT (pass2_min_db > -0.004 && pass2_max_db < 0.002);
+ TASSERT (phase_diff_max < 0.0002);
TDONE();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]