Mercurial > hg > vamp-simple-cepstrum
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);