annotate maths/KLDivergence.cpp @ 299:5f2c9119a94a

* A few fixes prompted by vamp-plugin-tester
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 08 Jun 2009 12:30:20 +0000
parents f49be56d3c4e
children e5907ae6de17
rev   line source
c@256 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@256 2
c@256 3 /*
c@256 4 QM DSP Library
c@256 5
c@256 6 Centre for Digital Music, Queen Mary, University of London.
c@256 7 This file copyright 2008 QMUL
c@256 8 All rights reserved.
c@256 9 */
c@256 10
c@256 11 #include "KLDivergence.h"
c@256 12
c@258 13 #include <cmath>
c@258 14
c@258 15 double KLDivergence::distanceGaussian(const vector<double> &m1,
c@258 16 const vector<double> &v1,
c@258 17 const vector<double> &m2,
c@258 18 const vector<double> &v2)
c@256 19 {
c@256 20 int sz = m1.size();
c@256 21
c@256 22 double d = -2.0 * sz;
c@299 23 double small = 1e-20;
c@256 24
c@256 25 for (int k = 0; k < sz; ++k) {
c@299 26
c@299 27 double kv1 = v1[k] + small;
c@299 28 double kv2 = v2[k] + small;
c@299 29 double km = (m1[k] - m2[k]) + small;
c@299 30
c@299 31 d += kv1 / kv2 + kv2 / kv1;
c@299 32 d += km * (1.0 / kv1 + 1.0 / kv2) * km;
c@256 33 }
c@256 34
c@256 35 d /= 2.0;
c@256 36
c@256 37 return d;
c@256 38 }
c@258 39
c@258 40 double KLDivergence::distanceDistribution(const vector<double> &d1,
c@258 41 const vector<double> &d2,
c@258 42 bool symmetrised)
c@258 43 {
c@258 44 int sz = d1.size();
c@258 45
c@258 46 double d = 0;
c@258 47 double small = 1e-20;
c@258 48
c@258 49 for (int i = 0; i < sz; ++i) {
c@258 50 d += d1[i] * log10((d1[i] + small) / (d2[i] + small));
c@258 51 }
c@258 52
c@258 53 if (symmetrised) {
c@258 54 d += distanceDistribution(d2, d1, false);
c@258 55 }
c@258 56
c@258 57 return d;
c@258 58 }
c@258 59