changeset 13:2e83471044c0

Pad properly at end of input
author Chris Cannam
date Fri, 14 Aug 2015 18:47:11 +0100
parents d9f993e094df
children 19088c4ba50a
files src/PitchFilterbank.cpp
diffstat 1 files changed, 36 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/PitchFilterbank.cpp	Fri Aug 14 18:37:24 2015 +0100
+++ b/src/PitchFilterbank.cpp	Fri Aug 14 18:47:11 2015 +0100
@@ -71,7 +71,7 @@
 	    if (m_resampled.find(rate) == m_resampled.end()) {
 		throw logic_error("No resampled output for rate of filter");
 	    }
-	    pushFiltered(i, m_resampled[rate]);
+	    pushFiltered(i, m_resampled[rate], false);
 	}
 
 	return energiesFromFiltered(false);
@@ -86,7 +86,7 @@
 
 	for (int i = 0; i < m_nfilters; ++i) {
 	    int rate = filterRate(i);
-	    pushFiltered(i, m_resampled[rate]);
+	    pushFiltered(i, m_resampled[rate], true);
 	}
 	
 	return energiesFromFiltered(true);
@@ -120,30 +120,51 @@
 	    }
 	}
 
-	int minCols = 0;
+	int minCols = 0, maxCols = 0;
 	for (int i = 0; i < m_nfilters; ++i) {
 	    int n = m_energies[i].size();
-	    if (i == 0 || n < minCols) {
-		minCols = n;
+	    if (i == 0 || n < minCols) minCols = n;
+	    if (i == 0 || n > maxCols) maxCols = n;
+	}
+
+	RealBlock out;
+	
+	if (drain) {
+	    out.resize(maxCols);
+	    for (int j = 0; j < maxCols; ++j) {
+		for (int i = 0; i < m_nfilters; ++i) {
+		    if (m_energies[i].size() == 0) {
+			out[j].push_back(0.0);
+		    } else {
+			out[j].push_back(m_energies[i][0]);
+			m_energies[i].pop_front();
+		    }
+		}
 	    }
-	}
-	
-	RealBlock out(minCols);
-	for (int j = 0; j < minCols; ++j) {
-	    for (int i = 0; i < m_nfilters; ++i) {
-		out[j].push_back(m_energies[i][0]);
-		m_energies[i].pop_front();
+	} else {
+	    out.resize(minCols);
+	    for (int j = 0; j < minCols; ++j) {
+		for (int i = 0; i < m_nfilters; ++i) {
+		    out[j].push_back(m_energies[i][0]);
+		    m_energies[i].pop_front();
+		}
 	    }
 	}
 
 	return out;
     }
     
-    void pushFiltered(int i, const RealSequence &resampled) {
+    void pushFiltered(int i, const RealSequence &resampled, bool drain) {
 
-	int n = resampled.size();
+	RealSequence in(resampled);
+	if (drain) {
+	    RealSequence pad(filterDelay(i), 0.0);
+	    in.insert(in.end(), pad.begin(), pad.end());
+	}
+	
+	int n = in.size();
 	RealSequence filtered(n, 0.0);
-	m_filters[i]->process(resampled.data(), filtered.data(), n);
+	m_filters[i]->process(in.data(), filtered.data(), n);
 
 	int pushStart = 0, pushCount = n;