Mercurial > hg > cepstral-pitchtracker
changeset 25:9aee1a0e6223
Simplify confidence metric
author | Chris Cannam |
---|---|
date | Tue, 10 Jul 2012 22:16:00 +0100 |
parents | 0c45cca1e4fd |
children | 13568f1ccff0 |
files | CepstrumPitchTracker.cpp |
diffstat | 1 files changed, 16 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/CepstrumPitchTracker.cpp Mon Jul 09 22:34:11 2012 +0100 +++ b/CepstrumPitchTracker.cpp Tue Jul 10 22:16:00 2012 +0100 @@ -77,7 +77,10 @@ } meanConfidence /= m_pending.size(); - int lengthRequired = int(2.0 / meanConfidence + 0.5); + int lengthRequired = 10000; + if (meanConfidence > 0.0) { + lengthRequired = int(2.0 / meanConfidence + 0.5); + } std::cerr << "meanConfidence = " << meanConfidence << ", lengthRequired = " << lengthRequired << ", length = " << m_pending.size() << std::endl; return (m_pending.size() > lengthRequired); @@ -219,7 +222,7 @@ m_stepSize(256), m_blockSize(1024), m_fmin(50), - m_fmax(1000), + m_fmax(900), m_vflen(1), m_binFrom(0), m_binTo(0), @@ -507,26 +510,31 @@ // The "inverse symmetric" method. Seems to be the most reliable + double magmean = 0.0; + for (int i = 0; i < hs; ++i) { double power = inputBuffers[0][i*2 ] * inputBuffers[0][i*2 ] + inputBuffers[0][i*2+1] * inputBuffers[0][i*2+1]; double mag = sqrt(power); - + + magmean += mag; + double lm = log(mag + 0.00000001); logmag[i] = lm; if (i > 0) logmag[bs - i] = lm; } + magmean /= hs; + double threshold = 0.1; // for magmean + fft(bs, true, logmag, 0, rawcep, io); delete[] logmag; delete[] io; - double cep1 = rawcep[1]; - int n = m_bins; double *data = new double[n]; filter(rawcep, data); @@ -562,13 +570,9 @@ double confidence = 0.0; if (nextPeakVal != 0.0) { - std::cerr << "maxval = " << maxval << ", cep1 = " << cep1 << std::endl; - double conf0 = (maxval - nextPeakVal) / 80.0; - double conf1 = (cep1 / bs) / 2; - if (conf0 > 1.0) conf0 = 1.0; - if (conf1 > 1.0) conf1 = 1.0; - confidence = conf0 * conf1; - std::cerr << "conf0 = " << conf0 << ", conf1 = " << conf1 << ", confidence = " << confidence << std::endl; + confidence = (maxval - nextPeakVal) / 100.0; + if (magmean < threshold) confidence = 0.0; + std::cerr << "magmean = " << magmean << ", confidence = " << confidence << std::endl; } Hypothesis::Estimate e;