changeset 14:213d80320d4b track

An experiment in mean-filtering proportion values -- not very successful
author Chris Cannam
date Fri, 29 Jun 2012 11:25:05 +0100
parents cb88b9954eec
children cd9676e09d46
files CepstrumPitchTracker.cpp CepstrumPitchTracker.h
diffstat 2 files changed, 33 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/CepstrumPitchTracker.cpp	Thu Jun 28 12:17:18 2012 +0100
+++ b/CepstrumPitchTracker.cpp	Fri Jun 29 11:25:05 2012 +0100
@@ -113,11 +113,13 @@
     m_fmax(1000),
     m_histlen(1),
     m_vflen(3),
+    m_ppflen(4),
     m_binFrom(0),
     m_binTo(0),
     m_bins(0),
     m_accepted(0),
     m_history(0),
+    m_ppfilter(0),
     m_prevpeak(0),
     m_prevprop(0)
 {
@@ -131,6 +133,7 @@
         }
         delete[] m_history;
     }
+    delete[] m_ppfilter;
 }
 
 string
@@ -292,6 +295,8 @@
         m_history[i] = new double[m_bins];
     }
 
+    m_ppfilter = new double[m_ppflen];
+
     reset();
 
     return true;
@@ -305,6 +310,9 @@
             m_history[i][j] = 0.0;
         }
     }
+    for (int i = 0; i < m_ppflen; ++i) {
+        m_ppfilter[i] = 0.0;
+    }
 }
 
 void
@@ -373,14 +381,35 @@
     bool accept = false;
 
     if (abs(n - m_prevpeak) < 10) { //!!! should depend on bin count
+        std::cerr << "accepting " << n << " [as prevpeak was " << m_prevpeak
+                  << "]" << std::endl;
         accept = true;
     } else if (peakProportion > m_prevprop * 2) {
+        std::cerr << "accepting " << n << " [as peakProportion " << peakProportion << " much higher than prev " << m_prevprop << "]" << std::endl;
         accept = true;
+    } else {
+        std::cerr << "rejecting " << n << " with " << peakProportion
+                  << " [prevpeak " << m_prevpeak
+                  << ", prevprop " << m_prevprop << "]" << std::endl;
     }
 
     return accept;
 }
 
+void
+CepstrumPitchTracker::updatePropFilter(double prop)
+{
+    double tot = 0.0;
+    for (int i = 1; i < m_ppflen; ++i) {
+        double val = m_ppfilter[i];
+        m_ppfilter[i-1] = val;
+        tot += val;
+    }
+    double mean = tot / (m_ppflen - 1);
+    m_ppfilter[m_ppflen-1] = prop;
+    m_prevprop = mean;
+}
+
 CepstrumPitchTracker::FeatureSet
 CepstrumPitchTracker::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
 {
@@ -462,8 +491,8 @@
         }
         if (accepted) {
             m_prevpeak = maxbin;
-            m_prevprop = pp;
         }
+        updatePropFilter(pp);
     }
             
 //    std::cerr << "peakProportion = " << peakProportion << std::endl;
--- a/CepstrumPitchTracker.h	Thu Jun 28 12:17:18 2012 +0100
+++ b/CepstrumPitchTracker.h	Fri Jun 29 11:25:05 2012 +0100
@@ -70,6 +70,7 @@
     float m_fmax;
     int m_histlen;
     int m_vflen;
+    int m_ppflen;
 
     int m_binFrom;
     int m_binTo;
@@ -113,11 +114,13 @@
     Hypothesis *m_accepted;
 
     double **m_history;
+    double *m_ppfilter;
     
     int m_prevpeak;
     double m_prevprop;
 
     double calculatePeakProportion(const double *data, double abstot, int n);
+    void updatePropFilter(double peakProportion);
     bool acceptPeak(int n, double peakProportion);
 
     void filter(const double *in, double *out);