diff plugins/SimilarityPlugin.cpp @ 60:90fa946fda40

* Add key strength plot to key detector * Fix vector overrun in similarity plugin if some empty frames have been encountered * Fix uninitialised m_count in MFCC plugin * Doc update
author Chris Cannam <c.cannam@qmul.ac.uk>
date Fri, 01 Feb 2008 16:47:39 +0000
parents ee9d180a5ad6
children 12516e68c81e
line wrap: on
line diff
--- a/plugins/SimilarityPlugin.cpp	Thu Jan 31 12:04:59 2008 +0000
+++ b/plugins/SimilarityPlugin.cpp	Fri Feb 01 16:47:39 2008 +0000
@@ -148,6 +148,10 @@
 
     m_lastNonEmptyFrame = std::vector<int>(m_channels);
     for (int i = 0; i < m_channels; ++i) m_lastNonEmptyFrame[i] = -1;
+
+    m_emptyFrameCount = std::vector<int>(m_channels);
+    for (int i = 0; i < m_channels; ++i) m_emptyFrameCount[i] = 0;
+
     m_frameNo = 0;
 
     int decimationFactor = getDecimationFactor();
@@ -204,12 +208,12 @@
         m_rhythmClipFrames =
             int(ceil((m_rhythmClipDuration * m_processRate) 
                      / m_rhythmClipFrameSize));
-        std::cerr << "SimilarityPlugin::initialise: rhythm clip is "
-                  << m_rhythmClipFrames << " frames of size "
-                  << m_rhythmClipFrameSize << " at process rate "
-                  << m_processRate << " ( = "
-                  << (float(m_rhythmClipFrames * m_rhythmClipFrameSize) / m_processRate) << " sec )"
-                  << std::endl;
+//        std::cerr << "SimilarityPlugin::initialise: rhythm clip requires "
+//                  << m_rhythmClipFrames << " frames of size "
+//                  << m_rhythmClipFrameSize << " at process rate "
+//                  << m_processRate << " ( = "
+//                  << (float(m_rhythmClipFrames * m_rhythmClipFrameSize) / m_processRate) << " sec )"
+//                  << std::endl;
 
         MFCCConfig config(m_processRate);
         config.fftsize = m_rhythmClipFrameSize;
@@ -245,6 +249,14 @@
         m_rhythmValues[i].clear();
     }
 
+    for (int i = 0; i < m_lastNonEmptyFrame.size(); ++i) {
+        m_lastNonEmptyFrame[i] = -1;
+    }
+
+    for (int i = 0; i < m_emptyFrameCount.size(); ++i) {
+        m_emptyFrameCount[i] = 0;
+    }
+
     m_done = false;
 }
 
@@ -536,6 +548,7 @@
                     }
                 }
             }
+            m_emptyFrameCount[c]++;
             continue;
         }
 
@@ -645,8 +658,9 @@
             // We want to take values up to, but not including, the
             // last non-empty frame (which may be partial)
 
-            int sz = m_lastNonEmptyFrame[i];
+            int sz = m_lastNonEmptyFrame[i] - m_emptyFrameCount[i];
             if (sz < 0) sz = 0;
+            if (sz >= m_values[i].size()) sz = m_values[i].size()-1;
 
             count = 0;
             for (int k = 0; k < sz; ++k) {
@@ -752,6 +766,13 @@
 {
     if (!needRhythm()) return FeatureMatrix();
 
+//        std::cerr << "SimilarityPlugin::initialise: rhythm clip for channel 0 contains "
+//                  << m_rhythmValues[0].size() << " frames of size "
+//                  << m_rhythmClipFrameSize << " at process rate "
+//                  << m_processRate << " ( = "
+//                  << (float(m_rhythmValues[0].size() * m_rhythmClipFrameSize) / m_processRate) << " sec )"
+//                  << std::endl;
+
     BeatSpectrum bscalc;
     CosineDistance cd;