Mercurial > hg > tipic
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); };