r4128 - in trunk/bse: . tests
- From: stw svn gnome org
- To: svn-commits-list gnome org
- Subject: r4128 - in trunk/bse: . tests
- Date: Mon, 4 Dec 2006 06:11:26 -0500 (EST)
Author: stw
Date: 2006-12-04 06:11:23 -0500 (Mon, 04 Dec 2006)
New Revision: 4128
Modified:
trunk/bse/ChangeLog
trunk/bse/bsedatahandle-fir.cc
trunk/bse/gsldatahandle.h
trunk/bse/tests/firhandle.cc
Log:
Mon Dec 4 12:03:19 2006 Stefan Wasterfeld <stefan space twc de>
* gsldatahandle.h:
* bsedatahandle-fir.cc: Added a function which computes the filter
response in dB, given a FIR handle and a frequency.
* tests/firhandle.cc: Test that theoretical filter response (computed
by bse_data_handle_fir_response_db) and scanned response match.
Modified: trunk/bse/ChangeLog
===================================================================
--- trunk/bse/ChangeLog 2006-12-04 01:51:11 UTC (rev 4127)
+++ trunk/bse/ChangeLog 2006-12-04 11:11:23 UTC (rev 4128)
@@ -1,3 +1,12 @@
+Mon Dec 4 12:03:19 2006 Stefan Wasterfeld <stefan space twc de>
+
+ * gsldatahandle.h:
+ * bsedatahandle-fir.cc: Added a function which computes the filter
+ response in dB, given a FIR handle and a frequency.
+
+ * tests/firhandle.cc: Test that theoretical filter response (computed
+ by bse_data_handle_fir_response_db) and scanned response match.
+
Mon Dec 4 02:42:56 2006 Tim Janik <timj gtk org>
* gslvorbis-enc.h, gslvorbis-enc.c: added gsl_vorbis_encoder_version()
Modified: trunk/bse/bsedatahandle-fir.cc
===================================================================
--- trunk/bse/bsedatahandle-fir.cc 2006-12-04 01:51:11 UTC (rev 4127)
+++ trunk/bse/bsedatahandle-fir.cc 2006-12-04 11:11:23 UTC (rev 4128)
@@ -30,6 +30,7 @@
using std::vector;
using std::min;
+typedef std::complex<double> Complex;
class DataHandleFir;
@@ -208,6 +209,20 @@
return source_state_length + m_history;
}
+ gdouble
+ compute_fir_response_db (double freq) const
+ {
+ Complex z = std::exp (Complex (0, freq * 2 * PI / gsl_data_handle_mix_freq (m_src_handle)));
+ Complex r = 0;
+
+ for (guint i = 0; i < m_a.size(); i++)
+ {
+ r /= z;
+ r += m_a[i];
+ }
+ return bse_db_from_factor (abs (r), -200);
+ }
+
static GslDataHandle*
dh_create (DataHandleFir *cxx_dh)
{
@@ -233,13 +248,13 @@
return NULL;
}
}
-private:
-/* for the "C" API (vtable) */
static DataHandleFir*
dh_cast (GslDataHandle *dhandle)
{
return static_cast<CDataHandleFir *> (dhandle)->cxx_dh;
}
+private:
+/* for the "C" API (vtable) */
static BseErrorType
dh_open (GslDataHandle *dhandle, GslDataHandleSetup *setup)
{
@@ -352,27 +367,8 @@
}
};
-
}
-#if 0 // debugging
- gfloat freq;
- for (freq = 0; freq < PI; freq += 0.01)
- {
- complex z = cexp (I * freq);
- complex r = 0;
-
- guint i;
- for (i = 0; i <= iorder; i++)
- {
- r /= z;
- r += a[i];
- }
- printf ("%f %f\n", freq, cabs (r));
- }
-#endif
-
-
using namespace Bse;
/**
@@ -416,3 +412,10 @@
DataHandleFir *cxx_dh = new DataHandleFirLowpass (src_handle, cutoff_freq, order);
return DataHandleFir::dh_create (cxx_dh);
}
+
+extern "C" gdouble
+bse_data_handle_fir_response_db (GslDataHandle *fir_handle,
+ gdouble freq)
+{
+ return DataHandleFir::dh_cast (fir_handle)->compute_fir_response_db (freq);
+}
Modified: trunk/bse/gsldatahandle.h
===================================================================
--- trunk/bse/gsldatahandle.h 2006-12-04 01:51:11 UTC (rev 4127)
+++ trunk/bse/gsldatahandle.h 2006-12-04 11:11:23 UTC (rev 4128)
@@ -126,8 +126,11 @@
GslDataHandle* bse_data_handle_new_fir_lowpass (GslDataHandle *src_handle, // implemented in bsedatahandle-fir.cc
gdouble cutoff_freq,
guint order);
+gdouble bse_data_handle_fir_response_db (GslDataHandle *fir_handle, // implemented in bsedatahandle-fir.cc
+ gdouble freq);
+
/* --- xinfo handling --- */
GslDataHandle* gsl_data_handle_new_add_xinfos (GslDataHandle *src_handle,
gchar **xinfos);
Modified: trunk/bse/tests/firhandle.cc
===================================================================
--- trunk/bse/tests/firhandle.cc 2006-12-04 01:51:11 UTC (rev 4127)
+++ trunk/bse/tests/firhandle.cc 2006-12-04 11:11:23 UTC (rev 4128)
@@ -197,13 +197,23 @@
double filtered_cos = gsl_data_handle_peek_value (fir_handle_cos, i, &peek_buffer_cos);
std::complex<double> filtered (filtered_sin, filtered_cos);
- // check frequency response
+ // compute frequency response
double level = abs (filtered);
+ double level_db = bse_db_from_factor (level, -200);
scanned_freq.push_back (sweep_freq[i]);
- scanned_level_db.push_back (bse_db_from_factor (level, -200));
+ scanned_level_db.push_back (level_db);
// printf ("%f %.17g\n", sweep_freq[i], scanned_level_db.back());
- // check phase response in passband
+ if ((i & 15) == 0)
+ {
+ // check that theoretical and scanned response match
+ double theoretical_level_db = bse_data_handle_fir_response_db (fir_handle_sin, sweep_freq[i]);
+ double theoretical_level = bse_db_to_factor (theoretical_level_db);
+ // printf ("%g %.17g\n", sweep_freq[i], fabs (level - theoretical_level));
+ TCHECK_CMP (fabs (level - theoretical_level), <, 0.00035);
+ }
+
+ // compute phase response
std::complex<double> orig (sweep_sin[i], sweep_cos[i]);
scanned_abs_phase_diff.push_back (fabs (phase_diff (arg (orig), arg (filtered))));
// printf ("%f %.17g\n", sweep_freq[i], scanned_abs_phase_diff.back());
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]