Mercurial > hg > match-vamp
comparison Matcher.cpp @ 21:b15106b0abcd
Separate out feature extraction from distance calculations
author | Chris Cannam |
---|---|
date | Fri, 10 Oct 2014 15:58:19 +0100 |
parents | 47f98349aa17 |
children | 64c4c0cf80c9 |
comparison
equal
deleted
inserted
replaced
20:47f98349aa17 | 21:b15106b0abcd |
---|---|
194 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl; | 194 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl; |
195 } | 195 } |
196 } // makeChromaFrequencyMap() | 196 } // makeChromaFrequencyMap() |
197 | 197 |
198 vector<double> | 198 vector<double> |
199 Matcher::processFrame(double *reBuffer, double *imBuffer) | 199 Matcher::consumeFrame(double *reBuffer, double *imBuffer) |
200 { | 200 { |
201 if (!initialised) init(); | 201 if (!initialised) init(); |
202 | 202 |
203 vector<double> processedFrame = | |
204 processFrameFromFreqData(reBuffer, imBuffer); | |
205 | |
206 calcAdvance(); | |
207 | |
208 if ((frameCount % 100) == 0) { | |
209 if (!silent) { | |
210 cerr << "Progress:" << frameCount << " " << ltAverage << endl; | |
211 } | |
212 } | |
213 | |
214 return processedFrame; | |
215 } | |
216 | |
217 vector<double> | |
218 Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer) | |
219 { | |
203 for (int i = 0; i < (int)newFrame.size(); ++i) { | 220 for (int i = 0; i < (int)newFrame.size(); ++i) { |
204 newFrame[i] = 0; | 221 newFrame[i] = 0; |
205 } | 222 } |
206 double rms = 0; | 223 double rms = 0; |
207 for (int i = 0; i <= params.fftSize/2; i++) { | 224 for (int i = 0; i <= params.fftSize/2; i++) { |
210 rms += mag; | 227 rms += mag; |
211 newFrame[freqMap[i]] += mag; | 228 newFrame[freqMap[i]] += mag; |
212 } | 229 } |
213 rms = sqrt(rms / (params.fftSize/2)); | 230 rms = sqrt(rms / (params.fftSize/2)); |
214 | 231 |
232 int frameIndex = frameCount % blockSize; | |
233 | |
234 vector<double> processedFrame(freqMapSize, 0.0); | |
235 | |
236 double totalEnergy = 0; | |
237 if (params.useSpectralDifference) { | |
238 for (int i = 0; i < freqMapSize; i++) { | |
239 totalEnergy += newFrame[i]; | |
240 if (newFrame[i] > prevFrame[i]) { | |
241 processedFrame[i] = newFrame[i] - prevFrame[i]; | |
242 } else { | |
243 processedFrame[i] = 0; | |
244 } | |
245 } | |
246 } else { | |
247 for (int i = 0; i < freqMapSize; i++) { | |
248 processedFrame[i] = newFrame[i]; | |
249 totalEnergy += processedFrame[i]; | |
250 } | |
251 } | |
252 totalEnergies[frameIndex] = totalEnergy; | |
253 | |
254 double decay = frameCount >= 200 ? 0.99: | |
255 (frameCount < 100? 0: (frameCount - 100) / 100.0); | |
256 | |
257 if (ltAverage == 0) | |
258 ltAverage = totalEnergy; | |
259 else | |
260 ltAverage = ltAverage * decay + totalEnergy * (1.0 - decay); | |
261 | |
262 if (rms <= params.silenceThreshold) | |
263 for (int i = 0; i < freqMapSize; i++) | |
264 processedFrame[i] = 0; | |
265 else if (params.frameNorm == NormaliseFrameToSum1) | |
266 for (int i = 0; i < freqMapSize; i++) | |
267 processedFrame[i] /= totalEnergy; | |
268 else if (params.frameNorm == NormaliseFrameToLTAverage) | |
269 for (int i = 0; i < freqMapSize; i++) | |
270 processedFrame[i] /= ltAverage; | |
271 | |
272 vector<double> tmp = prevFrame; | |
273 prevFrame = newFrame; | |
274 newFrame = tmp; | |
275 | |
276 frames[frameIndex] = processedFrame; | |
277 | |
278 return processedFrame; | |
279 } | |
280 | |
281 void | |
282 Matcher::calcAdvance() | |
283 { | |
215 int frameIndex = frameCount % blockSize; | 284 int frameIndex = frameCount % blockSize; |
216 | 285 |
217 if (frameCount >= distXSize) { | 286 if (frameCount >= distXSize) { |
218 // std::cerr << "Resizing " << distXSize << " -> " << distXSize * 2 << std::endl; | 287 // std::cerr << "Resizing " << distXSize << " -> " << distXSize * 2 << std::endl; |
219 distXSize *= 2; | 288 distXSize *= 2; |
261 } | 330 } |
262 | 331 |
263 distYSizes[frameCount] = distYSizes[frameCount - blockSize]; | 332 distYSizes[frameCount] = distYSizes[frameCount - blockSize]; |
264 distYSizes[frameCount - blockSize] = len; | 333 distYSizes[frameCount - blockSize] = len; |
265 } | 334 } |
266 | |
267 double totalEnergy = 0; | |
268 if (params.useSpectralDifference) { | |
269 for (int i = 0; i < freqMapSize; i++) { | |
270 totalEnergy += newFrame[i]; | |
271 if (newFrame[i] > prevFrame[i]) { | |
272 frames[frameIndex][i] = newFrame[i] - prevFrame[i]; | |
273 } else { | |
274 frames[frameIndex][i] = 0; | |
275 } | |
276 } | |
277 } else { | |
278 for (int i = 0; i < freqMapSize; i++) { | |
279 frames[frameIndex][i] = newFrame[i]; | |
280 totalEnergy += frames[frameIndex][i]; | |
281 } | |
282 } | |
283 totalEnergies[frameIndex] = totalEnergy; | |
284 | |
285 double decay = frameCount >= 200 ? 0.99: | |
286 (frameCount < 100? 0: (frameCount - 100) / 100.0); | |
287 | |
288 if (ltAverage == 0) | |
289 ltAverage = totalEnergy; | |
290 else | |
291 ltAverage = ltAverage * decay + totalEnergy * (1.0 - decay); | |
292 | |
293 if (rms <= params.silenceThreshold) | |
294 for (int i = 0; i < freqMapSize; i++) | |
295 frames[frameIndex][i] = 0; | |
296 else if (params.frameNorm == NormaliseFrameToSum1) | |
297 for (int i = 0; i < freqMapSize; i++) | |
298 frames[frameIndex][i] /= totalEnergy; | |
299 else if (params.frameNorm == NormaliseFrameToLTAverage) | |
300 for (int i = 0; i < freqMapSize; i++) | |
301 frames[frameIndex][i] /= ltAverage; | |
302 | |
303 vector<double> processedFrame = frames[frameIndex]; | |
304 | 335 |
305 int stop = otherMatcher->frameCount; | 336 int stop = otherMatcher->frameCount; |
306 int index = stop - blockSize; | 337 int index = stop - blockSize; |
307 if (index < 0) | 338 if (index < 0) |
308 index = 0; | 339 index = 0; |
366 } | 397 } |
367 } | 398 } |
368 otherMatcher->last[index]++; | 399 otherMatcher->last[index]++; |
369 } // loop for row (resp. column) | 400 } // loop for row (resp. column) |
370 | 401 |
371 vector<double> tmp = prevFrame; | |
372 prevFrame = newFrame; | |
373 newFrame = tmp; | |
374 | |
375 frameCount++; | 402 frameCount++; |
376 runCount++; | 403 runCount++; |
377 | 404 |
378 otherMatcher->runCount = 0; | 405 otherMatcher->runCount = 0; |
379 | 406 |
380 if (overflow && !silent) | 407 if (overflow && !silent) |
381 cerr << "WARNING: overflow in distance metric: " | 408 cerr << "WARNING: overflow in distance metric: " |
382 << "frame " << frameCount << ", val = " << mx << endl; | 409 << "frame " << frameCount << ", val = " << mx << endl; |
383 | 410 |
384 if (!silent) | 411 if (!silent) |
385 std::cerr << "Frame " << frameCount << ", d = " << (mx-mn) << std::endl; | 412 std::cerr << "Frame " << frameCount << ", d = " << (mx-mn) << std::endl; |
386 | 413 } |
387 if ((frameCount % 100) == 0) { | |
388 if (!silent) { | |
389 cerr << "Progress:" << frameCount << " " << ltAverage << endl; | |
390 } | |
391 } | |
392 | |
393 return processedFrame; | |
394 } // processFrame() | |
395 | 414 |
396 int | 415 int |
397 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2) | 416 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2) |
398 { | 417 { |
399 double d = 0; | 418 double d = 0; |