changeset 367:0721657fdd1d

Fix scaling on downsampling, another test
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 14 Oct 2013 16:20:00 +0100
parents 767947956fc1
children ee8ace7fdc88
files dsp/rateconversion/Resampler.cpp dsp/rateconversion/TestResampler.cpp
diffstat 2 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/dsp/rateconversion/Resampler.cpp	Mon Oct 14 16:15:32 2013 +0100
+++ b/dsp/rateconversion/Resampler.cpp	Mon Oct 14 16:20:00 2013 +0100
@@ -163,9 +163,14 @@
     std::cerr << "process: buf siz " << m_buffer.size() << " filt siz for phase " << m_phase << " " << m_phaseData[m_phase].filter.size() << std::endl;
 #endif
 
+    double scaleFactor = 1.0;
+    if (m_targetRate < m_sourceRate) {
+	scaleFactor = double(m_targetRate) / double(m_sourceRate);
+    }
+
     while (outidx < maxout &&
 	   m_buffer.size() >= m_phaseData[m_phase].filter.size()) {
-	dst[outidx] = reconstructOne();
+	dst[outidx] = scaleFactor * reconstructOne();
 	outidx++;
     }
     
--- a/dsp/rateconversion/TestResampler.cpp	Mon Oct 14 16:15:32 2013 +0100
+++ b/dsp/rateconversion/TestResampler.cpp	Mon Oct 14 16:20:00 2013 +0100
@@ -119,6 +119,8 @@
 
 BOOST_AUTO_TEST_CASE(interpolatedSine)
 {
+    // Interpolating a sinusoid should give us a sinusoid, once we've
+    // dropped the first few samples
     double in[1000];
     double out[2000];
     for (int i = 0; i < 1000; ++i) {
@@ -127,7 +129,22 @@
     for (int i = 0; i < 2000; ++i) {
 	out[i] = sin(i * M_PI / 4.0);
     }
-    testResamplerOneShot(8, 16, 1000, in, 200, out, 400);
+    testResamplerOneShot(8, 16, 1000, in, 200, out, 512);
+}
+
+BOOST_AUTO_TEST_CASE(decimatedSine)
+{
+    // Decimating a sinusoid should give us a sinusoid, once we've
+    // dropped the first few samples
+    double in[2000];
+    double out[1000];
+    for (int i = 0; i < 2000; ++i) {
+	in[i] = sin(i * M_PI / 8.0);
+    }
+    for (int i = 0; i < 1000; ++i) {
+	out[i] = sin(i * M_PI / 4.0);
+    }
+    testResamplerOneShot(16, 8, 2000, in, 200, out, 256);
 }
 
 BOOST_AUTO_TEST_SUITE_END()