Mercurial > hg > match-vamp
changeset 62:ad417dd05e0b cheap_diagonals
Merge from branch "refactors_no_float"
author | Chris Cannam |
---|---|
date | Fri, 14 Nov 2014 13:57:12 +0000 |
parents | fb6e4829c1af (current diff) faa523be20f9 (diff) |
children | a1ff2d45548c |
files | src/Finder.cpp src/Finder.h src/MatchFeatureFeeder.cpp src/MatchFeeder.cpp src/Matcher.h |
diffstat | 6 files changed, 80 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Finder.cpp Fri Nov 14 12:35:36 2014 +0000 +++ b/src/Finder.cpp Fri Nov 14 13:57:12 2014 +0000 @@ -31,6 +31,8 @@ index2 = 0; rowRange = new int[2]; colRange = new int[2]; + duration1 = -1; + duration2 = -1; } // constructor Finder::~Finder() @@ -39,6 +41,13 @@ delete[] colRange; } +void +Finder::setDurations(int d1, int d2) +{ + duration1 = d1; + duration2 = d2; +} + bool Finder::find(int i1, int i2) { @@ -274,6 +283,13 @@ int x = pm2->getFrameCount() - 1; int y = pm1->getFrameCount() - 1; + if (duration2 > 0 && duration2 < pm2->getFrameCount()) { + x = duration2 - 1; + } + if (duration1 > 0 && duration1 < pm1->getFrameCount()) { + y = duration1 - 1; + } + recalculatePathCostMatrix(0, 0, y, x); pathx.clear();
--- a/src/Finder.h Fri Nov 14 12:35:36 2014 +0000 +++ b/src/Finder.h Fri Nov 14 13:57:12 2014 +0000 @@ -34,12 +34,22 @@ int index1, index2, bestRow, bestCol; int *rowRange; int *colRange; + int duration1, duration2; public: Finder(Matcher *p1, Matcher *p2); ~Finder(); + /** + * Tell the finder that one or both files ends sooner than it + * thought, i.e. that some of the trailing features are silence or + * otherwise to be ignored. d1 and d2 are feature frame counts for + * matchers 1 and 2 respectively. If this is not called, the full + * duration of each input will be considered. + */ + void setDurations(int d1, int d2); + /** Sets up the instance variables to point to the given * coordinate in the distance matrix. *
--- a/src/MatchFeatureFeeder.cpp Fri Nov 14 12:35:36 2014 +0000 +++ b/src/MatchFeatureFeeder.cpp Fri Nov 14 13:57:12 2014 +0000 @@ -38,10 +38,15 @@ // processing up to one feature per matcher, until a queue is // empty. Then it returns, to be called again with more data. - q1.push(f1); - q2.push(f2); + if (!f1.empty()) { + q1.push(f1); + } + + if (!f2.empty()) { + q2.push(f2); + } - while (!q1.empty() && !q2.empty()) { + while (!q1.empty() || !q2.empty()) { feedBlock(); } } @@ -49,11 +54,14 @@ void MatchFeatureFeeder::feedBlock() { - if (pm1->m_frameCount < pm1->m_blockSize) { // fill initial block + if (q1.empty()) { // ended + feed2(); + } else if (q2.empty()) { // ended + feed1(); + } else if (pm1->m_frameCount < pm1->m_blockSize) { // fill initial block feed1(); feed2(); - } - else if (pm1->m_runCount >= pm1->m_params.maxRunCount) { // slope constraints + } else if (pm1->m_runCount >= pm1->m_params.maxRunCount) { // slope constraints feed2(); } else if (pm2->m_runCount >= pm2->m_params.maxRunCount) { feed1();
--- a/src/MatchFeatureFeeder.h Fri Nov 14 12:35:36 2014 +0000 +++ b/src/MatchFeatureFeeder.h Fri Nov 14 13:57:12 2014 +0000 @@ -33,6 +33,13 @@ * respectively (depending on their advance status). Matchers must * have been constructed using the external featureSize * constructor. + * + * f1 and f2 are normally expected to have the same number of + * values, and that number should be the featureSize passed to the + * constructors for both Matchers. The exception is when one input + * ends before the other one: subsequent calls should pass a + * feature vector as normal for the input that is still going on, + * and an empty vector for the one that has ended. */ void feed(std::vector<double> f1, std::vector<double> f2);
--- a/src/MatchFeeder.cpp Fri Nov 14 12:35:36 2014 +0000 +++ b/src/MatchFeeder.cpp Fri Nov 14 13:57:12 2014 +0000 @@ -19,7 +19,7 @@ using std::vector; MatchFeeder::MatchFeeder(Matcher *m1, Matcher *m2) : - pm1(m1), pm2(m2) + pm1(m1), pm2(m2), n(0), lastIn1(0), lastIn2(0) { fftSize = m1->m_params.fftSize; finder = new Finder(m1, m2); @@ -53,7 +53,7 @@ prepare(input); - while (!q1.empty() && !q2.empty()) { + while (!q1.empty() || !q2.empty()) { // std::cerr << "MatchFeeder::feed: q1 " << q1.size() << " q2 " << q2.size() << std::endl; (void)feedBlock(); } @@ -66,7 +66,7 @@ Features all; - while (!q1.empty() && !q2.empty()) { + while (!q1.empty() || !q2.empty()) { Features ff = feedBlock(); all.f1.insert(all.f1.end(), ff.f1.begin(), ff.f1.end()); all.f2.insert(all.f2.end(), ff.f2.begin(), ff.f2.end()); @@ -78,17 +78,36 @@ void MatchFeeder::prepare(const float *const *input) { + float threshold = 1e-5f; + float *block = new float[fftSize+2]; + float rms = 0; + for (size_t i = 0; i < fftSize+2; ++i) { block[i] = input[0][i]; + rms += block[i] * block[i]; + } + rms = sqrtf(rms / (fftSize+2)); + if (rms > threshold) { + lastIn1 = n; } q1.push(block); block = new float[fftSize+2]; + rms = 0; + for (size_t i = 0; i < fftSize+2; ++i) { block[i] = input[1][i]; + rms += block[i] * block[i]; + } + rms = sqrtf(rms / (fftSize+2)); + if (rms > threshold) { + lastIn2 = n; } q2.push(block); + + ++n; + finder->setDurations(lastIn1, lastIn2); } MatchFeeder::Features @@ -97,16 +116,15 @@ Features ff; vector<double> f1, f2; - if (pm1->m_frameCount < pm1->m_blockSize) { // fill initial block + if (q1.empty()) { + feed2(); + } else if (q2.empty()) { + feed1(); + } else if (pm1->m_frameCount < pm1->m_blockSize) { // fill initial block // std::cerr << "feeding initial block" << std::endl; f1 = feed1(); f2 = feed2(); - } -//!!! } else if (pm1->atEnd) { -// feed2(); -//!!! } else if (pm2->atEnd) -// feed1(); - else if (pm1->m_runCount >= pm1->m_params.maxRunCount) { // slope constraints + } else if (pm1->m_runCount >= pm1->m_params.maxRunCount) { // slope constraints // std::cerr << "pm1 too slopey" << std::endl; f2 = feed2(); } else if (pm2->m_runCount >= pm2->m_params.maxRunCount) {
--- a/src/MatchFeeder.h Fri Nov 14 12:35:36 2014 +0000 +++ b/src/MatchFeeder.h Fri Nov 14 13:57:12 2014 +0000 @@ -47,7 +47,7 @@ * calculated by the two feeders. */ Features feedAndGetFeatures(const float *const *input); - + Finder *getFinder() { return finder; } protected: @@ -66,6 +66,10 @@ std::queue<float *> q1; std::queue<float *> q2; + + int n; + int lastIn1; + int lastIn2; }; #endif