changeset 148:9db2712b3ce4

Avoid int overflow in resample; tidy
author Chris Cannam
date Fri, 18 Oct 2013 11:11:41 +0100
parents c1e98c18628a
children 734e5fa6f731
files dsp/rateconversion/Resampler.cpp dsp/rateconversion/TestResampler.cpp
diffstat 2 files changed, 13 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/dsp/rateconversion/Resampler.cpp	Thu Oct 17 22:12:36 2013 +0100
+++ b/dsp/rateconversion/Resampler.cpp	Fri Oct 18 11:11:41 2013 +0100
@@ -70,28 +70,7 @@
 	for (int i = 0; i < m_filterLength; ++i) filter[i] = 1.0;
 	sw.cut(filter.data());
 	kw.cut(filter.data());
-/*
-        std::cerr << "sinc for " << params.length << ", " << params.beta 
-                  << ": ";
-        for (int i = 0; i < 10; ++i) {
-            std::cerr << sw.getWindow()[i] << " ";
-        }
-        std::cerr << std::endl;
 
-        std::cerr << "kaiser for " << params.length << ", " << params.beta 
-                  << ": ";
-        for (int i = 0; i < 10; ++i) {
-            std::cerr << kw.getWindow()[i] << " ";
-        }
-        std::cerr << std::endl;
-
-        std::cerr << "filter for " << params.length << ", " << params.beta 
-                  << ": ";
-        for (int i = 0; i < 10; ++i) {
-            std::cerr << filter[i] << " ";
-        }
-        std::cerr << std::endl;
-*/
 	knownFilters[peakToPole][m_filterLength][params.beta] = filter;
     }
 
@@ -217,11 +196,7 @@
     // until the filter fills, then half the filter length at once) or
     // else have a lengthy declared latency on the output. We do the
     // latter. (What do other implementations do?)
-
-    int centreToEnd = (m_filterLength/2) + 1; // from centre of filter
-                                              // to first sample after
-                                              // filter end
-
+    //
     // We want to make sure the first "real" sample will eventually be
     // aligned with the centre sample in the filter (it's tidier, and
     // easier to do diagnostic calculations that way). So we need to
@@ -278,7 +253,7 @@
     double v = 0.0;
     int n = pd.filter.size();
 
-    assert(n + m_bufferOrigin <= m_buffer.size());
+    assert(n + m_bufferOrigin <= (int)m_buffer.size());
 
     const double *const __restrict__ buf = m_buffer.data() + m_bufferOrigin;
     const double *const __restrict__ filt = pd.filter.data();
@@ -341,7 +316,7 @@
     // padding input samples at the end of input to guarantee at
     // *least* the latency's worth of output samples. that is,
 
-    int inputPad = int(ceil(double(latency * sourceRate) / targetRate));
+    int inputPad = int(ceil((double(latency) * sourceRate) / targetRate));
 
     // that means we are providing this much input in total:
 
@@ -349,13 +324,13 @@
 
     // and obtaining this much output in total:
 
-    int m1 = int(ceil(double(n1 * targetRate) / sourceRate));
+    int m1 = int(ceil((double(n1) * targetRate) / sourceRate));
 
     // in order to return this much output to the user:
 
-    int m = int(ceil(double(n * targetRate) / sourceRate));
+    int m = int(ceil((double(n) * targetRate) / sourceRate));
     
-//    std::cerr << "n = " << n << ", sourceRate = " << sourceRate << ", targetRate = " << targetRate << ", m = " << m << ", latency = " << latency << ", m1 = " << m1 << ", n1 = " << n1 << ", n1 - n = " << n1 - n << std::endl;
+//    std::cerr << "n = " << n << ", sourceRate = " << sourceRate << ", targetRate = " << targetRate << ", m = " << m << ", latency = " << latency << ", inputPad = " << inputPad << ", m1 = " << m1 << ", n1 = " << n1 << ", n1 - n = " << n1 - n << std::endl;
 
     vector<double> pad(n1 - n, 0.0);
     vector<double> out(m1 + 1, 0.0);
--- a/dsp/rateconversion/TestResampler.cpp	Thu Oct 17 22:12:36 2013 +0100
+++ b/dsp/rateconversion/TestResampler.cpp	Fri Oct 18 11:11:41 2013 +0100
@@ -35,7 +35,7 @@
 	BOOST_CHECK_EQUAL(resampled.size(), m);
     }
     for (int i = 0; i < m; ++i) {
-	BOOST_CHECK_SMALL(resampled[i + skip] - expected[i], 1e-8);
+	BOOST_CHECK_SMALL(resampled[i + skip] - expected[i], 1e-6);
     }
 }
 
@@ -93,7 +93,7 @@
     delete[] outPadded;
     delete[] inPadded;
 }
-/*
+
 BOOST_AUTO_TEST_CASE(sameRateOneShot)
 {
     double d[] = { 0, 0.1, -0.3, -0.4, -0.3, 0, 0.5, 0.2, 0.8, -0.1 };
@@ -149,7 +149,7 @@
     }
     testResamplerOneShot(16, 8, 2000, in, 200, out, 256);
 }
-*/
+
 vector<double>
 squareWave(int rate, double freq, int n)
 {
@@ -172,12 +172,8 @@
     // One second of a square wave
     int freq = 500;
 
-    std::cerr << "inrate = " << inrate << ", outrate = " << outrate << ", freq * outrate / inrate = " << (double(freq) * double(outrate)) / double(inrate) << std::endl;
-
-    std::cerr << "making square wave... ";
     vector<double> square =
 	squareWave(inrate, freq, inrate);
-    std::cerr << "done" << std::endl;
 
     vector<double> maybeSquare = 
 	Resampler::resample(inrate, outrate, square.data(), square.size());
@@ -191,13 +187,13 @@
 
     vector<double> inSpectrum(inrate, 0.0);
     FFTReal(inrate).forwardMagnitude(square.data(), inSpectrum.data());
-    for (int i = 0; i < inSpectrum.size(); ++i) {
+    for (int i = 0; i < (int)inSpectrum.size(); ++i) {
 	inSpectrum[i] /= inrate;
     }
 
     vector<double> outSpectrum(outrate, 0.0);
     FFTReal(outrate).forwardMagnitude(maybeSquare.data(), outSpectrum.data());
-    for (int i = 0; i < outSpectrum.size(); ++i) {
+    for (int i = 0; i < (int)outSpectrum.size(); ++i) {
 	outSpectrum[i] /= outrate;
     }
 
@@ -213,8 +209,8 @@
 BOOST_AUTO_TEST_CASE(spectrum)
 {
     int rates[] = { 8000, 22050, 44100, 48000 };
-    for (int i = 0; i < sizeof(rates)/sizeof(rates[0]); ++i) {
-	for (int j = 0; j < sizeof(rates)/sizeof(rates[0]); ++j) {
+    for (int i = 0; i < (int)(sizeof(rates)/sizeof(rates[0])); ++i) {
+	    for (int j = 0; j < (int)(sizeof(rates)/sizeof(rates[0])); ++j) {
 	    testSpectrum(rates[i], rates[j]);
 	}
     }