changeset 176:5b1a1bbd6e7f

Make decimator quality selectable
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 28 Apr 2015 13:53:53 +0100
parents aa57e80b6af8
children 7d4f4c51a4ad
files cq/CQParameters.h src/ConstantQ.cpp src/dsp/Resampler.cpp
diffstat 3 files changed, 25 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/cq/CQParameters.h	Tue Apr 28 11:08:11 2015 +0100
+++ b/cq/CQParameters.h	Tue Apr 28 13:53:53 2015 +0100
@@ -48,6 +48,11 @@
 	Hann,
     };
 
+    enum DecimatorType {
+        BetterDecimator,
+        FasterDecimator
+    };
+    
     /**
      * Construct a set of parameters with the given input signal
      * sample rate, frequency range, and number of bins per
@@ -63,10 +68,11 @@
 	minFrequency(_minFrequency),
 	maxFrequency(_maxFrequency),
 	binsPerOctave(_binsPerOctave),
-	q(1.0),                    // Q scaling factor
-	atomHopFactor(0.25),       // hop size of shortest temporal atom
-	threshold(0.0005),         // sparsity threshold for resulting kernel
-	window(SqrtBlackmanHarris) // window shape
+	q(1.0),                     // Q scaling factor
+	atomHopFactor(0.25),        // hop size of shortest temporal atom
+	threshold(0.0005),          // sparsity threshold for resulting kernel
+	window(SqrtBlackmanHarris), // window shape
+        decimator(BetterDecimator)  // decimator quality setting
     { }
 
     /**
@@ -114,6 +120,11 @@
      * Window shape to use for the Constant-Q kernel atoms.
      */
     WindowType window;
+
+    /**
+     * Quality setting for the sample rate decimator.
+     */
+    DecimatorType decimator;
 };
 
 #endif
--- a/src/ConstantQ.cpp	Tue Apr 28 11:08:11 2015 +0100
+++ b/src/ConstantQ.cpp	Tue Apr 28 13:53:53 2015 +0100
@@ -122,8 +122,15 @@
 
         int factor = pow(2, i);
 
-        Resampler *r = new Resampler
-            (sourceRate, sourceRate / factor, 50, 0.05);
+        Resampler *r;
+
+        if (m_inparams.decimator == CQParameters::BetterDecimator) {
+            r = new Resampler
+                (sourceRate, sourceRate / factor, 50, 0.05);
+        } else {
+            r = new Resampler
+                (sourceRate, sourceRate / factor, 25, 0.3);
+        }                
 
 #ifdef DEBUG_CQ
         cerr << "forward: octave " << i << ": resample from " << sourceRate << " to " << sourceRate / factor << endl;
--- a/src/dsp/Resampler.cpp	Tue Apr 28 11:08:11 2015 +0100
+++ b/src/dsp/Resampler.cpp	Tue Apr 28 13:53:53 2015 +0100
@@ -318,9 +318,7 @@
 int
 Resampler::process(const double *src, double *dst, int n)
 {
-    for (int i = 0; i < n; ++i) {
-	m_buffer.push_back(src[i]);
-    }
+    m_buffer.insert(m_buffer.end(), src, src + n);
 
     int maxout = int(ceil(double(n) * m_targetRate / m_sourceRate));
     int outidx = 0;