changeset 36:13276c5113be

Top & tail downsampled output
author Chris Cannam
date Thu, 01 Oct 2015 09:28:38 +0100
parents 474f45cfd3fd
children 47d5321a57c2
files src/FeatureDownsample.cpp src/FeatureDownsample.h src/TipicVampPlugin.cpp src/TipicVampPlugin.h
diffstat 4 files changed, 56 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/FeatureDownsample.cpp	Wed Sep 30 16:15:36 2015 +0100
+++ b/src/FeatureDownsample.cpp	Thu Oct 01 09:28:38 2015 +0100
@@ -23,12 +23,19 @@
     vector<double> wd(w.getWindowData());
     wd.push_back(wd[0]);
 
+    double divisor = 0.0;
+    for (auto x: wd) divisor += x;
+    for (auto &x: wd) x /= divisor;
+
     // FIR filter
     for (int i = 0; i < m_params.featureSize; ++i) {
 	m_filters.push_back(new Filter({ {}, wd }));
     }
 
-    m_toNext = params.downsampleFactor;
+    m_toNext = 1;
+    m_toDrop = m_params.windowLength / 2;
+    m_inCount = 0;
+    m_outCount = 0;
 }
 
 FeatureDownsample::~FeatureDownsample()
@@ -40,17 +47,24 @@
 FeatureDownsample::reset()
 {
     for (auto &f: m_filters) f->reset();
+    m_toNext = 1;
+    m_toDrop = m_params.windowLength / 2;
+    m_inCount = 0;
+    m_outCount = 0;
 }
 
 RealBlock
 FeatureDownsample::process(const RealBlock &in)
 {
-    //!!! todo: adjust for delay
+    RealBlock out;
     
-    RealBlock out;
     for (const auto &col: in) {
 	RealColumn outcol;
-	--m_toNext;
+	if (m_toDrop > 0) {
+	    --m_toDrop;
+	} else {
+	    --m_toNext;
+	}
 	for (int i = 0; i < m_params.featureSize; ++i) {
 	    double val = 0.0;
 	    m_filters[i]->process(&col[i], &val, 1);
@@ -61,8 +75,27 @@
 	if (m_toNext == 0) {
 	    out.push_back(outcol);
 	    m_toNext = m_params.downsampleFactor;
+	    ++m_outCount;
 	}
+	++m_inCount;
+    }
+    
+    return out;
+}
+
+RealBlock
+FeatureDownsample::getRemainingOutput()
+{
+    RealBlock pad(m_params.windowLength, RealColumn(m_params.featureSize, 0.0));
+    RealBlock tail = process(pad);
+    int expected = m_inCount / m_params.downsampleFactor;
+    RealBlock out;
+    for (int i = 0;
+	 m_outCount < expected && i < int(tail.size());
+	 ++i, ++m_outCount) {
+	out.push_back(tail[i]);
     }
     return out;
 }
 
+
--- a/src/FeatureDownsample.h	Wed Sep 30 16:15:36 2015 +0100
+++ b/src/FeatureDownsample.h	Thu Oct 01 09:28:38 2015 +0100
@@ -30,11 +30,15 @@
 
     void reset();
     RealBlock process(const RealBlock &in);
+    RealBlock getRemainingOutput();
     
 private:
     Parameters m_params;
     std::vector<Filter *> m_filters;
+    int m_toDrop;
     int m_toNext;
+    int m_inCount;
+    int m_outCount;
 };
 
 #endif
--- a/src/TipicVampPlugin.cpp	Wed Sep 30 16:15:36 2015 +0100
+++ b/src/TipicVampPlugin.cpp	Thu Oct 01 09:28:38 2015 +0100
@@ -339,10 +339,10 @@
     RealBlock crp = m_crp->process(pitchFiltered);
 
     FeatureSet fs;
-    addFeatures(fs, m_pitchOutputNo, pitchFiltered);
-    addFeatures(fs, m_cpOutputNo, cp);
-    addFeatures(fs, m_clpOutputNo, clp);
-    addFeatures(fs, m_crpOutputNo, crp);
+    addFeatures(fs, m_pitchOutputNo, pitchFiltered, false);
+    addFeatures(fs, m_cpOutputNo, cp, false);
+    addFeatures(fs, m_clpOutputNo, clp, false);
+    addFeatures(fs, m_crpOutputNo, crp, false);
     return fs;
 }
 
@@ -356,15 +356,15 @@
     RealBlock crp = m_crp->process(pitchFiltered);
 
     FeatureSet fs;
-    addFeatures(fs, m_pitchOutputNo, pitchFiltered);
-    addFeatures(fs, m_cpOutputNo, cp);
-    addFeatures(fs, m_clpOutputNo, clp);
-    addFeatures(fs, m_crpOutputNo, crp);
+    addFeatures(fs, m_pitchOutputNo, pitchFiltered, true);
+    addFeatures(fs, m_cpOutputNo, cp, true);
+    addFeatures(fs, m_clpOutputNo, clp, true);
+    addFeatures(fs, m_crpOutputNo, crp, true);
     return fs;
 }
 
 void
-Tipic::addFeatures(FeatureSet &fs, int outputNo, const RealBlock &block)
+Tipic::addFeatures(FeatureSet &fs, int outputNo, const RealBlock &block, bool final)
 {
     if (block.empty()) return;
     
@@ -383,6 +383,11 @@
     }
 
     RealBlock downsampled = m_downsamplers[outputNo]->process(block);
+
+    if (final) {
+	RealBlock remaining = m_downsamplers[outputNo]->getRemainingOutput();
+	downsampled.insert(downsampled.end(), remaining.begin(), remaining.end());
+    }
     
     for (int i = 0; in_range_for(downsampled, i); ++i) {
 	Feature f;
--- a/src/TipicVampPlugin.h	Wed Sep 30 16:15:36 2015 +0100
+++ b/src/TipicVampPlugin.h	Thu Oct 01 09:28:38 2015 +0100
@@ -63,7 +63,7 @@
     mutable int m_crpOutputNo;
     std::map<int, FeatureDownsample *> m_downsamplers;
 
-    void addFeatures(FeatureSet &, int outputNo, const RealBlock &);
+    void addFeatures(FeatureSet &, int outputNo, const RealBlock &, bool final);
 };