Mercurial > hg > vamp-tempogram
comparison TempogramPlugin.cpp @ 20:de7213b35755
* Removed warnings of comparisons with ints and size_t
author | Carl Bussey <c.bussey@se10.qmul.ac.uk> |
---|---|
date | Fri, 15 Aug 2014 15:17:28 +0100 |
parents | e90a4797e579 |
children | 12b952286959 |
comparison
equal
deleted
inserted
replaced
19:e90a4797e579 | 20:de7213b35755 |
---|---|
381 list.push_back(d3); | 381 list.push_back(d3); |
382 | 382 |
383 return list; | 383 return list; |
384 } | 384 } |
385 | 385 |
386 void TempogramPlugin::checkParameterValues(){ | |
387 | |
388 if (m_tempogramFftLength < m_tempogramWindowLength){ | |
389 m_tempogramFftLength = m_tempogramWindowLength; | |
390 } | |
391 if (m_tempogramMinBPM > m_tempogramMaxBPM){ | |
392 m_tempogramMinBPM = 30; | |
393 m_tempogramMaxBPM = 480; | |
394 } | |
395 | |
396 float tempogramInputSampleRate = (float)m_inputSampleRate/m_inputStepSize; | |
397 m_tempogramMinBin = (unsigned int)(max(floor(((m_tempogramMinBPM/60)/tempogramInputSampleRate)*m_tempogramFftLength), (float)0.0)); | |
398 m_tempogramMaxBin = (unsigned int)(min(ceil(((m_tempogramMaxBPM/60)/tempogramInputSampleRate)*m_tempogramFftLength), (float)m_tempogramFftLength/2)); | |
399 | |
400 if (m_tempogramMinBPM > m_cyclicTempogramMinBPM) m_cyclicTempogramMinBPM = m_tempogramMinBPM; | |
401 float cyclicTempogramMaxBPM = 480; | |
402 if (m_tempogramMaxBPM < cyclicTempogramMaxBPM) cyclicTempogramMaxBPM = m_tempogramMaxBPM; | |
403 | |
404 m_cyclicTempogramNumberOfOctaves = floor(log2(cyclicTempogramMaxBPM/m_cyclicTempogramMinBPM)); | |
405 int numberOfBinsInFirstOctave = bpmToBin(m_cyclicTempogramMinBPM); | |
406 if (m_cyclicTempogramOctaveDivider > numberOfBinsInFirstOctave) m_cyclicTempogramOctaveDivider = numberOfBinsInFirstOctave; | |
407 | |
408 } | |
409 | |
386 bool | 410 bool |
387 TempogramPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) | 411 TempogramPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) |
388 { | 412 { |
389 if (channels < getMinChannelCount() || | 413 if (channels < getMinChannelCount() || |
390 channels > getMaxChannelCount()) return false; | 414 channels > getMaxChannelCount()) return false; |
391 | 415 |
392 // Real initialisation work goes here! | 416 // Real initialisation work goes here! |
393 m_inputBlockSize = blockSize; | 417 m_inputBlockSize = blockSize; |
394 m_inputStepSize = stepSize; | 418 m_inputStepSize = stepSize; |
395 | 419 |
396 m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2 + 1); | 420 m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2.0f + 1); |
397 | 421 checkParameterValues(); |
398 if (m_tempogramFftLength < m_tempogramWindowLength){ | |
399 m_tempogramFftLength = m_tempogramWindowLength; | |
400 } | |
401 if (m_tempogramMinBPM > m_tempogramMaxBPM){ | |
402 m_tempogramMinBPM = 30; | |
403 m_tempogramMaxBPM = 480; | |
404 } | |
405 | |
406 float tempogramInputSampleRate = (float)m_inputSampleRate/m_inputStepSize; | |
407 m_tempogramMinBin = (unsigned int)(max(floor(((m_tempogramMinBPM/60)/tempogramInputSampleRate)*m_tempogramFftLength), (float)0.0)); | |
408 m_tempogramMaxBin = (unsigned int)(min(ceil(((m_tempogramMaxBPM/60)/tempogramInputSampleRate)*m_tempogramFftLength), (float)m_tempogramFftLength/2)); | |
409 | |
410 if (m_tempogramMinBPM > m_cyclicTempogramMinBPM) m_cyclicTempogramMinBPM = m_tempogramMinBPM; | |
411 float cyclicTempogramMaxBPM = 480; | |
412 if (m_tempogramMaxBPM < cyclicTempogramMaxBPM) cyclicTempogramMaxBPM = m_tempogramMaxBPM; | |
413 | |
414 m_cyclicTempogramNumberOfOctaves = floor(log2(cyclicTempogramMaxBPM/m_cyclicTempogramMinBPM)); | |
415 int numberOfBinsInFirstOctave = bpmToBin(m_cyclicTempogramMinBPM); | |
416 if (m_cyclicTempogramOctaveDivider > numberOfBinsInFirstOctave) m_cyclicTempogramOctaveDivider = numberOfBinsInFirstOctave; | |
417 | |
418 //cout << m_cyclicTempogramOctaveDivider << endl; | 422 //cout << m_cyclicTempogramOctaveDivider << endl; |
419 | 423 |
420 return true; | 424 return true; |
421 } | 425 } |
422 | 426 |
423 void | 427 void |
424 TempogramPlugin::reset() | 428 TempogramPlugin::reset() |
425 { | 429 { |
426 // Clear buffers, reset stored values, etc | 430 // Clear buffers, reset stored values, etc |
427 m_spectrogram.clear(); | 431 m_spectrogram.clear(); |
428 m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2 + 1); | 432 m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2.0f + 1); |
433 checkParameterValues(); | |
429 } | 434 } |
430 | 435 |
431 TempogramPlugin::FeatureSet | 436 TempogramPlugin::FeatureSet |
432 TempogramPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp) | 437 TempogramPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp) |
433 { | 438 { |
437 Feature feature; | 442 Feature feature; |
438 | 443 |
439 const float *in = inputBuffers[0]; | 444 const float *in = inputBuffers[0]; |
440 | 445 |
441 //calculate magnitude of FrequencyDomain input | 446 //calculate magnitude of FrequencyDomain input |
442 for (unsigned int i = 0; i < n; i++){ | 447 for (int i = 0; i < (int)n; i++){ |
443 float magnitude = sqrt(in[2*i] * in[2*i] + in[2*i + 1] * in[2*i + 1]); | 448 float magnitude = sqrt(in[2*i] * in[2*i] + in[2*i + 1] * in[2*i + 1]); |
444 magnitude = magnitude > m_noveltyCurveMinDB ? magnitude : m_noveltyCurveMinDB; | 449 magnitude = magnitude > m_noveltyCurveMinDB ? magnitude : m_noveltyCurveMinDB; |
445 m_spectrogram[i].push_back(magnitude); | 450 m_spectrogram[i].push_back(magnitude); |
446 } | 451 } |
447 | 452 |
455 for (int i = 0; i < (int)ceil(m_cyclicTempogramNumberOfOctaves*m_cyclicTempogramOctaveDivider); i++){ | 460 for (int i = 0; i < (int)ceil(m_cyclicTempogramNumberOfOctaves*m_cyclicTempogramOctaveDivider); i++){ |
456 float bpm = m_cyclicTempogramMinBPM*pow(2.0f, (float)i/m_cyclicTempogramOctaveDivider); | 461 float bpm = m_cyclicTempogramMinBPM*pow(2.0f, (float)i/m_cyclicTempogramOctaveDivider); |
457 int bin = bpmToBin(bpm); | 462 int bin = bpmToBin(bpm); |
458 | 463 |
459 logBins.push_back(bin); | 464 logBins.push_back(bin); |
460 cerr << bin << endl; | 465 //cerr << bin << endl; |
461 } | 466 } |
462 | 467 |
463 cerr << logBins.size() << endl; | 468 //cerr << logBins.size() << endl; |
464 | 469 |
465 return logBins; | 470 return logBins; |
466 } | 471 } |
467 | 472 |
468 int TempogramPlugin::bpmToBin(const float &bpm) const | 473 int TempogramPlugin::bpmToBin(const float &bpm) const |
470 float w = (float)bpm/60; | 475 float w = (float)bpm/60; |
471 float sampleRate = m_inputSampleRate/m_inputStepSize; | 476 float sampleRate = m_inputSampleRate/m_inputStepSize; |
472 int bin = floor((float)m_tempogramFftLength*w/sampleRate + 0.5); | 477 int bin = floor((float)m_tempogramFftLength*w/sampleRate + 0.5); |
473 | 478 |
474 if(bin < 0) bin = 0; | 479 if(bin < 0) bin = 0; |
475 else if(bin > m_tempogramFftLength/2) bin = m_tempogramFftLength; | 480 else if(bin > m_tempogramFftLength/2.0f) bin = m_tempogramFftLength; |
476 | 481 |
477 return bin; | 482 return bin; |
478 } | 483 } |
479 | 484 |
480 TempogramPlugin::FeatureSet | 485 TempogramPlugin::FeatureSet |
481 TempogramPlugin::getRemainingFeatures() | 486 TempogramPlugin::getRemainingFeatures() |
482 { | 487 { |
483 | 488 |
484 float * hannWindow = new float[m_tempogramWindowLength]; | 489 float * hannWindow = new float[m_tempogramWindowLength]; |
485 for (unsigned int i = 0; i < m_tempogramWindowLength; i++){ | 490 for (int i = 0; i < (int)m_tempogramWindowLength; i++){ |
486 hannWindow[i] = 0.0; | 491 hannWindow[i] = 0.0; |
487 } | 492 } |
488 | 493 |
489 FeatureSet featureSet; | 494 FeatureSet featureSet; |
490 | 495 |
491 //initialise novelty curve processor | 496 //initialise novelty curve processor |
492 size_t numberOfBlocks = m_spectrogram[0].size(); | 497 size_t numberOfBlocks = m_spectrogram[0].size(); |
498 //cerr << numberOfBlocks << endl; | |
493 NoveltyCurveProcessor nc(m_inputSampleRate, m_inputBlockSize, numberOfBlocks, m_noveltyCurveCompressionConstant); | 499 NoveltyCurveProcessor nc(m_inputSampleRate, m_inputBlockSize, numberOfBlocks, m_noveltyCurveCompressionConstant); |
494 vector<float> noveltyCurve = nc.spectrogramToNoveltyCurve(m_spectrogram); //calculate novelty curve from magnitude data | 500 vector<float> noveltyCurve = nc.spectrogramToNoveltyCurve(m_spectrogram); //calculate novelty curve from magnitude data |
501 //if(noveltyCurve.size() > 50) for (int i = 0; i < 50; i++) cerr << noveltyCurve[i] << endl; | |
495 | 502 |
496 //push novelty curve data to featureset 1 and set timestamps | 503 //push novelty curve data to featureset 1 and set timestamps |
497 for (unsigned int i = 0; i < numberOfBlocks; i++){ | 504 for (int i = 0; i < (int)numberOfBlocks; i++){ |
498 Feature noveltyCurveFeature; | 505 Feature noveltyCurveFeature; |
499 noveltyCurveFeature.values.push_back(noveltyCurve[i]); | 506 noveltyCurveFeature.values.push_back(noveltyCurve[i]); |
500 noveltyCurveFeature.hasTimestamp = false; | 507 noveltyCurveFeature.hasTimestamp = false; |
501 featureSet[1].push_back(noveltyCurveFeature); | 508 featureSet[1].push_back(noveltyCurveFeature); |
502 } | 509 } |
526 } | 533 } |
527 | 534 |
528 //Calculate cyclic tempogram | 535 //Calculate cyclic tempogram |
529 vector<unsigned int> logBins = calculateTempogramNearestNeighbourLogBins(); | 536 vector<unsigned int> logBins = calculateTempogramNearestNeighbourLogBins(); |
530 | 537 |
531 assert(logBins.back() <= m_tempogramFftLength/2); | 538 assert(logBins.back() <= m_tempogramFftLength/2.0f); |
532 assert(logBins.size() == m_cyclicTempogramOctaveDivider*m_cyclicTempogramNumberOfOctaves); | 539 assert((int)logBins.size() == m_cyclicTempogramOctaveDivider*m_cyclicTempogramNumberOfOctaves); |
533 for (int block = 0; block < tempogramLength; block++){ | 540 for (int block = 0; block < tempogramLength; block++){ |
534 Feature cyclicTempogramFeature; | 541 Feature cyclicTempogramFeature; |
535 | 542 |
536 for (int i = 0; i < m_cyclicTempogramOctaveDivider; i++){ | 543 for (int i = 0; i < (int)m_cyclicTempogramOctaveDivider; i++){ |
537 float sum = 0; | 544 float sum = 0; |
538 for (int j = 0; j < m_cyclicTempogramNumberOfOctaves; j++){ | 545 for (int j = 0; j < (int)m_cyclicTempogramNumberOfOctaves; j++){ |
539 sum += tempogram[block][logBins[i+j*m_cyclicTempogramOctaveDivider]]; | 546 sum += tempogram[block][logBins[i+j*m_cyclicTempogramOctaveDivider]]; |
540 } | 547 } |
541 cyclicTempogramFeature.values.push_back(sum/m_cyclicTempogramNumberOfOctaves); | 548 cyclicTempogramFeature.values.push_back(sum/m_cyclicTempogramNumberOfOctaves); |
542 } | 549 } |
543 | 550 |