r4107 - in trunk/bse: . tests



Author: stw
Date: 2006-11-26 13:14:33 -0500 (Sun, 26 Nov 2006)
New Revision: 4107

Added:
   trunk/bse/tests/firhandle.cc
Modified:
   trunk/bse/ChangeLog
   trunk/bse/bsedatahandle-fir.cc
   trunk/bse/tests/Makefile.am
Log:
Sun Nov 26 19:08:01 2006  Stefan Westerfeld  <stefan space twc de>

	* tests/Makefile.am:
	* tests/firhandle.cc: Created test for the fir highpass handle.

	* bsedatahandle-fir.cc: Fixed parameters passed to coefficient design
	function. Filters have the right cutoff frequency now.


Modified: trunk/bse/ChangeLog
===================================================================
--- trunk/bse/ChangeLog	2006-11-26 15:51:59 UTC (rev 4106)
+++ trunk/bse/ChangeLog	2006-11-26 18:14:33 UTC (rev 4107)
@@ -1,3 +1,11 @@
+Sun Nov 26 19:08:01 2006  Stefan Westerfeld  <stefan space twc de>
+
+	* tests/Makefile.am:
+	* tests/firhandle.cc: Created test for the fir highpass handle.
+
+	* bsedatahandle-fir.cc: Fixed parameters passed to coefficient design
+	function. Filters have the right cutoff frequency now.
+
 Sun Nov 26 16:32:00 2006  Stefan Westerfeld  <stefan space twc de>
 
 	* Makefile.am: Added bsedatahandle-fir.cc.

Modified: trunk/bse/bsedatahandle-fir.cc
===================================================================
--- trunk/bse/bsedatahandle-fir.cc	2006-11-26 15:51:59 UTC (rev 4106)
+++ trunk/bse/bsedatahandle-fir.cc	2006-11-26 18:14:33 UTC (rev 4107)
@@ -64,7 +64,7 @@
   transfer_func_freqs[3]  = PI;
   transfer_func_values[3] = 1.0; // 0 dB
 
-  gsl_filter_fir_approx (iorder, a, transfer_func_length, transfer_func_freqs, transfer_func_values, TRUE);
+  gsl_filter_fir_approx (iorder, a, transfer_func_length, transfer_func_freqs, transfer_func_values, false);
 
 #if 0 // debugging
   gfloat freq;
@@ -147,7 +147,7 @@
   
   /* apply fir filter to new memory buffer */
   gfloat *dest_values = g_new (gfloat, src_handle_n_values);
-  fir_hp (src_values, src_handle_n_values, dest_values, cutoff_freq / src_handle_mix_freq, order);
+  fir_hp (src_values, src_handle_n_values, dest_values, cutoff_freq * 2 * M_PI / src_handle_mix_freq, order);
   g_free (src_values);
   
   /* create a mem handle with filtered data */

Modified: trunk/bse/tests/Makefile.am
===================================================================
--- trunk/bse/tests/Makefile.am	2006-11-26 15:51:59 UTC (rev 4106)
+++ trunk/bse/tests/Makefile.am	2006-11-26 18:14:33 UTC (rev 4107)
@@ -49,3 +49,7 @@
 PERFTESTS             += resamplehandle
 resamplehandle_SOURCES = resamplehandle.cc
 resamplehandle_LDADD   = $(progs_ldadd)
+
+TESTS                 += firhandle
+firhandle_SOURCES      = firhandle.cc
+firhandle_LDADD        = $(progs_ldadd)

Added: trunk/bse/tests/firhandle.cc
===================================================================
--- trunk/bse/tests/firhandle.cc	2006-11-26 15:51:59 UTC (rev 4106)
+++ trunk/bse/tests/firhandle.cc	2006-11-26 18:14:33 UTC (rev 4107)
@@ -0,0 +1,130 @@
+/* BSE - Bedevilled Sound Engine
+ * Copyright (C) 2006 Stefan Westerfeld
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <bse/bsedefs.h>
+// #define TEST_VERBOSE
+#include <sfi/sfitests.h>
+#include <bse/gsldatahandle.h>
+#include <bse/gsldatautils.h>
+#include <bse/bsemain.h>
+#include "topconfig.h"
+#include <math.h>
+#include <complex>
+#include <vector>
+
+using std::vector;
+using std::min;
+using std::max;
+
+void
+test_highpass_with_sine_sweep()
+{
+  TSTART ("Highpass Handle");
+  vector<float> sweep_sin (50000);
+  vector<float> sweep_cos (50000);
+  vector<double> sweep_freq (50000);
+
+  const double start_freq = 50;
+  const double end_freq = 24000;
+  const double mix_freq = 48000;
+  const double octaves = log (end_freq / start_freq) / log (2);
+
+  double phase = 0; 
+
+  for (size_t i = 0; i < sweep_sin.size(); i++)
+    {
+      sweep_sin[i] = sin (phase);
+      sweep_cos[i] = cos (phase);
+      sweep_freq[i] = pow (2.0, (i * octaves) / sweep_sin.size()) * start_freq;
+      phase += sweep_freq[i] / mix_freq * 2.0 * M_PI;
+      if (phase > 2.0 * M_PI)
+	phase -= 2.0 * M_PI;
+    }
+
+  /* FIXME: handle n_channels != 1 */
+  GslDataHandle *ihandle_sin = gsl_data_handle_new_mem (1, 32, mix_freq, 440, sweep_sin.size(), &sweep_sin[0], NULL);
+  GslDataHandle *ihandle_cos = gsl_data_handle_new_mem (1, 32, mix_freq, 440, sweep_cos.size(), &sweep_cos[0], NULL);
+
+  const int order = 64;
+  GslDataHandle *fir_handle_sin = gsl_data_handle_new_fir_highpass (ihandle_sin, 9000.0, order);
+  GslDataHandle *fir_handle_cos = gsl_data_handle_new_fir_highpass (ihandle_cos, 9000.0, order);
+
+  BseErrorType error;
+  error = gsl_data_handle_open (fir_handle_sin);
+  TASSERT (error == 0);
+  error = gsl_data_handle_open (fir_handle_cos);
+  TASSERT (error == 0);
+
+  GslDataPeekBuffer peek_buffer_sin = { +1 /* incremental direction */, 0, };
+  GslDataPeekBuffer peek_buffer_cos = { +1 /* incremental direction */, 0, };
+
+  double stop_min_db = 1e19, stop_max_db = -1e19;
+  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;
+  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);
+      double filtered_cos = gsl_data_handle_peek_value (fir_handle_cos, i, &peek_buffer_cos);
+      std::complex<double> filtered (filtered_sin, filtered_cos);
+      double level = abs (filtered);
+      double level_db = bse_db_from_factor (level, -200);
+
+      if (sweep_freq[i] < 7050)
+	{
+	  stop_min_db = min (stop_min_db, level_db);
+	  stop_max_db = max (stop_max_db, level_db);
+	}
+      if (sweep_freq[i] > 7050 && sweep_freq[i] < 9500)
+	{
+	  trans_min_db = min (trans_min_db, level_db);
+	  trans_max_db = max (trans_max_db, level_db);
+	}
+      if (sweep_freq[i] > 9500 && sweep_freq[i] < 11000)
+	{
+	  pass1_min_db = min (pass1_min_db, level_db);
+	  pass1_max_db = max (pass1_max_db, level_db);
+	}
+      if (sweep_freq[i] > 11000)
+	{
+	  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));
+    }
+#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);
+#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);
+  TDONE();
+}
+
+int
+main (int    argc,
+      char **argv)
+{
+  bse_init_test (&argc, &argv, NULL);
+  test_highpass_with_sine_sweep();
+  return 0;
+}




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