annotate src/DistanceMetric.h @ 246:aac9ad4064ea subsequence tip

Fix incorrect handling of silent tail in the non-subsequence MATCH phase; some debug output changes
author Chris Cannam
date Fri, 24 Jul 2020 14:29:55 +0100
parents 39fe8728e1ca
children
rev   line source
Chris@26 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@26 2
Chris@26 3 /*
Chris@26 4 Vamp feature extraction plugin using the MATCH audio alignment
Chris@26 5 algorithm.
Chris@26 6
Chris@26 7 Centre for Digital Music, Queen Mary, University of London.
Chris@236 8 Copyright (c) 2007-2020 Simon Dixon, Chris Cannam, and Queen Mary
Chris@230 9 University of London, Copyright (c) 2014-2015 Tido GmbH.
Chris@26 10
Chris@26 11 This program is free software; you can redistribute it and/or
Chris@26 12 modify it under the terms of the GNU General Public License as
Chris@26 13 published by the Free Software Foundation; either version 2 of the
Chris@26 14 License, or (at your option) any later version. See the file
Chris@26 15 COPYING included with this distribution for more information.
Chris@26 16 */
Chris@26 17
Chris@26 18 #ifndef DISTANCE_METRIC_H
Chris@26 19 #define DISTANCE_METRIC_H
Chris@26 20
Chris@187 21 #include "MatchTypes.h"
Chris@26 22
Chris@26 23 class DistanceMetric
Chris@26 24 {
Chris@26 25 public:
Chris@156 26 enum Metric {
Chris@156 27
Chris@157 28 /** Calculate the Manhattan distance between feature
Chris@157 29 * vectors. If the vectors contain energy, as the default
Chris@157 30 * MATCH feature does, this could be considered as a squared
Chris@157 31 * Euclidean distance metric. */
Chris@157 32 Manhattan,
Chris@157 33
Chris@156 34 /** Calculate the Euclidean distance between feature vectors. */
Chris@156 35 Euclidean,
Chris@156 36
Chris@156 37 /** Calculate the cosine distance between feature vectors. The
Chris@156 38 * normalisation setting will be ignored as the result is
Chris@156 39 * already magnitude-independent. */
Chris@156 40 Cosine,
Chris@156 41 };
Chris@156 42
Chris@26 43 enum DistanceNormalisation {
Chris@26 44
Chris@26 45 /** Do not normalise distance metrics */
Chris@26 46 NoDistanceNormalisation,
Chris@26 47
Chris@26 48 /** Normalise distance metric for pairs of frames by the sum
Chris@26 49 * of the two frames. */
Chris@26 50 NormaliseDistanceToSum,
Chris@26 51
Chris@26 52 /** Normalise distance metric for pairs of frames by the log
Chris@26 53 * of the sum of the frames. */
Chris@26 54 NormaliseDistanceToLogSum,
Chris@26 55 };
Chris@156 56
Chris@150 57 enum NoiseAddition {
Chris@150 58
Chris@150 59 /** Don't add noise. */
Chris@150 60 NoNoise,
Chris@150 61
Chris@150 62 /** Add a constant noise term. This can help avoid
Chris@150 63 * mis-tracking when one file contains a lot of silence. */
Chris@150 64 AddNoise,
Chris@150 65 };
Chris@150 66
Chris@143 67 struct Parameters {
Chris@143 68
Chris@143 69 Parameters() :
Chris@157 70 metric(Manhattan),
Chris@150 71 norm(NormaliseDistanceToLogSum),
Chris@184 72 noise(AddNoise),
Chris@213 73 scale(150.)
Chris@143 74 {}
Chris@143 75
Chris@156 76 Metric metric;
Chris@143 77 DistanceNormalisation norm;
Chris@150 78 NoiseAddition noise;
Chris@184 79 double scale;
Chris@143 80 };
Chris@143 81
Chris@143 82 DistanceMetric(Parameters params);
Chris@190 83
Chris@190 84 ~DistanceMetric();
Chris@26 85
Chris@157 86 /** Calculates the distance in some metric between two vectors,
Chris@157 87 * with an optional normalisation by the combined values in the
Chris@157 88 * vectors. Note that normalisation assumes the values are all
Chris@157 89 * non-negative.
Chris@26 90 *
Chris@26 91 * @param f1 one of the vectors involved in the distance calculation
Chris@26 92 * @param f2 one of the vectors involved in the distance calculation
Chris@26 93 * @return the distance
Chris@26 94 */
Chris@183 95 distance_t calcDistance(const feature_t &f1,
Chris@183 96 const feature_t &f2);
Chris@186 97
Chris@186 98 /**
Chris@186 99 * Mostly for internal use and testing
Chris@186 100 */
Chris@186 101 distance_t scaleValueIntoDistanceRange(double value);
Chris@26 102
Chris@26 103 private:
Chris@143 104 Parameters m_params;
Chris@185 105
Chris@190 106 distance_t scaleAndTally(double);
Chris@185 107 template <typename T> T scaleIntoRange(double);
Chris@190 108
Chris@190 109 distance_t m_max;
Chris@190 110 int m_overcount;
Chris@26 111 };
Chris@26 112
Chris@26 113 #endif