Mercurial > hg > qm-vamp-plugins
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;