# HG changeset patch # User Chris Cannam # Date 1200667251 0 # Node ID 26a2e341d35883c596919d69a63f913c4a005f9d # Parent 5d7ce1d87301e6e4eafa3232eb1efa5650c6a73b * Use KLDivergence in separate file diff -r 5d7ce1d87301 -r 26a2e341d358 plugins/SimilarityPlugin.cpp --- a/plugins/SimilarityPlugin.cpp Fri Jan 18 13:30:56 2008 +0000 +++ b/plugins/SimilarityPlugin.cpp Fri Jan 18 14:40:51 2008 +0000 @@ -15,6 +15,7 @@ #include "dsp/mfcc/MFCC.h" #include "dsp/chromagram/Chromagram.h" #include "dsp/rateconversion/Decimator.h" +#include "maths/KLDivergence.cpp" using std::string; using std::vector; @@ -483,23 +484,13 @@ // form exists for the KL divergence." -- Mark Levy, "Lightweight // measures for timbral similarity of musical audio" // (http://www.elec.qmul.ac.uk/easaier/papers/mlevytimbralsimilarity.pdf) - // - // This code calculates a symmetrised distance metric based on the - // KL divergence of Gaussian models of the MFCC values. + + KLDivergence kld; for (int i = 0; i < m_channels; ++i) { distances.push_back(std::vector()); for (int j = 0; j < m_channels; ++j) { - double d = -2.0 * m_featureColumnSize; - for (int k = 0; k < m_featureColumnSize; ++k) { - // m[i][k] is the mean of feature bin k for channel i - // v[i][k] is the variance of feature bin k for channel i - d += v[i][k] / v[j][k] + v[j][k] / v[i][k]; - d += (m[i][k] - m[j][k]) - * (1.0 / v[i][k] + 1.0 / v[j][k]) - * (m[i][k] - m[j][k]); - } - d /= 2.0; + double d = kld.distance(m[i], v[i], m[j], v[j]); distances[i].push_back(d); } }