Mercurial > hg > cepstral-pitchtracker
changeset 28:7927e7afbe07
Simplify hypothesis implementation
author | Chris Cannam |
---|---|
date | Fri, 13 Jul 2012 21:24:22 +0100 |
parents | e358f133e670 |
children | afcd1f4e603c |
files | CepstrumPitchTracker.cpp CepstrumPitchTracker.h |
diffstat | 2 files changed, 32 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/CepstrumPitchTracker.cpp Fri Jul 13 20:58:37 2012 +0100 +++ b/CepstrumPitchTracker.cpp Fri Jul 13 21:24:22 2012 +0100 @@ -38,7 +38,6 @@ CepstrumPitchTracker::Hypothesis::Hypothesis() { m_state = New; - m_age = 0; } CepstrumPitchTracker::Hypothesis::~Hypothesis() @@ -68,6 +67,15 @@ return true; } +bool +CepstrumPitchTracker::Hypothesis::isOutOfDateFor(Estimate s) +{ + if (m_pending.empty()) return false; + + return ((s.time - m_pending[m_pending.size()-1].time) > + RealTime::fromMilliseconds(40)); +} + bool CepstrumPitchTracker::Hypothesis::isSatisfied() { @@ -88,14 +96,8 @@ return (m_pending.size() > lengthRequired); } -void -CepstrumPitchTracker::Hypothesis::advanceTime() -{ - ++m_age; -} - bool -CepstrumPitchTracker::Hypothesis::test(Estimate s) +CepstrumPitchTracker::Hypothesis::accept(Estimate s) { bool accept = false; @@ -107,7 +109,7 @@ break; case Provisional: - if (m_age > 3) { + if (isOutOfDateFor(s)) { m_state = Rejected; } else if (isWithinTolerance(s)) { accept = true; @@ -115,7 +117,7 @@ break; case Satisfied: - if (m_age > 3) { + if (isOutOfDateFor(s)) { m_state = Expired; } else if (isWithinTolerance(s)) { accept = true; @@ -131,13 +133,12 @@ if (accept) { m_pending.push_back(s); - m_age = 0; if (m_state == Provisional && isSatisfied()) { m_state = Satisfied; } } - return accept && (m_state == Satisfied); + return accept; } CepstrumPitchTracker::Hypothesis::State @@ -582,21 +583,20 @@ e.time = timestamp; e.confidence = confidence; - m_accepted.advanceTime(); - +// m_good.advanceTime(); for (int i = 0; i < m_possible.size(); ++i) { - m_possible[i].advanceTime(); +// m_possible[i].advanceTime(); } - if (!m_accepted.test(e)) { + if (!m_good.accept(e)) { int candidate = -1; bool accepted = false; for (int i = 0; i < m_possible.size(); ++i) { - if (m_possible[i].test(e)) { - accepted = true; + if (m_possible[i].accept(e)) { if (m_possible[i].getState() == Hypothesis::Satisfied) { + accepted = true; candidate = i; } break; @@ -605,20 +605,20 @@ if (!accepted) { Hypothesis h; - h.test(e); //!!! must succeed as h is new, so perhaps there should be a ctor for this + h.accept(e); //!!! must succeed as h is new, so perhaps there should be a ctor for this m_possible.push_back(h); } - if (m_accepted.getState() == Hypothesis::Expired) { - m_accepted.addFeatures(fs); + if (m_good.getState() == Hypothesis::Expired) { + m_good.addFeatures(fs); } - if (m_accepted.getState() == Hypothesis::Expired || - m_accepted.getState() == Hypothesis::Rejected) { + if (m_good.getState() == Hypothesis::Expired || + m_good.getState() == Hypothesis::Rejected) { if (candidate >= 0) { - m_accepted = m_possible[candidate]; + m_good = m_possible[candidate]; } else { - m_accepted = Hypothesis(); + m_good = Hypothesis(); } } @@ -634,8 +634,8 @@ } } - std::cerr << "accepted length = " << m_accepted.getPendingLength() - << ", state = " << m_accepted.getState() + std::cerr << "accepted length = " << m_good.getPendingLength() + << ", state = " << m_good.getState() << ", hypothesis count = " << m_possible.size() << std::endl; delete[] data; @@ -646,8 +646,8 @@ CepstrumPitchTracker::getRemainingFeatures() { FeatureSet fs; - if (m_accepted.getState() == Hypothesis::Satisfied) { - m_accepted.addFeatures(fs); + if (m_good.getState() == Hypothesis::Satisfied) { + m_good.addFeatures(fs); } return fs; }
--- a/CepstrumPitchTracker.h Fri Jul 13 20:58:37 2012 +0100 +++ b/CepstrumPitchTracker.h Fri Jul 13 21:24:22 2012 +0100 @@ -101,9 +101,7 @@ Expired }; - bool test(Estimate); - - void advanceTime(); + bool accept(Estimate); State getState(); @@ -115,17 +113,17 @@ private: bool isWithinTolerance(Estimate); + bool isOutOfDateFor(Estimate); bool isSatisfied(); double getMeanFrequency(); State m_state; Estimates m_pending; - int m_age; }; typedef std::vector<Hypothesis> Hypotheses; Hypotheses m_possible; - Hypothesis m_accepted; + Hypothesis m_good; void filter(const double *in, double *out); double cubicInterpolate(const double[4], double);