Chris@26: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@26: Chris@26: /* Chris@26: Vamp feature extraction plugin using the MATCH audio alignment Chris@26: algorithm. Chris@26: Chris@26: Centre for Digital Music, Queen Mary, University of London. Chris@26: This file copyright 2007 Simon Dixon, Chris Cannam and QMUL. Chris@26: Chris@26: This program is free software; you can redistribute it and/or Chris@26: modify it under the terms of the GNU General Public License as Chris@26: published by the Free Software Foundation; either version 2 of the Chris@26: License, or (at your option) any later version. See the file Chris@26: COPYING included with this distribution for more information. Chris@26: */ Chris@26: Chris@26: #include "DistanceMetric.h" Chris@26: Chris@26: #include Chris@26: #include Chris@26: Chris@26: using std::vector; Chris@26: Chris@26: double Chris@26: DistanceMetric::calcDistance(const vector &f1, Chris@26: const vector &f2) Chris@26: { Chris@26: double d = 0; Chris@26: double sum = 0; Chris@26: Chris@26: int featureSize = f1.size(); Chris@26: assert(int(f2.size()) == featureSize); Chris@26: Chris@26: for (int i = 0; i < featureSize; i++) { Chris@26: d += fabs(f1[i] - f2[i]); Chris@116: sum += fabs(f1[i]) + fabs(f2[i]); Chris@26: } Chris@26: Chris@26: if (sum == 0) Chris@26: return 0; Chris@26: if (m_norm == NormaliseDistanceToSum) Chris@26: return d / sum; // 0 <= d/sum <= 2 Chris@26: if (m_norm != NormaliseDistanceToLogSum) Chris@26: return d; Chris@26: Chris@26: // note if this were to be restored, it would have to use Chris@26: // totalEnergies vector instead of f1[freqMapSize] which used to Chris@26: // store the total energy: Chris@26: // double weight = (5 + Math.log(f1[freqMapSize] + f2[freqMapSize]))/10.0; Chris@26: Chris@26: double weight = (8 + log(sum)) / 10.0; Chris@26: Chris@26: if (weight < 0) weight = 0; Chris@26: else if (weight > 1) weight = 1; Chris@26: Chris@26: return d / sum * weight; Chris@26: } Chris@26: