changeset 57:82b3cdf6ca6b

Get new accepted hypotheses from feeder as they appear
author Chris Cannam
date Thu, 27 Sep 2012 17:22:51 +0100
parents d8eeba570d70
children 9f50a5876dd3 0a2827a35031
files AgentFeeder.h CepstralPitchTracker.cpp CepstralPitchTracker.h
diffstat 3 files changed, 27 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/AgentFeeder.h	Thu Sep 27 17:14:11 2012 +0100
+++ b/AgentFeeder.h	Thu Sep 27 17:22:51 2012 +0100
@@ -56,7 +56,7 @@
 
     typedef std::vector<NoteHypothesis> Hypotheses;
 
-    Hypotheses getAcceptedHypotheses() const {
+    const Hypotheses &getAcceptedHypotheses() const {
         return m_accepted;
     }
 
--- a/CepstralPitchTracker.cpp	Thu Sep 27 17:14:11 2012 +0100
+++ b/CepstralPitchTracker.cpp	Thu Sep 27 17:22:51 2012 +0100
@@ -53,6 +53,7 @@
     m_binFrom(0),
     m_binTo(0),
     m_bins(0),
+    m_nAccepted(0),
     m_feeder(0)
 {
 }
@@ -243,6 +244,7 @@
 {
     delete m_feeder;
     m_feeder = new AgentFeeder();
+    m_nAccepted = 0;
 }
 
 void
@@ -268,11 +270,24 @@
     fs[1].push_back(nf);
 }
 
+void
+CepstralPitchTracker::addNewFeatures(FeatureSet &fs)
+{
+    int n = m_feeder->getAcceptedHypotheses().size();
+    if (n == m_nAccepted) return;
+
+    AgentFeeder::Hypotheses accepted = m_feeder->getAcceptedHypotheses();
+
+    for (int i = m_nAccepted; i < n; ++i) {
+        addFeaturesFrom(accepted[i], fs);
+    }
+
+    m_nAccepted = n;
+}
+
 CepstralPitchTracker::FeatureSet
 CepstralPitchTracker::process(const float *const *inputBuffers, RealTime timestamp)
 {
-    FeatureSet fs;
-
     double *rawcep = new double[m_blockSize];
     double magmean = Cepstrum(m_blockSize).process(inputBuffers[0], rawcep);
 
@@ -295,7 +310,7 @@
 
     if (maxbin < 0) {
         delete[] data;
-        return fs;
+        return FeatureSet();
     }
 
     double nextPeakVal = 0.0;
@@ -321,6 +336,8 @@
 //        std::cerr << "magmean = " << magmean << ", confidence = " << confidence << std::endl;
     }
 
+    delete[] data;
+
     NoteHypothesis::Estimate e;
     e.freq = peakfreq;
     e.time = timestamp;
@@ -328,7 +345,8 @@
 
     m_feeder->feed(e);
 
-    delete[] data;
+    FeatureSet fs;
+    addNewFeatures(fs);
     return fs;
 }
 
@@ -337,11 +355,7 @@
 {
     m_feeder->finish();
 
-    AgentFeeder::Hypotheses accepted = m_feeder->getAcceptedHypotheses();
-
     FeatureSet fs;
-    for (int i = 0; i < accepted.size(); ++i) {
-        addFeaturesFrom(accepted[i], fs);
-    }
+    addNewFeatures(fs);
     return fs;
 }
--- a/CepstralPitchTracker.h	Thu Sep 27 17:14:11 2012 +0100
+++ b/CepstralPitchTracker.h	Thu Sep 27 17:22:51 2012 +0100
@@ -80,8 +80,11 @@
     int m_binTo;
     int m_bins; // count of "interesting" bins, those returned in m_cepOutput
 
+    int m_nAccepted;
+
     AgentFeeder *m_feeder;
     void addFeaturesFrom(NoteHypothesis h, FeatureSet &fs);
+    void addNewFeatures(FeatureSet &fs);
 };
 
 #endif