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
|