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;