diff examples/FixedTempoEstimator.cpp @ 209:0f6616ef0e18

* More tweaks (still incomplete)
author cannam
date Thu, 16 Oct 2008 16:26:00 +0000
parents df55003e8968
children 87b131a54b0a
line wrap: on
line diff
--- a/examples/FixedTempoEstimator.cpp	Thu Oct 16 14:17:07 2008 +0000
+++ b/examples/FixedTempoEstimator.cpp	Thu Oct 16 16:26:00 2008 +0000
@@ -125,7 +125,7 @@
     m_stepSize = stepSize;
     m_blockSize = blockSize;
 
-    float dfLengthSecs = 8.f;
+    float dfLengthSecs = 10.f;
     m_dfsize = (dfLengthSecs * m_inputSampleRate) / m_stepSize;
 
     m_priorMagnitudes = new float[m_blockSize/2];
@@ -298,9 +298,9 @@
         float sqrmag = real * real + imag * imag;
         value += fabsf(sqrmag - m_priorMagnitudes[i]);
 
-//        if (i == 1 && ts == RealTime::zeroTime) {
-//            cerr << "First sqrmag: " << sqrmag << ", value = " << value << endl;
-//        }
+        if (i == 1 && ts == RealTime::zeroTime) {
+            cerr << "First sqrmag: " << sqrmag << ", value = " << value << endl;
+        }
 
         m_priorMagnitudes[i] = sqrmag;
     }
@@ -344,7 +344,7 @@
         return;
     }
 
-    if (m_n < m_dfsize / 6) {
+    if (m_n < m_dfsize / 9) {
         cerr << "FixedTempoEstimator::calculate: Not enough data to go on (have " << m_n << ", want at least " << m_dfsize/4 << ")" << endl;
         return; // not enough data (perhaps we should return the duration of the input as the "estimated" beat length?)
     }
@@ -369,83 +369,104 @@
 
         m_r[i] /= n - i - 1;
     }
-
+/*
     for (int i = 1; i < n/2; ++i) {
 
         float weight = 1.f - fabsf(128.f - lag2tempo(i)) * 0.005;
         if (weight < 0.f) weight = 0.f;
         weight = weight * weight;
 
-        cerr << "i = " << i << ": tempo = " << lag2tempo(i) << ", weight = " << weight << endl;
+        cerr << "i = " << i << ": tempo = " << lag2tempo(i) << ", weight = " << weight << ", " << m_r[i] << " -> ";
 
-        m_fr[i] = m_r[i] * (1 + weight / 3.f);
+        m_fr[i] = m_r[i] * weight; //(1 + weight / 2.f);
+        
+        cerr << m_fr[i] << endl;
     }
+*/
+    int related[] = { 2, 3, 4 };
 
-    int related[4] = { 2, 3, 4 };
+    int e = tempo2lag(50.f);
+//    int universalDiv = (n/2 - 1) / e;
+//    cerr << "universalDiv = " << universalDiv << endl;
 
-    int e = tempo2lag(60.f);
-    int universalDiv = (n/2 - 1) / e;
-    cerr << "universalDiv = " << universalDiv << endl;
+    for (int i = 1; i < n/2-1; ++i) {
 
-    for (int i = 0; i < n/2; ++i) {
+        float weight = 1.f - fabsf(128.f - lag2tempo(i)) * 0.005;
+        if (weight < 0.f) weight = 0.f;
+        weight = weight * weight;
 
-        if (i == 0 || i == n/2 - 1
+//        cerr << "i = " << i << ": tempo = " << lag2tempo(i) << ", weight = " << weight << ", " << m_r[i] << " -> ";
+
+        m_fr[i] = m_r[i];
+//        m_fr[i] = m_r[i] * weight; //(1 + weight / 2.f);
+        
+//        if (i == 0 || i == n/2 - 1
 /*
             ||
             !(m_fr[i] > m_fr[i-1] &&
               m_fr[i] >= m_fr[i+1])
 */
-            ) {
-            continue;
-        }
+//            ) {
+//            continue;
+//        }
 
         int div = 1;
 
         for (int j = 0; j < sizeof(related)/sizeof(related[0]); ++j) {
 
             int k0 = i * related[j];
-            
-            if (k0 > 1 && k0 < n/2 - 2) {
+
+            if (k0 >= 0 && k0 < n/2) {
 
                 int kmax = 0, kmin = 0;
                 float kvmax = 0, kvmin = 0;
+                bool have = false;
 
-                for (int k = k0 - 2; k <= k0 + 2; ++k) {
+                for (int k = k0 - 1; k <= k0 + 1; ++k) {
 
-                    if (k == k0 - 2 || m_r[k] > kvmax) {
+                    if (k < 0 || k >= n/2) continue;
+
+                    if (!have || (m_r[k] > kvmax)) {
                         kmax = k;
                         kvmax = m_r[k];
                     }
-
-                    if (k == k0 - 2 || m_r[k] < kvmin) {
+                    
+                    if (!have || (m_r[k] < kvmin)) {
                         kmin = k;
                         kvmin = m_r[k];
                     }
+                    
+                    have = true;
                 }
+                
 
-                if (related[j] <= universalDiv) {
-//                    m_fr[i] += m_fr[kmax]; //!!!
-                    m_fr[i] += m_r[kmax] / related[j];
-                }
+                m_fr[i] += m_r[kmax] / 4;
 
-                if (m_r[kmax] > m_r[kmax-1] &&
-                    m_r[kmax] > m_r[kmax+1] &&
+//                if (related[j] <= universalDiv) {
+//                m_fr[i] += m_fr[kmax]; //!!!
+//                    m_fr[i] += m_r[kmax] / related[j];
+//                }
+
+                if ((kmax == 0 || m_r[kmax] > m_r[kmax-1]) &&
+                    (kmax == n/2-1 || m_r[kmax] > m_r[kmax+1]) &&
                     kvmax > kvmin * 1.05) {
-
-//                        cerr << "peak at " << i << " (val " << m_r[i] << ", tempo " << lag2tempo(i) << ") has sympathetic peak at " << kmax << " (val " << m_r[kmax] << " for relative tempo " << lag2tempo(kmax) * related[j] << ")" << endl;
+                    
+//                    cerr << "peak at " << i << " (val " << m_r[i] << ", tempo " << lag2tempo(i) << ") has sympathetic peak at " << kmax << " (val " << m_r[kmax] << " for relative tempo " << lag2tempo(kmax) * related[j] << ")" << endl;
 
                     m_t[i] = m_t[i] + lag2tempo(kmax) * related[j];
                     ++div;
                 }
             }
         }
-
+        
         m_t[i] /= div;
         
-//        if (div > 1) {
-//            cerr << "adjusting tempo from " << lag2tempo(i) << " to "
-//                      << m_t[i] << endl;
-//        }
+        if (div > 1) {
+            cerr << "adjusting tempo from " << lag2tempo(i) << " to "
+                 << m_t[i] << " for fr = " << m_fr[i] << " (div = " << div << ")" << endl;
+        }
+        
+        m_fr[i] += m_fr[i] * (weight / 5);
     }
 
 /*
@@ -505,8 +526,8 @@
         fs[ACFOutput].push_back(feature);
     }
 
-    float t0 = 60.f;
-    float t1 = 180.f;
+    float t0 = 50.f;
+    float t1 = 190.f;
 
     int p0 = tempo2lag(t1);
     int p1 = tempo2lag(t0);
@@ -523,7 +544,10 @@
 
     for (int i = p0; i <= p1 && i < n/2-1; ++i) {
 
-        candidates[m_fr[i]] = i;
+        if (m_fr[i] > m_fr[i-1] &&
+            m_fr[i] > m_fr[i+1]) {
+            candidates[m_fr[i]] = i;
+        }
 
         feature.timestamp = m_start +
             RealTime::frame2RealTime(i * m_stepSize, m_inputSampleRate);