comparison DrumTimingLoader_OF/PreciseOnsetLocator.cpp @ 1:106bc2d4f702

added timing analyser file
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Sat, 23 Nov 2013 15:44:47 +0000
parents
children
comparison
equal deleted inserted replaced
0:82352cfc0b23 1:106bc2d4f702
1 /*
2 * PreciseOnsetLocator.cpp
3 * peakOnsetDetector
4 *
5 * Created by Andrew on 21/09/2012.
6 * Copyright 2012 QMUL. All rights reserved.
7 *
8 */
9
10 #include "PreciseOnsetLocator.h"
11
12 PreciseOnsetLocator::PreciseOnsetLocator(){
13 setup(512);
14 }
15
16 PreciseOnsetLocator::~PreciseOnsetLocator(){
17 onsetSamples.clear();
18 recentBufferSamples.clear();
19 }
20
21
22 void PreciseOnsetLocator::setup(const int& size){
23 onsetSamples.clear();
24 recentBufferSamples.clear();
25 bufferSize = size;
26 onsetSamples.assign(bufferSize, 0.0);
27 recentBufferSamples.assign(bufferSize, 0.0);
28 }
29
30 void PreciseOnsetLocator::storeSamples(double* newSamples){
31
32 for (int i = 0;i < bufferSize;i++)
33 recentBufferSamples[i] = newSamples[i];
34
35 }
36
37 int PreciseOnsetLocator::findExactOnset(double* frame){
38 //store the samples - mainly for viewing actually
39 onsetSamples.clear();
40 for (int i = 0; i < bufferSize;i++) {
41 onsetSamples.push_back(frame[i]);
42 }
43
44 double energySum = 0;
45 double lastEnergySum, hopsizeLastEnergySum;
46 double energyDifference;
47 int bestEnergyIndex = 0;
48 double bestEnergyDifference = 0;
49 int endIndex = bufferSize;
50 int hopSize;
51
52 for (int resolution = bufferSize/2;resolution > 1;resolution/=2){
53 printf("resolution %i\n", resolution);
54
55 bestEnergyDifference = 0;
56 // printf("previous energy %f", lastEnergySum);
57 //initialise last energySum
58 hopSize = resolution/2;
59
60
61 lastEnergySum = getLastEnergySum(bestEnergyIndex, resolution);
62 hopsizeLastEnergySum = getLastEnergySum(bestEnergyIndex + hopSize, resolution);
63
64 for (int startIndex = bestEnergyIndex;startIndex + resolution <= endIndex;startIndex += hopSize){
65 printf("index %i last energy %f hop energy %f ", startIndex, lastEnergySum, hopsizeLastEnergySum);
66
67 //sum the energy for this new frame
68 energySum = 0;
69 for (int i = 0;i < resolution;i++){
70 energySum += onsetSamples[startIndex + i] * onsetSamples[startIndex + i];
71 }
72
73 printf("energysum %f\n", energySum);
74 //check if new max difference
75 energyDifference = energySum - lastEnergySum;
76 if (energyDifference > bestEnergyDifference){
77 bestEnergyDifference = energyDifference;
78 bestEnergyIndex = startIndex;
79 }
80
81 //store the values for checking in two loops time (because proceeding at resolution/2 each step)
82 //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,
83 lastEnergySum = hopsizeLastEnergySum;// energySum;
84 hopsizeLastEnergySum = energySum;
85
86 }
87 printf("winning index is %i\n", bestEnergyIndex);
88 endIndex = bestEnergyIndex + resolution;
89
90 }
91 printf("TOTAL WINNER %i\n", bestEnergyIndex);
92 return bestEnergyIndex;
93
94 }
95
96 double PreciseOnsetLocator::getLastEnergySum(const int& startIndex, const int& vectorSize){
97 double lastEnergySum = 0;
98
99 for (int i = startIndex - vectorSize;i < startIndex;i++){
100 if (i > 0)
101 lastEnergySum += onsetSamples[i] * onsetSamples[i];
102 else {
103 lastEnergySum += recentBufferSamples[bufferSize + i] * recentBufferSamples[bufferSize + i];
104 }
105 }
106 return lastEnergySum;
107
108 }