r4128 - in trunk/bse: . tests



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]