comparison DrumTimingLoader_OF/ofxAubioOnsetDetection/PreciseOnsetLocator.cpp @ 0:82352cfc0b23

Added files from ISMIR groove drum timing work
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Mon, 01 Oct 2012 22:24:32 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:82352cfc0b23
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
17 PreciseOnsetLocator::~PreciseOnsetLocator(){
18 onsetSamples.clear();
19 recentBufferSamples.clear();
20 }
21
22
23 void PreciseOnsetLocator::setup(const int& size){
24 onsetSamples.clear();
25 recentBufferSamples.clear();
26 bufferSize = size;
27 onsetSamples.assign(bufferSize, 0.0);
28 recentBufferSamples.assign(bufferSize, 0.0);
29 printInfo = false;
30 }
31
32 void PreciseOnsetLocator::storeSamples(double* newSamples){
33
34 for (int i = 0;i < bufferSize;i++)
35 recentBufferSamples[i] = newSamples[i];
36
37 }
38
39
40 void PreciseOnsetLocator::storeSamples(float* newSamples){
41
42 for (int i = 0;i < bufferSize;i++)
43 recentBufferSamples[i] = newSamples[i];
44
45 }
46
47
48 int PreciseOnsetLocator::findExactOnset(double* frame, const int& framesize){
49 //store the samples - mainly for viewing actually
50 if (framesize == bufferSize){
51 onsetSamples.clear();
52 for (int i = 0; i < bufferSize;i++) {
53 onsetSamples.push_back(frame[i]);
54 }
55
56 if (recentBufferSamples.size() == 0)
57 printf("Bad size onset vector\n");
58
59 double energySum = 0;
60 double lastEnergySum, hopsizeLastEnergySum;
61 double energyDifference;
62 int bestEnergyIndex = 0;
63 double bestEnergyDifference = 0;
64 int endIndex = bufferSize;
65 int hopSize;
66
67 printInfo = false;
68
69 for (int resolution = bufferSize/2;resolution > 1;resolution/=2){
70 if (printInfo)
71 printf("resolution %i\n", resolution);
72
73 bestEnergyDifference = 0;
74 // printf("previous energy %f", lastEnergySum);
75 //initialise last energySum
76 hopSize = resolution/2;
77
78
79 lastEnergySum = getLastEnergySum(bestEnergyIndex, resolution);
80 hopsizeLastEnergySum = getLastEnergySum(bestEnergyIndex + hopSize, resolution);
81
82 for (int startIndex = bestEnergyIndex;startIndex + resolution <= endIndex;startIndex += hopSize){
83 if (printInfo)
84 printf("index %i last energy %f hop energy %f ", startIndex, lastEnergySum, hopsizeLastEnergySum);
85
86 //sum the energy for this new frame
87 energySum = 0;
88 for (int i = 0;i < resolution;i++){
89 energySum += onsetSamples[startIndex + i] * onsetSamples[startIndex + i];
90 }
91 if (printInfo)
92 printf("energysum %f\n", energySum);
93 //check if new max difference
94 energyDifference = energySum - lastEnergySum;
95 if (energyDifference > bestEnergyDifference){
96 bestEnergyDifference = energyDifference;
97 bestEnergyIndex = startIndex;
98 }
99
100 //store the values for checking in two loops time (because proceeding at resolution/2 each step)
101 //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,
102 lastEnergySum = hopsizeLastEnergySum;// energySum;
103 hopsizeLastEnergySum = energySum;
104
105 }
106 if (printInfo)
107 printf("winning index is %i\n", bestEnergyIndex);
108 endIndex = bestEnergyIndex + resolution;
109
110 }
111 if (printInfo)
112 printf("TOTAL WINNER %i\n", bestEnergyIndex);
113 return bestEnergyIndex;
114 }else{
115 printf("NOt same buffersize!\n");
116 return 0;
117 }
118
119 }
120
121
122
123 int PreciseOnsetLocator::findExactOnset(float* frame, const int& framesize){
124
125 double tempOnsetSamples[framesize];
126 for (int i = 0;i < framesize;i++)
127 tempOnsetSamples[i] = frame[i];
128
129 return findExactOnset(&tempOnsetSamples[0], framesize);
130 }
131
132
133 double PreciseOnsetLocator::getLastEnergySum(const int& startIndex, const int& vectorSize){
134 double lastEnergySum = 0;
135
136 for (int i = startIndex - vectorSize;i < startIndex;i++){
137 if (i > 0)
138 lastEnergySum += onsetSamples[i] * onsetSamples[i];
139 else {
140 lastEnergySum += recentBufferSamples[bufferSize + i] * recentBufferSamples[bufferSize + i];
141 }
142 }
143 return lastEnergySum;
144
145 }