Mercurial > hg > match-vamp
comparison Matcher.cpp @ 23:64c4c0cf80c9
Add alternate Matcher API calls to provide external feature data
author | Chris Cannam |
---|---|
date | Fri, 10 Oct 2014 16:27:45 +0100 |
parents | b15106b0abcd |
children | 9f60d097f0b2 |
comparison
equal
deleted
inserted
replaced
22:ac39717fc88d | 23:64c4c0cf80c9 |
---|---|
35 otherMatcher = p; // the first matcher will need this to be set later | 35 otherMatcher = p; // the first matcher will need this to be set later |
36 firstPM = (!p); | 36 firstPM = (!p); |
37 ltAverage = 0; | 37 ltAverage = 0; |
38 frameCount = 0; | 38 frameCount = 0; |
39 runCount = 0; | 39 runCount = 0; |
40 freqMapSize = 0; | |
41 externalFeatureSize = 0; | |
42 featureSize = 0; | |
40 blockSize = 0; | 43 blockSize = 0; |
41 scale = 90; | 44 scale = 90; |
42 | 45 |
43 blockSize = lrint(params.blockTime / params.hopTime); | 46 blockSize = lrint(params.blockTime / params.hopTime); |
44 #ifdef DEBUG_MATCHER | 47 #ifdef DEBUG_MATCHER |
49 bestPathCost = 0; | 52 bestPathCost = 0; |
50 distYSizes = 0; | 53 distYSizes = 0; |
51 distXSize = 0; | 54 distXSize = 0; |
52 | 55 |
53 initialised = false; | 56 initialised = false; |
54 | 57 } |
55 } // default constructor | 58 |
59 Matcher::Matcher(Parameters parameters, Matcher *p, int featureSize) : | |
60 params(parameters), | |
61 externalFeatureSize(featureSize) | |
62 { | |
63 #ifdef DEBUG_MATCHER | |
64 cerr << "Matcher::Matcher(" << params.sampleRate << ", " << p << ", " << featureSize << ")" << endl; | |
65 #endif | |
66 | |
67 otherMatcher = p; // the first matcher will need this to be set later | |
68 firstPM = (!p); | |
69 ltAverage = 0; | |
70 frameCount = 0; | |
71 runCount = 0; | |
72 freqMapSize = 0; | |
73 featureSize = 0; | |
74 blockSize = 0; | |
75 scale = 90; | |
76 | |
77 blockSize = lrint(params.blockTime / params.hopTime); | |
78 #ifdef DEBUG_MATCHER | |
79 cerr << "Matcher: blockSize = " << blockSize << endl; | |
80 #endif | |
81 | |
82 distance = 0; | |
83 bestPathCost = 0; | |
84 distYSizes = 0; | |
85 distXSize = 0; | |
86 | |
87 initialised = false; | |
88 | |
89 } | |
56 | 90 |
57 Matcher::~Matcher() | 91 Matcher::~Matcher() |
58 { | 92 { |
59 #ifdef DEBUG_MATCHER | 93 #ifdef DEBUG_MATCHER |
60 cerr << "Matcher(" << this << ")::~Matcher()" << endl; | 94 cerr << "Matcher(" << this << ")::~Matcher()" << endl; |
83 { | 117 { |
84 if (initialised) return; | 118 if (initialised) return; |
85 | 119 |
86 initialised = true; | 120 initialised = true; |
87 | 121 |
88 freqMapSize = getFeatureSize(params); | 122 if (externalFeatureSize == 0) { |
89 | 123 freqMapSize = getFeatureSizeFor(params); |
90 makeFreqMap(); | 124 featureSize = freqMapSize; |
91 | 125 makeFreqMap(); |
92 initVector<double>(prevFrame, freqMapSize); | 126 } else { |
93 initVector<double>(newFrame, freqMapSize); | 127 featureSize = externalFeatureSize; |
94 initMatrix<double>(frames, blockSize, freqMapSize); | 128 } |
129 | |
130 initVector<double>(prevFrame, featureSize); | |
131 initVector<double>(newFrame, featureSize); | |
132 initMatrix<double>(frames, blockSize, featureSize); | |
95 initVector<double>(totalEnergies, blockSize); | 133 initVector<double>(totalEnergies, blockSize); |
96 | 134 |
97 int distSize = (params.maxRunCount + 1) * blockSize; | 135 int distSize = (params.maxRunCount + 1) * blockSize; |
98 | 136 |
99 distXSize = blockSize * 2; | 137 distXSize = blockSize * 2; |
122 | 160 |
123 void | 161 void |
124 Matcher::makeFreqMap() | 162 Matcher::makeFreqMap() |
125 { | 163 { |
126 initVector<int>(freqMap, params.fftSize/2 + 1); | 164 initVector<int>(freqMap, params.fftSize/2 + 1); |
165 | |
127 if (params.useChromaFrequencyMap) { | 166 if (params.useChromaFrequencyMap) { |
128 #ifdef DEBUG_MATCHER | 167 #ifdef DEBUG_MATCHER |
129 cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl; | 168 cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl; |
130 #endif | 169 #endif |
131 makeChromaFrequencyMap(); | 170 makeChromaFrequencyMap(); |
136 makeStandardFrequencyMap(); | 175 makeStandardFrequencyMap(); |
137 } | 176 } |
138 } // makeFreqMap() | 177 } // makeFreqMap() |
139 | 178 |
140 int | 179 int |
141 Matcher::getFeatureSize(Parameters params) | 180 Matcher::getFeatureSizeFor(Parameters params) |
142 { | 181 { |
143 if (params.useChromaFrequencyMap) { | 182 if (params.useChromaFrequencyMap) { |
144 return 13; | 183 return 13; |
145 } else { | 184 } else { |
146 return 84; | 185 return 84; |
203 vector<double> processedFrame = | 242 vector<double> processedFrame = |
204 processFrameFromFreqData(reBuffer, imBuffer); | 243 processFrameFromFreqData(reBuffer, imBuffer); |
205 | 244 |
206 calcAdvance(); | 245 calcAdvance(); |
207 | 246 |
208 if ((frameCount % 100) == 0) { | |
209 if (!silent) { | |
210 cerr << "Progress:" << frameCount << " " << ltAverage << endl; | |
211 } | |
212 } | |
213 | |
214 return processedFrame; | 247 return processedFrame; |
248 } | |
249 | |
250 void | |
251 Matcher::consumeFeatureVector(std::vector<double> feature) | |
252 { | |
253 if (!initialised) init(); | |
254 int frameIndex = frameCount % blockSize; | |
255 frames[frameIndex] = feature; | |
256 calcAdvance(); | |
215 } | 257 } |
216 | 258 |
217 vector<double> | 259 vector<double> |
218 Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer) | 260 Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer) |
219 { | 261 { |
272 vector<double> tmp = prevFrame; | 314 vector<double> tmp = prevFrame; |
273 prevFrame = newFrame; | 315 prevFrame = newFrame; |
274 newFrame = tmp; | 316 newFrame = tmp; |
275 | 317 |
276 frames[frameIndex] = processedFrame; | 318 frames[frameIndex] = processedFrame; |
319 | |
320 if ((frameCount % 100) == 0) { | |
321 if (!silent) { | |
322 cerr << "Progress:" << frameCount << " " << ltAverage << endl; | |
323 } | |
324 } | |
277 | 325 |
278 return processedFrame; | 326 return processedFrame; |
279 } | 327 } |
280 | 328 |
281 void | 329 void |
415 int | 463 int |
416 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2) | 464 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2) |
417 { | 465 { |
418 double d = 0; | 466 double d = 0; |
419 double sum = 0; | 467 double sum = 0; |
420 for (int i = 0; i < freqMapSize; i++) { | 468 for (int i = 0; i < featureSize; i++) { |
421 d += fabs(f1[i] - f2[i]); | 469 d += fabs(f1[i] - f2[i]); |
422 sum += f1[i] + f2[i]; | 470 sum += f1[i] + f2[i]; |
423 } | 471 } |
424 // System.err.print(" " + Format.d(d,3)); | 472 // System.err.print(" " + Format.d(d,3)); |
425 if (sum == 0) | 473 if (sum == 0) |