# HG changeset patch # User Chris Cannam # Date 1340638538 -3600 # Node ID c74846514b0997709f18916296966e37cf8f648e # Parent 9366c8a5877846b31d9c07cd98a07f2b2d6f0e9c Switch to inverse symmetric method. Forward difference worked nicely for some examples but very badly for others (octave errors) diff -r 9366c8a58778 -r c74846514b09 CepstrumPitchTracker.cpp --- a/CepstrumPitchTracker.cpp Mon Jun 25 15:28:51 2012 +0100 +++ b/CepstrumPitchTracker.cpp Mon Jun 25 16:35:38 2012 +0100 @@ -271,7 +271,7 @@ double *io = new double[bs]; double *logmag = new double[bs]; - // The "forward difference" method + // The "inverse symmetric" method. Seems to be the most reliable for (int i = 0; i < hs; ++i) { @@ -282,17 +282,11 @@ double lm = log(mag + 0.00000001); - logmag[bs/2 + i - 1] = lm; - if (i < hs-1) { - logmag[bs/2 - i - 1] = lm; - } + logmag[i] = lm; + if (i > 0) logmag[bs - i] = lm; } - fft(bs, false, logmag, 0, rawcep, io); - - for (int i = 0; i < hs; ++i) { - rawcep[i] = fabs(io[i]) - fabs(rawcep[i]); - } + fft(bs, true, logmag, 0, rawcep, io); delete[] logmag; delete[] io; @@ -333,8 +327,9 @@ // std::cerr << "peakProportion = " << peakProportion << std::endl; // std::cerr << "peak = " << m_inputSampleRate / (maxbin + m_binFrom) << std::endl; +// std::cerr << "bins = " << m_bins << std::endl; - if (peakProportion >= 0.03) { + if (peakProportion >= (0.00006 * m_bins)) { Feature f; f.hasTimestamp = true; f.timestamp = timestamp;