# HG changeset patch # User Chris Cannam # Date 1381764000 -3600 # Node ID 0721657fdd1deb2d01bc6e604dcbfed20b0e00ee # Parent 767947956fc1e924fcda687c2325207c7f7b9086 Fix scaling on downsampling, another test diff -r 767947956fc1 -r 0721657fdd1d dsp/rateconversion/Resampler.cpp --- 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++; } diff -r 767947956fc1 -r 0721657fdd1d dsp/rateconversion/TestResampler.cpp --- 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()