changeset 12:9973b7cd0d31 tip

Implement rest of tempo estimator
author Chris Cannam
date Mon, 08 Oct 2012 15:46:54 +0100
parents cb43d088e369
children
files tempo_estimator.py
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/tempo_estimator.py	Mon Oct 08 15:42:07 2012 +0100
+++ b/tempo_estimator.py	Mon Oct 08 15:46:54 2012 +0100
@@ -14,12 +14,23 @@
         df[n] = value
     return df
 
+def find_tempo_from_autocorrelation(acf, bpm_min, bpm_max, hops_per_sec):
+    lag_min = sp.bpm_to_lag(bpm_max, hops_per_sec)
+    lag_max = sp.bpm_to_lag(bpm_min, hops_per_sec)
+    acf_subset = acf[lag_min:lag_max]
+    peakidx = np.argmax(acf_subset)
+    lag_peak = lag_min + peakidx
+    return sp.lag_to_bpm(lag_peak, hops_per_sec)
+
 def estimate_tempo_of_samples(samples, samplerate):
     """Given some audio samples and their samplerate, return their estimated tempo in bpm."""
     hop = 512
     df = detection_function(samples, hop)
-    acf = autocorrelation(df)
-    tempo = find_tempo_from_autocorrelation(acf)
+    acf = sp.autocorrelation(df)
+    bpm_min = 70.0
+    bpm_max = 150.0
+    hops_per_sec = samplerate / float(hop)
+    tempo = find_tempo_from_autocorrelation(acf, bpm_min, bpm_max, hops_per_sec)
     return tempo
 
 def estimate_tempo_of_file(filename):