annotate maths/KLDivergence.cpp @ 74:769da847732b

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