diff dsp/rateconversion/Resampler.cpp @ 173:6a820c2a3eb2

Fixes to resampler frequency tests
author Chris Cannam
date Mon, 12 May 2014 17:56:08 +0100
parents 5f720340b0dd
children 6a634a9081a8
line wrap: on
line diff
--- a/dsp/rateconversion/Resampler.cpp	Sat May 10 13:41:06 2014 +0100
+++ b/dsp/rateconversion/Resampler.cpp	Mon May 12 17:56:08 2014 +0100
@@ -26,9 +26,11 @@
 
 using std::vector;
 using std::map;
+using std::cerr;
+using std::endl;
 
 //#define DEBUG_RESAMPLER 1
-//#define DEBUG_RESAMPLER_VERBOSE
+//#define DEBUG_RESAMPLER_VERBOSE 1
 
 Resampler::Resampler(int sourceRate, int targetRate) :
     m_sourceRate(sourceRate),
@@ -106,10 +108,10 @@
     int outputSpacing = m_sourceRate / m_gcd;
 
 #ifdef DEBUG_RESAMPLER
-    std::cerr << "resample " << m_sourceRate << " -> " << m_targetRate
+    cerr << "resample " << m_sourceRate << " -> " << m_targetRate
 	      << ": inputSpacing " << inputSpacing << ", outputSpacing "
 	      << outputSpacing << ": filter length " << m_filterLength
-	      << std::endl;
+	      << endl;
 #endif
 
     // Now we have a filter of (odd) length flen in which the lower
@@ -205,6 +207,19 @@
 	m_phaseData[phase] = p;
     }
 
+#ifdef DEBUG_RESAMPLER
+    int cp = 0;
+    int totDrop = 0;
+    for (int i = 0; i < inputSpacing; ++i) {
+        cerr << "phase = " << cp << ", drop = " << m_phaseData[cp].drop
+             << ", filter length = " << m_phaseData[cp].filter.size()
+             << ", next phase = " << m_phaseData[cp].nextPhase << endl;
+        totDrop += m_phaseData[cp].drop;
+        cp = m_phaseData[cp].nextPhase;
+    }
+    cerr << "total drop = " << totDrop << endl;
+#endif
+
     // The May implementation of this uses a pull model -- we ask the
     // resampler for a certain number of output samples, and it asks
     // its source stream for as many as it needs to calculate
@@ -266,8 +281,8 @@
     m_bufferOrigin = 0;
 
 #ifdef DEBUG_RESAMPLER
-    std::cerr << "initial phase " << m_phase << " (as " << (m_filterLength/2) << " % " << inputSpacing << ")"
-	      << ", latency " << m_latency << std::endl;
+    cerr << "initial phase " << m_phase << " (as " << (m_filterLength/2) << " % " << inputSpacing << ")"
+	      << ", latency " << m_latency << endl;
 #endif
 }
 
@@ -283,12 +298,12 @@
     const double *const __restrict__ buf = m_buffer.data() + m_bufferOrigin;
     const double *const __restrict__ filt = pd.filter.data();
 
-//    std::cerr << "phase = " << m_phase << ", drop = " << pd.drop << ", buffer for reconstruction starts...";
+//    cerr << "phase = " << m_phase << ", drop = " << pd.drop << ", buffer for reconstruction starts...";
 //    for (int i = 0; i < 20; ++i) {
-//        if (i % 5 == 0) std::cerr << "\n" << i << " ";
-//        std::cerr << buf[i] << " ";
+//        if (i % 5 == 0) cerr << "\n" << i << " ";
+//        cerr << buf[i] << " ";
 //    }
-//    std::cerr << std::endl;
+//    cerr << endl;
 
     for (int i = 0; i < n; ++i) {
 	// NB gcc can only vectorize this with -ffast-math
@@ -311,7 +326,7 @@
     int outidx = 0;
 
 #ifdef DEBUG_RESAMPLER
-    std::cerr << "process: buf siz " << m_buffer.size() << " filt siz for phase " << m_phase << " " << m_phaseData[m_phase].filter.size() << std::endl;
+    cerr << "process: buf siz " << m_buffer.size() << " filt siz for phase " << m_phase << " " << m_phaseData[m_phase].filter.size() << endl;
 #endif
 
     double scaleFactor = (double(m_targetRate) / m_gcd) / m_peakToPole;
@@ -328,18 +343,18 @@
     return outidx;
 }
     
-std::vector<double>
+vector<double>
 Resampler::process(const double *src, int n)
 {
     int maxout = int(ceil(double(n) * m_targetRate / m_sourceRate));
-    std::vector<double> out(maxout, 0.0);
+    vector<double> out(maxout, 0.0);
     int got = process(src, out.data(), n);
     assert(got <= maxout);
     if (got < maxout) out.resize(got);
     return out;
 }
 
-std::vector<double>
+vector<double>
 Resampler::resample(int sourceRate, int targetRate, const double *data, int n)
 {
     Resampler r(sourceRate, targetRate);
@@ -364,24 +379,28 @@
 
     int m = int(ceil((double(n) * targetRate) / sourceRate));
     
-//    std::cerr << "n = " << n << ", sourceRate = " << sourceRate << ", targetRate = " << targetRate << ", m = " << m << ", latency = " << latency << ", inputPad = " << inputPad << ", m1 = " << m1 << ", n1 = " << n1 << ", n1 - n = " << n1 - n << std::endl;
+#ifdef DEBUG_RESAMPLER
+    cerr << "n = " << n << ", sourceRate = " << sourceRate << ", targetRate = " << targetRate << ", m = " << m << ", latency = " << latency << ", inputPad = " << inputPad << ", m1 = " << m1 << ", n1 = " << n1 << ", n1 - n = " << n1 - n << endl;
+#endif
 
     vector<double> pad(n1 - n, 0.0);
     vector<double> out(m1 + 1, 0.0);
 
-    int got = r.process(data, out.data(), n);
-    got += r.process(pad.data(), out.data() + got, pad.size());
-
+    int gotData = r.process(data, out.data(), n);
+    int gotPad = r.process(pad.data(), out.data() + gotData, pad.size());
+    int got = gotData + gotPad;
+    
 #ifdef DEBUG_RESAMPLER
-    std::cerr << "resample: " << n << " in, " << got << " out" << std::endl;
+    cerr << "resample: " << n << " in, " << pad.size() << " padding, " << got << " out (" << gotData << " data, " << gotPad << " padding, latency = " << latency << ")" << endl;
 #endif
 #ifdef DEBUG_RESAMPLER_VERBOSE
-    std::cerr << "first 10 in:" << std::endl;
-    for (int i = 0; i < 10; ++i) {
-        std::cerr << data[i] << " ";
-        if (i == 5) std::cerr << std::endl;
+    int printN = 50;
+    cerr << "first " << printN << " in:" << endl;
+    for (int i = 0; i < printN && i < n; ++i) {
+	if (i % 5 == 0) cerr << endl << i << "... ";
+        cerr << data[i] << " ";
     }
-    std::cerr << std::endl;
+    cerr << endl;
 #endif
 
     int toReturn = got - latency;
@@ -391,12 +410,12 @@
 			  out.begin() + latency + toReturn);
 
 #ifdef DEBUG_RESAMPLER_VERBOSE
-    std::cerr << "all out (after latency compensation), length " << sliced.size() << ":";
-    for (int i = 0; i < sliced.size(); ++i) {
-	if (i % 5 == 0) std::cerr << std::endl << i << "... ";
-	std::cerr << sliced[i] << " ";
+    cerr << "first " << printN << " out (after latency compensation), length " << sliced.size() << ":";
+    for (int i = 0; i < printN && i < sliced.size(); ++i) {
+	if (i % 5 == 0) cerr << endl << i << "... ";
+	cerr << sliced[i] << " ";
     }
-    std::cerr << std::endl;
+    cerr << endl;
 #endif
 
     return sliced;