update qm-dsp library
[ardour.git] / libs / qm-dsp / dsp / tempotracking / DownBeat.cpp
index 1167bc6ea98f3d279d6a15f9b9cef5531550ac2c..8570da6a17ef4047c906cd564dd088556021a3e1 100644 (file)
@@ -44,7 +44,10 @@ DownBeat::DownBeat(float originalSampleRate,
     // 16x decimation, which is our expected normal situation)
     m_beatframesize = MathUtilities::nextPowerOfTwo
         (int((m_rate / decimationFactor) * 1.3));
-//    std::cerr << "rate = " << m_rate << ", bfs = " << m_beatframesize << std::endl;
+    if (m_beatframesize < 2) {
+        m_beatframesize = 2;
+    }
+//    std::cerr << "rate = " << m_rate << ", dec = " << decimationFactor << ", bfs = " << m_beatframesize << std::endl;
     m_beatframe = new double[m_beatframesize];
     m_fftRealOut = new double[m_beatframesize];
     m_fftImagOut = new double[m_beatframesize];
@@ -122,7 +125,7 @@ DownBeat::pushAudioBlock(const float *audio)
 //    std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl;
     m_buffill += m_increment / m_factor;
 }
-
+    
 const float *
 DownBeat::getBufferedAudio(size_t &length) const
 {
@@ -192,9 +195,9 @@ DownBeat::findDownBeats(const float *audio,
         }
 
         // Now FFT beat frame
-
-        m_fft->process(false, m_beatframe, m_fftRealOut, m_fftImagOut);
-
+        
+        m_fft->forward(m_beatframe, m_fftRealOut, m_fftImagOut);
+        
         // Calculate magnitudes
 
         for (size_t j = 0; j < m_beatframesize/2; ++j) {
@@ -257,7 +260,7 @@ DownBeat::measureSpecDiff(d_vec_t oldspec, d_vec_t newspec)
 {
     // JENSEN-SHANNON DIVERGENCE BETWEEN SPECTRAL FRAMES
 
-    unsigned int SPECSIZE = 512;   // ONLY LOOK AT FIRST 512 SAMPLES OF SPECTRUM.
+    unsigned int SPECSIZE = 512;   // ONLY LOOK AT FIRST 512 SAMPLES OF SPECTRUM. 
     if (SPECSIZE > oldspec.size()/4) {
         SPECSIZE = oldspec.size()/4;
     }
@@ -266,37 +269,37 @@ DownBeat::measureSpecDiff(d_vec_t oldspec, d_vec_t newspec)
 
     double sumnew = 0.;
     double sumold = 0.;
-
+  
     for (unsigned int i = 0;i < SPECSIZE;i++)
     {
         newspec[i] +=EPS;
         oldspec[i] +=EPS;
-
+        
         sumnew+=newspec[i];
         sumold+=oldspec[i];
-    }
-
+    } 
+    
     for (unsigned int i = 0;i < SPECSIZE;i++)
     {
         newspec[i] /= (sumnew);
         oldspec[i] /= (sumold);
-
+        
         // IF ANY SPECTRAL VALUES ARE 0 (SHOULDN'T BE ANY!) SET THEM TO 1
         if (newspec[i] == 0)
         {
             newspec[i] = 1.;
         }
-
+        
         if (oldspec[i] == 0)
         {
             oldspec[i] = 1.;
         }
-
+        
         // JENSEN-SHANNON CALCULATION
-        sd1 = 0.5*oldspec[i] + 0.5*newspec[i];
+        sd1 = 0.5*oldspec[i] + 0.5*newspec[i]; 
         SD = SD + (-sd1*log(sd1)) + (0.5*(oldspec[i]*log(oldspec[i]))) + (0.5*(newspec[i]*log(newspec[i])));
     }
-
+    
     return SD;
 }