annotate src/PreciseOnsetLocator.cpp @ 3:50f62c48b421

Small change
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 03 Jan 2014 17:43:02 +0000
parents 7ec1ed0b2eb0
children 93b9a9471011
rev   line source
andrew@0 1 /*
andrew@0 2 * PreciseOnsetLocator.cpp
andrew@0 3 * peakOnsetDetector
andrew@0 4 *
andrew@2 5 * Created by Andrew Robertson on 21/09/2012.
andrew@0 6 * Copyright 2012 QMUL. All rights reserved.
andrew@0 7 *
andrew@0 8 */
andrew@0 9
andrew@0 10 #include "PreciseOnsetLocator.h"
andrew@0 11
andrew@2 12 const bool printingOn = true;
andrew@2 13
andrew@0 14 PreciseOnsetLocator::PreciseOnsetLocator(){
andrew@0 15 setup(512);
andrew@0 16 }
andrew@0 17
andrew@0 18 PreciseOnsetLocator::~PreciseOnsetLocator(){
andrew@0 19 onsetSamples.clear();
andrew@0 20 recentBufferSamples.clear();
andrew@0 21 }
andrew@0 22
andrew@0 23
andrew@0 24 void PreciseOnsetLocator::setup(const int& size){
andrew@0 25 onsetSamples.clear();
andrew@0 26 recentBufferSamples.clear();
andrew@0 27 bufferSize = size;
andrew@0 28 onsetSamples.assign(bufferSize, 0.0);
andrew@0 29 recentBufferSamples.assign(bufferSize, 0.0);
andrew@2 30 if (printingOn)
andrew@2 31 printf("Precise onset locator - using %i samples as framesize\n", size);
andrew@0 32 }
andrew@0 33
andrew@0 34 void PreciseOnsetLocator::storeSamples(double* newSamples){
andrew@0 35
andrew@0 36 for (int i = 0;i < bufferSize;i++)
andrew@0 37 recentBufferSamples[i] = newSamples[i];
andrew@0 38
andrew@0 39 }
andrew@0 40
andrew@0 41 int PreciseOnsetLocator::findExactOnset(double* frame){
andrew@0 42 //store the samples - mainly for viewing actually
andrew@0 43 onsetSamples.clear();
andrew@2 44 for (int i = 0; i < bufferSize;i++){
andrew@0 45 onsetSamples.push_back(frame[i]);
andrew@0 46 }
andrew@0 47
andrew@0 48 double energySum = 0;
andrew@0 49 double lastEnergySum, hopsizeLastEnergySum;
andrew@0 50 double energyDifference;
andrew@0 51 int bestEnergyIndex = 0;
andrew@0 52 double bestEnergyDifference = 0;
andrew@0 53 int endIndex = bufferSize;
andrew@0 54 int hopSize;
andrew@0 55
andrew@2 56 for (int resolution = bufferSize/2; resolution > 1; resolution/=2){
andrew@2 57 if (printingOn)
andrew@2 58 printf("resolution %i\n", resolution);
andrew@0 59
andrew@0 60 bestEnergyDifference = 0;
andrew@0 61 // printf("previous energy %f", lastEnergySum);
andrew@0 62 //initialise last energySum
andrew@0 63 hopSize = resolution/2;
andrew@0 64
andrew@0 65 lastEnergySum = getLastEnergySum(bestEnergyIndex, resolution);
andrew@0 66 hopsizeLastEnergySum = getLastEnergySum(bestEnergyIndex + hopSize, resolution);
andrew@0 67
andrew@0 68 for (int startIndex = bestEnergyIndex;startIndex + resolution <= endIndex;startIndex += hopSize){
andrew@2 69 if (printingOn)
andrew@2 70 printf("index %i last energy %f hop energy %f ", startIndex, lastEnergySum, hopsizeLastEnergySum);
andrew@0 71
andrew@0 72 //sum the energy for this new frame
andrew@0 73 energySum = 0;
andrew@0 74 for (int i = 0;i < resolution;i++){
andrew@0 75 energySum += onsetSamples[startIndex + i] * onsetSamples[startIndex + i];
andrew@0 76 }
andrew@0 77
andrew@2 78 if (printingOn)
andrew@2 79 printf("energysum %f\n", energySum);
andrew@0 80 //check if new max difference
andrew@0 81 energyDifference = energySum - lastEnergySum;
andrew@0 82 if (energyDifference > bestEnergyDifference){
andrew@0 83 bestEnergyDifference = energyDifference;
andrew@0 84 bestEnergyIndex = startIndex;
andrew@0 85 }
andrew@0 86
andrew@0 87 //store the values for checking in two loops time (because proceeding at resolution/2 each step)
andrew@0 88 //eg 0_to_128 compared to -128_to_0, 64_to_196 compared to -64_to_64, then 128_256 compared with 0_to_128,
andrew@0 89 lastEnergySum = hopsizeLastEnergySum;// energySum;
andrew@0 90 hopsizeLastEnergySum = energySum;
andrew@0 91
andrew@0 92 }
andrew@2 93 if (printingOn)
andrew@2 94 printf("winning index is %i\n", bestEnergyIndex);
andrew@0 95 endIndex = bestEnergyIndex + resolution;
andrew@0 96
andrew@0 97 }
andrew@2 98 if (printingOn)
andrew@2 99 printf("TOTAL WINNER %i\n", bestEnergyIndex);
andrew@0 100 return bestEnergyIndex;
andrew@0 101
andrew@0 102 }
andrew@0 103
andrew@0 104 double PreciseOnsetLocator::getLastEnergySum(const int& startIndex, const int& vectorSize){
andrew@0 105 double lastEnergySum = 0;
andrew@0 106
andrew@0 107 for (int i = startIndex - vectorSize;i < startIndex;i++){
andrew@0 108 if (i > 0)
andrew@0 109 lastEnergySum += onsetSamples[i] * onsetSamples[i];
andrew@0 110 else {
andrew@0 111 lastEnergySum += recentBufferSamples[bufferSize + i] * recentBufferSamples[bufferSize + i];
andrew@0 112 }
andrew@0 113 }
andrew@0 114 return lastEnergySum;
andrew@0 115
andrew@0 116 }