changeset 9:0510372cb340 track

Switch to inverse symmetric method. Forward difference worked nicely for some examples but very badly for others (octave errors)
author Chris Cannam
date Mon, 25 Jun 2012 16:35:38 +0100
parents 10dfd77951bf
children 960868d5f841
files CepstrumPitchTracker.cpp
diffstat 1 files changed, 6 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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;