diff dsp/rateconversion/Resampler.cpp @ 364:01d7da967123

Save extra samples from one process to next (+ other fixes and debug out)
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 14 Oct 2013 08:15:51 +0100
parents 2fe2ab316c8e
children ce50eef47bdf
line wrap: on
line diff
--- a/dsp/rateconversion/Resampler.cpp	Sun Oct 13 12:47:50 2013 +0100
+++ b/dsp/rateconversion/Resampler.cpp	Mon Oct 14 08:15:51 2013 +0100
@@ -20,7 +20,6 @@
 
 Resampler::~Resampler()
 {
-    delete[] m_buffer;
     delete[] m_phaseData;
 }
 
@@ -55,7 +54,7 @@
 
     m_latency = int((m_filterLength / 2) / outputSpacing);
 
-    m_bufferLength = 0;
+    int bufferLength = 0;
 
     m_phaseData = new Phase[inputSpacing];
 
@@ -73,8 +72,8 @@
 		     / outputSpacing);
 
 	int filtZipLength = int(ceil((m_filterLength - phase) / inputSpacing));
-	if (filtZipLength > m_bufferLength) {
-	    m_bufferLength = filtZipLength;
+	if (filtZipLength > bufferLength) {
+	    bufferLength = filtZipLength;
 	}
 	
 	for (int i = 0; i < filtZipLength; ++i) {
@@ -104,12 +103,11 @@
     // latter. (What do other implementations do?)
 
     m_phase = m_filterLength % inputSpacing;
-    m_buffer = new double[m_bufferLength];
-    for (int i = 0; i < m_bufferLength; ++i) m_buffer[i] = 0.0;
+    m_buffer = vector<double>(bufferLength, 0);
 }
 
 double
-Resampler::reconstructOne(const double **srcptr)
+Resampler::reconstructOne(const double *src)
 {
     Phase &pd = m_phaseData[m_phase];
     double *filt = pd.filter.data();
@@ -118,32 +116,37 @@
     for (int i = 0; i < n; ++i) {
 	v += m_buffer[i] * filt[i];
     }
-    for (int i = pd.drop; i < n; ++i) {
-	m_buffer[i - pd.drop] = m_buffer[i];
+    m_buffer = vector<double>(m_buffer.begin() + pd.drop, m_buffer.end());
+    for (int i = 0; i < pd.take; ++i) {
+	m_buffer.push_back(src[i]);
     }
-    for (int i = 0; i < pd.take; ++i) {
-	m_buffer[n - pd.drop + i] = **srcptr;
-	++ *srcptr;
-    }
-    m_phase = pd.nextPhase;
     return v;
 }
 
 int
-Resampler::process(const double *src, double *dst, int n)
+Resampler::process(const double *src, double *dst, int remaining)
 {
     int m = 0;
-    const double *srcptr = src;
+    int offset = 0;
 
-    while (n > m_phaseData[m_phase].take) {
-	std::cerr << "n = " << n << ", m = " << m << ", take = " << m_phaseData[m_phase].take << std::endl;
-	n -= m_phaseData[m_phase].take;
-	dst[m] = reconstructOne(&srcptr);
-	std::cerr << "n -> " << n << std::endl;
+    while (remaining >= m_phaseData[m_phase].take) {
+	std::cerr << "remaining = " << remaining << ", m = " << m << ", take = " << m_phaseData[m_phase].take << std::endl;
+	int advance = m_phaseData[m_phase].take;
+	dst[m] = reconstructOne(src + offset);
+	offset += advance;
+	remaining -= advance;
+	m_phase = m_phaseData[m_phase].nextPhase;
+	std::cerr << "remaining -> " << remaining << ", new phase has advance " << m_phaseData[m_phase].take << std::endl;
 	++m;
     }
 
-    //!!! save any excess 
+    if (remaining > 0) {
+	std::cerr << "have " << remaining << " spare, pushing to buffer" << std::endl;
+    }	
+
+    for (int i = 0; i < remaining; ++i) {
+	m_buffer.push_back(src[offset + i]);
+    }
 
     return m;
 }