Mercurial > hg > vamp-tempogram
comparison TempogramPlugin.cpp @ 48:8c151a9ca202
Tidy
author | Chris Cannam |
---|---|
date | Mon, 29 Sep 2014 16:22:16 +0100 |
parents | cb79f27f0748 |
children | b27e42b68c61 |
comparison
equal
deleted
inserted
replaced
47:cb79f27f0748 | 48:8c151a9ca202 |
---|---|
461 | 461 |
462 FeatureSet featureSet; | 462 FeatureSet featureSet; |
463 | 463 |
464 //initialise novelty curve processor | 464 //initialise novelty curve processor |
465 int numberOfBlocks = m_spectrogram.size(); | 465 int numberOfBlocks = m_spectrogram.size(); |
466 //cerr << numberOfBlocks << endl; | 466 |
467 NoveltyCurveProcessor nc(m_inputSampleRate, m_inputBlockSize, m_noveltyCurveCompressionConstant); | 467 NoveltyCurveProcessor nc(m_inputSampleRate, m_inputBlockSize, m_noveltyCurveCompressionConstant); |
468 vector<float> noveltyCurve = nc.spectrogramToNoveltyCurve(m_spectrogram); //calculate novelty curvefrom magnitude data | 468 vector<float> noveltyCurve = nc.spectrogramToNoveltyCurve(m_spectrogram); //calculate novelty curvefrom magnitude data |
469 | 469 |
470 //push novelty curve data to featureset 1 and set timestamps | 470 //push novelty curve data to featureset 1 and set timestamps |
471 for (int i = 0; i < numberOfBlocks; i++){ | 471 for (int i = 0; i < numberOfBlocks; i++){ |
504 Tempogram tempogramACT = autocorrelationProcessor.process(&noveltyCurve[0], numberOfBlocks); | 504 Tempogram tempogramACT = autocorrelationProcessor.process(&noveltyCurve[0], numberOfBlocks); |
505 | 505 |
506 for (int block = 0; block < tempogramLength; block++){ | 506 for (int block = 0; block < tempogramLength; block++){ |
507 Feature tempogramACTFeature; | 507 Feature tempogramACTFeature; |
508 | 508 |
509 // cerr << "block = " << block << ", window length = " << m_tempogramWindowLength << ", max lag = " << m_tempogramMaxLag << ", min lag = " << m_tempogramMinLag << endl; | |
510 | |
511 for(int k = m_tempogramMaxLag; k >= (int)m_tempogramMinLag; k--){ | 509 for(int k = m_tempogramMaxLag; k >= (int)m_tempogramMinLag; k--){ |
512 // cerr << "(" << block << "," << k << ") "; | |
513 tempogramACTFeature.values.push_back(tempogramACT[block][k]); | 510 tempogramACTFeature.values.push_back(tempogramACT[block][k]); |
514 } | 511 } |
515 // cerr << endl; | |
516 tempogramACTFeature.hasTimestamp = false; | 512 tempogramACTFeature.hasTimestamp = false; |
517 featureSet[2].push_back(tempogramACTFeature); | 513 featureSet[2].push_back(tempogramACTFeature); |
518 } | 514 } |
519 | 515 |
520 //Calculate cyclic tempogram | 516 //Calculate cyclic tempogram |
526 | 522 |
527 for (int i = 0; i < m_cyclicTempogramOctaveDivider; i++){ | 523 for (int i = 0; i < m_cyclicTempogramOctaveDivider; i++){ |
528 float sum = 0; | 524 float sum = 0; |
529 | 525 |
530 for (int j = 0; j < m_cyclicTempogramNumberOfOctaves; j++){ | 526 for (int j = 0; j < m_cyclicTempogramNumberOfOctaves; j++){ |
531 | 527 sum += tempogramDFT[block][logBins[j][i]]; |
532 if (block >= tempogramDFT.size()) { | |
533 cerr << "ERROR: at block = " << block << ", i = " << i << ", j = " << j << ": block " << block << " >= tempogramDFT.size() " << tempogramDFT.size() << endl; | |
534 } else if (j > logBins.size()) { | |
535 cerr << "ERROR: at block = " << block << ", i = " << i << ", j = " << j << ": j " << j << " >= logBins.size() " << logBins.size() << endl; | |
536 } else if (i > logBins[j].size()) { | |
537 cerr << "ERROR: at block = " << block << ", i = " << i << ", j = " << j << ": i " << i << " >= logBins[j].size() " << logBins[j].size() << endl; | |
538 } else if (logBins[j][i] >= tempogramDFT[block].size()) { | |
539 cerr << "ERROR: at block = " << block << ", i = " << i << ", j = " << j << ": logBins[j][i] " << logBins[j][i] << " >= tempogramDFT[block].size() " << tempogramDFT[block].size() << endl; | |
540 } else { | |
541 sum += tempogramDFT[block][logBins[j][i]]; | |
542 } | |
543 } | 528 } |
544 cyclicTempogramFeature.values.push_back(sum/m_cyclicTempogramNumberOfOctaves); | 529 cyclicTempogramFeature.values.push_back(sum/m_cyclicTempogramNumberOfOctaves); |
545 assert(!isnan(cyclicTempogramFeature.values.back())); | 530 assert(!isnan(cyclicTempogramFeature.values.back())); |
546 } | 531 } |
547 | 532 |
554 | 539 |
555 vector< vector<unsigned int> > TempogramPlugin::calculateTempogramNearestNeighbourLogBins() const | 540 vector< vector<unsigned int> > TempogramPlugin::calculateTempogramNearestNeighbourLogBins() const |
556 { | 541 { |
557 vector< vector<unsigned int> > logBins; | 542 vector< vector<unsigned int> > logBins; |
558 | 543 |
559 cerr << "calculateTempogramNearestNeighbourLogBins: octaves = " | |
560 << m_cyclicTempogramNumberOfOctaves << endl; | |
561 | |
562 for (int octave = 0; octave < (int)m_cyclicTempogramNumberOfOctaves; octave++){ | 544 for (int octave = 0; octave < (int)m_cyclicTempogramNumberOfOctaves; octave++){ |
563 vector<unsigned int> octaveBins; | 545 vector<unsigned int> octaveBins; |
564 | |
565 cerr << "octave " << octave << ":" << endl; | |
566 | 546 |
567 for (int bin = 0; bin < (int)m_cyclicTempogramOctaveDivider; bin++){ | 547 for (int bin = 0; bin < (int)m_cyclicTempogramOctaveDivider; bin++){ |
568 float bpm = m_cyclicTempogramMinBPM*pow(2.0f, octave+(float)bin/m_cyclicTempogramOctaveDivider); | 548 float bpm = m_cyclicTempogramMinBPM*pow(2.0f, octave+(float)bin/m_cyclicTempogramOctaveDivider); |
569 octaveBins.push_back(bpmToBin(bpm)); | 549 octaveBins.push_back(bpmToBin(bpm)); |
570 cerr << bpmToBin(bpm) << " "; | |
571 //cout << octaveBins.back() << endl; | |
572 } | 550 } |
573 cerr << endl; | |
574 logBins.push_back(octaveBins); | 551 logBins.push_back(octaveBins); |
575 | |
576 } | 552 } |
577 | 553 |
578 return logBins; | 554 return logBins; |
579 } | 555 } |
580 | 556 |
656 return false; | 632 return false; |
657 } | 633 } |
658 | 634 |
659 m_cyclicTempogramMinBPM = max(binToBPM(m_tempogramMinBin), m_tempogramMinBPM); | 635 m_cyclicTempogramMinBPM = max(binToBPM(m_tempogramMinBin), m_tempogramMinBPM); |
660 float cyclicTempogramMaxBPM = min(binToBPM(m_tempogramMaxBin), m_tempogramMaxBPM); | 636 float cyclicTempogramMaxBPM = min(binToBPM(m_tempogramMaxBin), m_tempogramMaxBPM); |
661 | |
662 cerr << "tempogram min bpm = " << m_tempogramMinBPM << ", cyclic min = " | |
663 << m_cyclicTempogramMinBPM << endl; | |
664 cerr << "tempogram max bpm = " << m_tempogramMaxBPM << ", cyclic max = " | |
665 << cyclicTempogramMaxBPM << endl; | |
666 | 637 |
667 m_cyclicTempogramNumberOfOctaves = floor(log2(cyclicTempogramMaxBPM/m_cyclicTempogramMinBPM)); | 638 m_cyclicTempogramNumberOfOctaves = floor(log2(cyclicTempogramMaxBPM/m_cyclicTempogramMinBPM)); |
668 | 639 |
669 if (m_cyclicTempogramNumberOfOctaves < 1) { | 640 if (m_cyclicTempogramNumberOfOctaves < 1) { |
670 cerr << "At audio sample rate " << m_inputSampleRate | 641 cerr << "At audio sample rate " << m_inputSampleRate |