changeset 46:26a2e341d358

* Use KLDivergence in separate file
author Chris Cannam <c.cannam@qmul.ac.uk>
date Fri, 18 Jan 2008 14:40:51 +0000
parents 5d7ce1d87301
children f8c5f11e60a6
files plugins/SimilarityPlugin.cpp
diffstat 1 files changed, 4 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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<double>());
         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);
         }
     }