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