Mercurial > hg > drum-timing-analyser
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 } |