andrew@0
|
1 /*
|
andrew@0
|
2 * BayesianArrayStructure.cpp
|
andrew@0
|
3 * midiCannamReader
|
andrew@0
|
4 *
|
andrew@0
|
5 * Created by Andrew on 17/07/2011.
|
andrew@0
|
6 * Copyright 2011 QMUL. All rights reserved.
|
andrew@0
|
7 *
|
andrew@0
|
8 */
|
andrew@0
|
9
|
andrew@0
|
10 //look at reset speed to one - what does this do? - get rid of?
|
andrew@0
|
11
|
andrew@0
|
12
|
andrew@0
|
13 #include "BayesianArrayStructure.h"
|
andrew@0
|
14
|
andrew@0
|
15 BayesianArrayStructure::BayesianArrayStructure(){
|
andrew@0
|
16 printf("Bayesian structure: DeFault constructor called");
|
andrew@0
|
17
|
andrew@0
|
18 usingIntegratedTempoEstimate = true;// use max index
|
andrew@0
|
19
|
andrew@0
|
20 relativeSpeedLikelihoodStdDev = 5.0;
|
andrew@0
|
21
|
andrew@0
|
22 prior.createVector(1);
|
andrew@0
|
23 likelihood.createVector(1);
|
andrew@0
|
24 posterior.createVector(1);
|
andrew@0
|
25
|
andrew@0
|
26 speedPriorValue = 1.0;//default value for the speed prior
|
andrew@0
|
27 speedEstimate = speedPriorValue;
|
andrew@0
|
28
|
andrew@0
|
29 lastEventTime = 0;//ofGetElapsedTimeMillis();
|
andrew@0
|
30
|
andrew@0
|
31 tmpBestEstimate = 0;
|
andrew@0
|
32 crossUpdateTimeThreshold = 60;
|
andrew@3
|
33 priorWidth = 20;
|
andrew@0
|
34
|
andrew@0
|
35 }
|
andrew@0
|
36
|
andrew@0
|
37 BayesianArrayStructure::BayesianArrayStructure(int length){
|
andrew@0
|
38 printf("BAYESIAN STURCTURE CREATED LENGTH: %i\n", length);
|
andrew@0
|
39 //this constructor isnt called it seems
|
andrew@0
|
40 prior.createVector(length);
|
andrew@0
|
41 likelihood.createVector(length);
|
andrew@0
|
42 posterior.createVector(length);
|
andrew@0
|
43
|
andrew@0
|
44 lastEventTime = 0;
|
andrew@0
|
45
|
andrew@0
|
46
|
andrew@0
|
47 }
|
andrew@0
|
48
|
andrew@0
|
49
|
andrew@0
|
50
|
andrew@0
|
51 void BayesianArrayStructure::resetSize(int length){
|
andrew@0
|
52 printf("BAYESIAN STRUCTURE size is : %i\n", length);
|
andrew@0
|
53
|
andrew@0
|
54 prior.createVector(length);
|
andrew@0
|
55 likelihood.createVector(length);
|
andrew@0
|
56 posterior.createVector(length);
|
andrew@0
|
57
|
andrew@0
|
58 acceleration.createVector(length);
|
andrew@0
|
59
|
andrew@0
|
60 }
|
andrew@0
|
61
|
andrew@0
|
62 void BayesianArrayStructure::resetSpeedSize(int length){
|
andrew@0
|
63 printf("BAYESIAN reset SPEED size is : %i\n", length);
|
andrew@0
|
64
|
andrew@0
|
65 relativeSpeedPrior.createVector(length);
|
andrew@0
|
66 relativeSpeedLikelihood.createVector(length);
|
andrew@0
|
67 relativeSpeedPosterior.createVector(length);
|
andrew@0
|
68 tmpPosteriorForStorage.createVector(length);
|
andrew@0
|
69
|
andrew@0
|
70
|
andrew@0
|
71
|
andrew@0
|
72 }
|
andrew@0
|
73
|
andrew@0
|
74 void BayesianArrayStructure::setRelativeSpeedScalar(double f){
|
andrew@0
|
75 relativeSpeedPrior.scalar = f;
|
andrew@0
|
76 relativeSpeedPosterior.scalar = f;
|
andrew@0
|
77 relativeSpeedLikelihood.scalar = f;
|
andrew@0
|
78 }
|
andrew@0
|
79
|
andrew@0
|
80 void BayesianArrayStructure::resetSpeedToOne(){
|
andrew@0
|
81 relativeSpeedPrior.zero();
|
andrew@0
|
82 relativeSpeedPosterior.zero();
|
andrew@0
|
83 relativeSpeedLikelihood.zero();
|
andrew@0
|
84
|
andrew@0
|
85
|
andrew@0
|
86 relativeSpeedPosterior.addGaussianShape(100, 20, 0.8);
|
andrew@0
|
87 relativeSpeedPosterior.renormalise();
|
andrew@0
|
88 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
89
|
andrew@0
|
90 setSpeedPrior(speedPriorValue);
|
andrew@0
|
91 speedEstimate = speedPriorValue;
|
andrew@0
|
92
|
andrew@0
|
93 prior.zero();
|
andrew@0
|
94 posterior.zero();
|
andrew@0
|
95
|
andrew@0
|
96 posterior.addToIndex(0, 1);
|
andrew@0
|
97 posterior.renormalise();
|
andrew@0
|
98
|
andrew@0
|
99 }
|
andrew@0
|
100
|
andrew@0
|
101 void BayesianArrayStructure::setSpeedPrior(double f){
|
andrew@0
|
102 speedPriorValue = f;
|
andrew@0
|
103 int index = relativeSpeedPosterior.getRealTermsAsIndex(speedPriorValue);
|
andrew@0
|
104 relativeSpeedPosterior.zero();
|
andrew@0
|
105 relativeSpeedPosterior.addGaussianShape(index, priorWidth, 0.8);
|
andrew@0
|
106 relativeSpeedPosterior.renormalise();
|
andrew@0
|
107 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
108 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
109 printf("BAYES STRUCTU ' SPEED PRIOR %f . index %i\n", speedPriorValue, index);
|
andrew@0
|
110
|
andrew@0
|
111 }
|
andrew@0
|
112
|
andrew@0
|
113
|
andrew@0
|
114 void BayesianArrayStructure::setPositionDistributionScalar(double f){
|
andrew@0
|
115 if (f > 0){
|
andrew@0
|
116 prior.scalar = f;
|
andrew@0
|
117 posterior.scalar = f;
|
andrew@0
|
118 likelihood.scalar = f;
|
andrew@0
|
119 }
|
andrew@0
|
120 }
|
andrew@0
|
121
|
andrew@0
|
122 void BayesianArrayStructure::simpleExample(){
|
andrew@0
|
123 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
124 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
125 }
|
andrew@0
|
126
|
andrew@0
|
127 void BayesianArrayStructure::copyPriorToPosterior(){
|
andrew@0
|
128
|
andrew@0
|
129 for (int i = 0;i < prior.arraySize;i++){
|
andrew@0
|
130 posterior.array[i] = prior.array[i];
|
andrew@0
|
131 }
|
andrew@0
|
132 }
|
andrew@0
|
133
|
andrew@0
|
134 void BayesianArrayStructure::setStartPlaying(){
|
andrew@0
|
135
|
andrew@0
|
136 lastEventTime = 0;
|
andrew@0
|
137 bestEstimate = 0;
|
andrew@0
|
138 lastBestEstimateUpdateTime = 0;
|
andrew@3
|
139
|
andrew@0
|
140 if (*realTimeMode)
|
andrew@0
|
141 lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
|
andrew@0
|
142 //cannot just be zero - offline bug
|
andrew@0
|
143 //printf("start playing - best estimate %f\n", lastBestEstimateUpdateTime);
|
andrew@0
|
144
|
andrew@0
|
145 resetArrays();
|
andrew@0
|
146 }
|
andrew@0
|
147
|
andrew@0
|
148 void BayesianArrayStructure::resetArrays(){
|
andrew@0
|
149 //called when we start playing
|
andrew@0
|
150
|
andrew@0
|
151 prior.zero();
|
andrew@0
|
152 likelihood.zero();
|
andrew@0
|
153 posterior.zero();
|
andrew@0
|
154
|
andrew@0
|
155 updateCounter = 0;
|
andrew@0
|
156
|
andrew@0
|
157 posterior.offset = -1000;
|
andrew@0
|
158 setNewDistributionOffsets(0);
|
andrew@0
|
159
|
andrew@0
|
160 int zeroIndex = posterior.getRealTermsAsIndex(0);
|
andrew@3
|
161 printf("ZERO INDEX %i\n", zeroIndex);
|
andrew@0
|
162
|
andrew@3
|
163 posterior.addGaussianShapeFromRealTime(0, 500, 1);//one way to add at x msec
|
andrew@3
|
164 posterior.addGaussianShape(posterior.getRealTermsAsIndex(10), 50, 1);//alternative way
|
andrew@3
|
165
|
andrew@3
|
166 //posterior.addToIndex(0, 1);
|
andrew@0
|
167 likelihood.addConstant(1);
|
andrew@0
|
168
|
andrew@0
|
169 updateCounter = 0;
|
andrew@0
|
170
|
andrew@0
|
171
|
andrew@0
|
172 printf("bayes reset arrays - best estimate %f\n", lastBestEstimateUpdateTime);
|
andrew@0
|
173
|
andrew@0
|
174 setSpeedPrior(speedPriorValue);
|
andrew@3
|
175 relativeSpeedPosterior.copyFromDynamicVector(relativeSpeedPrior);
|
andrew@3
|
176
|
andrew@0
|
177 }
|
andrew@0
|
178
|
andrew@0
|
179
|
andrew@0
|
180 void BayesianArrayStructure::zeroArrays(){
|
andrew@0
|
181 prior.zero();
|
andrew@0
|
182 likelihood.zero();
|
andrew@0
|
183 posterior.zero();
|
andrew@0
|
184
|
andrew@0
|
185 relativeSpeedPrior.zero();
|
andrew@0
|
186 relativeSpeedPosterior.zero();
|
andrew@0
|
187 relativeSpeedLikelihood.zero();
|
andrew@0
|
188
|
andrew@0
|
189 }
|
andrew@0
|
190
|
andrew@0
|
191
|
andrew@0
|
192 void BayesianArrayStructure::updateTmpBestEstimate(const double& timeDifference){
|
andrew@0
|
193 //input is the time since the start of playing
|
andrew@0
|
194 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime;
|
andrew@0
|
195 double timeDiff = timeDifference;
|
andrew@0
|
196 if (*realTimeMode)
|
andrew@0
|
197 timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime;
|
andrew@0
|
198
|
andrew@0
|
199 double tmp = relativeSpeedPosterior.getIntegratedEstimate();
|
andrew@0
|
200 tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
201 //
|
andrew@0
|
202 //printf("tmp best %f and best %f time diff %f posterior MAP %f at speed %f\n", 0Estimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate), relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate));
|
andrew@0
|
203 //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
|
andrew@0
|
204 }
|
andrew@0
|
205
|
andrew@0
|
206 void BayesianArrayStructure::updateBestEstimate(const double& timeDifference){
|
andrew@0
|
207 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//
|
andrew@3
|
208 double tmp = bestEstimate;
|
andrew@3
|
209 printf("post offest %i\n", posterior.offset);
|
andrew@0
|
210
|
andrew@0
|
211 double timeDiff = timeDifference;
|
andrew@0
|
212
|
andrew@0
|
213 //Using timedifferencfe here will make it go wrong. Is time since beginning of playing
|
andrew@0
|
214
|
andrew@0
|
215 if (*realTimeMode)
|
andrew@0
|
216 timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime;
|
andrew@0
|
217
|
andrew@0
|
218 //lastbest is time we started playing
|
andrew@0
|
219
|
andrew@0
|
220 if (usingIntegratedTempoEstimate)
|
andrew@0
|
221 speedEstimateIndex = relativeSpeedPosterior.getIntegratedEstimate();
|
andrew@0
|
222 else
|
andrew@0
|
223 speedEstimateIndex = relativeSpeedPosterior.MAPestimate;
|
andrew@0
|
224
|
andrew@0
|
225 speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(speedEstimateIndex);
|
andrew@0
|
226 bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*speedEstimate;
|
andrew@0
|
227
|
andrew@3
|
228 printf("best estimate update from %f to %f; time diff %f MAP %i = %f ms speed %f\n", tmp, bestEstimate, timeDiff,
|
andrew@3
|
229 posterior.MAPestimate, posterior.getIndexInRealTerms(posterior.MAPestimate), speedEstimate);
|
andrew@0
|
230 }
|
andrew@0
|
231
|
andrew@0
|
232 void BayesianArrayStructure::calculatePosterior(){
|
andrew@0
|
233 //posterior.doProduct(prior, likelihood);
|
andrew@0
|
234
|
andrew@0
|
235 int i;
|
andrew@0
|
236 for (i = 0;i < posterior.length;i++){
|
andrew@0
|
237 posterior.array[i] = likelihood.array[i] * prior.array[i];
|
andrew@0
|
238 }
|
andrew@0
|
239
|
andrew@0
|
240 posterior.renormalise();
|
andrew@0
|
241
|
andrew@0
|
242 }
|
andrew@0
|
243
|
andrew@0
|
244
|
andrew@0
|
245
|
andrew@0
|
246
|
andrew@0
|
247 void BayesianArrayStructure::setNewDistributionOffsets(const double& newOffset){
|
andrew@0
|
248 prior.offset = newOffset;
|
andrew@0
|
249 likelihood.offset = newOffset;
|
andrew@0
|
250 //posterior.offset = newOffset;
|
andrew@0
|
251 }
|
andrew@0
|
252
|
andrew@0
|
253
|
andrew@0
|
254 void BayesianArrayStructure::crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference){
|
andrew@0
|
255 //set the cutoff for offset of position first! XXX
|
andrew@0
|
256
|
andrew@0
|
257 // printf("time difference %f, ", timeDifference);
|
andrew@0
|
258
|
andrew@0
|
259 double timeDifferenceInPositionVectorUnits = timeDifference / prior.scalar;
|
andrew@0
|
260
|
andrew@0
|
261
|
andrew@0
|
262 prior.zero();//kill prior
|
andrew@0
|
263 calculateNewPriorOffset(timeDifference);//set new prior offset here
|
andrew@0
|
264
|
andrew@0
|
265 if (timeDifferenceInPositionVectorUnits > crossUpdateTimeThreshold)
|
andrew@0
|
266 complexCrossUpdate(timeDifferenceInPositionVectorUnits);
|
andrew@0
|
267 else
|
andrew@0
|
268 translateByMaximumSpeed(timeDifferenceInPositionVectorUnits);
|
andrew@0
|
269
|
andrew@0
|
270
|
andrew@0
|
271 updateCounter++;
|
andrew@0
|
272 prior.renormalise();
|
andrew@0
|
273
|
andrew@0
|
274 }
|
andrew@0
|
275
|
andrew@0
|
276 void BayesianArrayStructure::complexCrossUpdate(const double& timeDifferenceInPositionVectorUnits){
|
andrew@0
|
277 int distanceMoved, newPriorIndex;
|
andrew@0
|
278
|
andrew@0
|
279 double speedValue = relativeSpeedPosterior.offset;
|
andrew@0
|
280
|
andrew@0
|
281 for (int i = 0;i < relativeSpeedPosterior.arraySize;i++){
|
andrew@0
|
282
|
andrew@0
|
283 // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
284
|
andrew@0
|
285 //so we have moved
|
andrew@0
|
286 distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value
|
andrew@0
|
287
|
andrew@0
|
288 if (relativeSpeedPosterior.array[i] != 0){
|
andrew@0
|
289 double speedContribution = relativeSpeedPosterior.array[i];
|
andrew@0
|
290 // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits);
|
andrew@0
|
291
|
andrew@0
|
292 newPriorIndex = posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
293
|
andrew@0
|
294 for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){
|
andrew@0
|
295 //old posterior contributing to new prior
|
andrew@0
|
296 // newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
297
|
andrew@0
|
298 if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){
|
andrew@0
|
299 prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution);
|
andrew@0
|
300 }
|
andrew@0
|
301
|
andrew@0
|
302 newPriorIndex++;//optimised code - the commented line above explains how this works
|
andrew@0
|
303 }//end for
|
andrew@0
|
304
|
andrew@0
|
305
|
andrew@0
|
306 }//if not zero
|
andrew@0
|
307 speedValue += relativeSpeedPosterior.scalar;
|
andrew@0
|
308 //optimised line
|
andrew@0
|
309 //as we wanted:
|
andrew@0
|
310 // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
311 }//end speed
|
andrew@0
|
312 }
|
andrew@0
|
313
|
andrew@0
|
314
|
andrew@0
|
315
|
andrew@0
|
316 void BayesianArrayStructure::translateByMaximumSpeed(const double& timeDifferenceInPositionVectorUnits){
|
andrew@0
|
317
|
andrew@0
|
318 int distanceMoved, newPriorIndex;
|
andrew@0
|
319
|
andrew@0
|
320 double speedValue = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
321 //so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
322 double speedContribution = relativeSpeedPosterior.array[relativeSpeedPosterior.integratedEstimate];
|
andrew@0
|
323 //so we have moved
|
andrew@0
|
324 distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value
|
andrew@0
|
325 // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits);
|
andrew@0
|
326
|
andrew@0
|
327 for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){
|
andrew@0
|
328 //old posterior contributing to new prior
|
andrew@0
|
329 newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
330 if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){
|
andrew@0
|
331 prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution);
|
andrew@0
|
332 }
|
andrew@0
|
333
|
andrew@0
|
334 }
|
andrew@0
|
335
|
andrew@0
|
336 }
|
andrew@0
|
337
|
andrew@0
|
338 void BayesianArrayStructure::addGaussianNoiseToSpeedPosterior(const double& std_dev){
|
andrew@0
|
339 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
340
|
andrew@0
|
341 for (int i = 0;i < relativeSpeedPosterior.length;i++){
|
andrew@0
|
342 tmpPosteriorForStorage.addGaussianShape(i, std_dev, relativeSpeedPosterior.array[i]);
|
andrew@0
|
343 }
|
andrew@0
|
344
|
andrew@0
|
345 tmpPosteriorForStorage.renormalise();
|
andrew@0
|
346
|
andrew@0
|
347 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
|
andrew@0
|
348 }
|
andrew@0
|
349
|
andrew@0
|
350
|
andrew@0
|
351 void BayesianArrayStructure::addTriangularNoiseToSpeedPosterior(const double& std_dev){
|
andrew@0
|
352 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
353
|
andrew@0
|
354 for (int i = 0;i < relativeSpeedPosterior.length;i++){
|
andrew@0
|
355 //adding a linear amount depending on distance
|
andrew@0
|
356 tmpPosteriorForStorage.addTriangularShape(i, std_dev*2.0, relativeSpeedPosterior.array[i]);
|
andrew@0
|
357 }
|
andrew@0
|
358
|
andrew@0
|
359 tmpPosteriorForStorage.renormalise();
|
andrew@0
|
360
|
andrew@0
|
361 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
|
andrew@0
|
362 }
|
andrew@0
|
363
|
andrew@0
|
364 void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){
|
andrew@0
|
365
|
andrew@0
|
366 double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
367 // printf("Maxspeed is %f\n", maxSpeed);
|
andrew@0
|
368
|
andrew@0
|
369 double priorMax = posterior.getMaximum();
|
andrew@0
|
370 double distanceTravelled = maxSpeed * (timeDifference / prior.scalar);
|
andrew@0
|
371 double newMaxLocation = posterior.MAPestimate + distanceTravelled;
|
andrew@0
|
372 // printf("MAP: %i, tim df %f, distance %f, new location %f\n", posterior.MAPestimate, timeDifference, distanceTravelled, newMaxLocation);
|
andrew@0
|
373
|
andrew@0
|
374 }
|
andrew@0
|
375
|
andrew@0
|
376
|
andrew@0
|
377 void BayesianArrayStructure::decaySpeedDistribution(double timeDifference){
|
andrew@0
|
378
|
andrew@0
|
379 // commented for the moment
|
andrew@0
|
380 double relativeAmount = max(1.0, timeDifference/1000.);
|
andrew@0
|
381 // printf("decay %f around %i \n", timeDifference, relativeSpeedPosterior.MAPestimate);
|
andrew@0
|
382 relativeAmount *= speedDecayAmount;
|
andrew@0
|
383 relativeSpeedPosterior.renormalise();
|
andrew@0
|
384 relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, relativeAmount);
|
andrew@0
|
385
|
andrew@0
|
386 relativeSpeedPosterior.renormalise();
|
andrew@0
|
387 double newMax = relativeSpeedPosterior.getMaximum();
|
andrew@0
|
388
|
andrew@0
|
389 //old code
|
andrew@0
|
390 // relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, 10);
|
andrew@0
|
391 //relativeSpeedPosterior.addConstant(1);
|
andrew@0
|
392
|
andrew@0
|
393 /*
|
andrew@0
|
394 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
395 relativeSpeedLikelihood.zero();
|
andrew@0
|
396 relativeSpeedLikelihood.addConstant(0.2);
|
andrew@0
|
397 relativeSpeedLikelihood.addGaussianShape(relativeSpeedPosterior.maximumValue, speedDecayWidth, relativeAmount);
|
andrew@0
|
398 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
399 relativeSpeedPosterior.renormalise();
|
andrew@0
|
400 */
|
andrew@0
|
401
|
andrew@0
|
402
|
andrew@0
|
403
|
andrew@0
|
404 }
|
andrew@0
|
405
|
andrew@0
|
406 void BayesianArrayStructure::setLikelihoodToConstant(){
|
andrew@0
|
407 //set new likelihood
|
andrew@0
|
408 relativeSpeedLikelihood.zero();
|
andrew@0
|
409 relativeSpeedLikelihood.addConstant(speedLikelihoodNoise);
|
andrew@0
|
410 }
|
andrew@0
|
411
|
andrew@0
|
412
|
andrew@0
|
413 void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){
|
andrew@0
|
414
|
andrew@0
|
415 //speedratio is speed of played relative to the recording
|
andrew@0
|
416
|
andrew@0
|
417 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
|
andrew@0
|
418 // printf("index of likelihood would be %f for ratio %f\n", index, speedRatio);
|
andrew@0
|
419 if (index >= 0 && index < relativeSpeedPrior.length){
|
andrew@0
|
420 relativeSpeedLikelihood.addGaussianShape(index , relativeSpeedLikelihoodStdDev, matchFactor);
|
andrew@0
|
421 }
|
andrew@0
|
422 }
|
andrew@0
|
423
|
andrew@0
|
424
|
andrew@0
|
425
|
andrew@0
|
426 void BayesianArrayStructure::updateTempoDistribution(){
|
andrew@0
|
427
|
andrew@0
|
428 //copy posterior to prior
|
andrew@0
|
429 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
430
|
andrew@0
|
431 //update
|
andrew@0
|
432 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
433
|
andrew@0
|
434 //normalise
|
andrew@0
|
435 relativeSpeedPosterior.renormalise();
|
andrew@0
|
436
|
andrew@0
|
437 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
438
|
andrew@0
|
439 //relativeSpeedPosterior.updateIntegratedEstimate(); - could be swayed when off to side
|
andrew@0
|
440 //so now limited to where there is room sround the MAP estimate
|
andrew@0
|
441 relativeSpeedPosterior.updateLimitedIntegratedEstimate();
|
andrew@0
|
442
|
andrew@0
|
443 speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
444 }
|
andrew@0
|
445
|
andrew@0
|
446
|
andrew@0
|
447 void BayesianArrayStructure::calculateTempoUpdate(){
|
andrew@0
|
448 //copy posterior to prior
|
andrew@0
|
449 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
450
|
andrew@0
|
451 //update
|
andrew@0
|
452 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
453
|
andrew@0
|
454 //normalise
|
andrew@0
|
455 relativeSpeedPosterior.renormalise();
|
andrew@0
|
456
|
andrew@0
|
457 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
458
|
andrew@0
|
459 }
|
andrew@0
|
460
|
andrew@0
|
461
|
andrew@0
|
462 void BayesianArrayStructure::drawArrays(){
|
andrew@0
|
463
|
andrew@0
|
464 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
|
andrew@0
|
465 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
|
andrew@0
|
466
|
andrew@0
|
467 int displaySize = prior.arraySize;
|
andrew@0
|
468 ofSetColor(0,0,255);
|
andrew@0
|
469 prior.drawVector(0, displaySize);
|
andrew@0
|
470 ofSetColor(0,255,0);
|
andrew@0
|
471 likelihood.drawVector(0, displaySize);
|
andrew@0
|
472 ofSetColor(255,0,255);
|
andrew@0
|
473 posterior.drawVector(0, displaySize);
|
andrew@0
|
474
|
andrew@0
|
475
|
andrew@0
|
476
|
andrew@0
|
477 }
|
andrew@0
|
478
|
andrew@0
|
479
|
andrew@0
|
480 void BayesianArrayStructure::drawTempoArrays(){
|
andrew@0
|
481 ofSetColor(0,0,255);
|
andrew@0
|
482 // relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize);
|
andrew@0
|
483
|
andrew@0
|
484 ofSetColor(0,150,255);
|
andrew@0
|
485 relativeSpeedLikelihood.drawVector(0, relativeSpeedLikelihood.arraySize);
|
andrew@0
|
486
|
andrew@0
|
487 // relativeSpeedLikelihood.drawConstrainedVector(0, 199, 0, 1000);// relativeSpeedLikelihood.arraySize);
|
andrew@0
|
488 ofSetColor(255,0,0);
|
andrew@0
|
489 relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize);
|
andrew@0
|
490
|
andrew@0
|
491 // ofSetColor(0,0,255);
|
andrew@0
|
492 // tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize);
|
andrew@0
|
493
|
andrew@0
|
494 ofSetColor(255,255, 255);
|
andrew@0
|
495 ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen
|
andrew@0
|
496
|
andrew@0
|
497 ofSetColor(25, 0, 250);
|
andrew@0
|
498 double fractionOfScreen = ((double)relativeSpeedPosterior.integratedEstimate / relativeSpeedPosterior.length);
|
andrew@0
|
499 ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight());
|
andrew@0
|
500
|
andrew@0
|
501 ofSetColor(255, 0, 20);
|
andrew@0
|
502 fractionOfScreen = ((double)relativeSpeedPosterior.MAPestimate / relativeSpeedPosterior.length);
|
andrew@0
|
503 ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight());
|
andrew@0
|
504
|
andrew@0
|
505
|
andrew@0
|
506 }
|
andrew@0
|
507
|
andrew@0
|
508
|
andrew@0
|
509 void BayesianArrayStructure::drawArraysRelativeToTimeframe(const double& startTimeMillis, const double& endTimeMillis){
|
andrew@0
|
510
|
andrew@0
|
511 screenWidth = ofGetWidth();
|
andrew@0
|
512
|
andrew@0
|
513 int startArrayIndex = 0;
|
andrew@0
|
514
|
andrew@0
|
515 if (prior.getIndexInRealTerms(prior.arraySize-1) > startTimeMillis){
|
andrew@0
|
516 //i.e. the array is on the page
|
andrew@0
|
517
|
andrew@0
|
518 while (prior.getIndexInRealTerms(startArrayIndex) < startTimeMillis){
|
andrew@0
|
519 startArrayIndex++;
|
andrew@0
|
520 }
|
andrew@0
|
521 int endArrayIndex = prior.arraySize-1;
|
andrew@0
|
522 //could find constraints here
|
andrew@0
|
523 if (prior.getIndexInRealTerms(prior.arraySize-1) > endTimeMillis)
|
andrew@0
|
524 endArrayIndex = (floor)((endTimeMillis - prior.offset)/prior.scalar);
|
andrew@0
|
525
|
andrew@0
|
526 //so we need to figure where start and end array are on screen
|
andrew@0
|
527 int startScreenPosition, endScreenPosition;
|
andrew@0
|
528 double screenWidthMillis = endTimeMillis - startTimeMillis;
|
andrew@0
|
529
|
andrew@0
|
530 startScreenPosition = (prior.getIndexInRealTerms(startArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
|
andrew@0
|
531 endScreenPosition = (double)(prior.getIndexInRealTerms(endArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
|
andrew@0
|
532
|
andrew@0
|
533 ofSetColor(0,0,100);
|
andrew@0
|
534 string relativeString = " offset "+ofToString(prior.offset, 1);//starttimes("+ofToString(startTimeMillis)+", "+ofToString(endTimeMillis);
|
andrew@0
|
535 relativeString += ": index "+ofToString(startArrayIndex)+" , "+ofToString(endArrayIndex)+" [";
|
andrew@0
|
536 // relativeString += ofToString(prior.getIndexInRealTerms(endArrayIndex), 3)+"] (sc-width:"+ofToString(screenWidthMillis, 1)+") ";
|
andrew@0
|
537 relativeString += " mapped to screen "+ofToString(startScreenPosition)+" , "+ofToString(endScreenPosition);
|
andrew@0
|
538 // ofDrawBitmapString(relativeString, 100, 180);
|
andrew@0
|
539
|
andrew@0
|
540
|
andrew@0
|
541
|
andrew@0
|
542 ofSetColor(100,100,100);//255, 255, 0);
|
andrew@0
|
543 likelihood.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
544
|
andrew@0
|
545 // ofSetColor(0,0,200);
|
andrew@0
|
546 ofSetColor(170,170,170);//00,200);
|
andrew@0
|
547 prior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
548
|
andrew@0
|
549 ofSetColor(0,0,150);
|
andrew@0
|
550 // ofSetColor(200, 0, 0);
|
andrew@0
|
551 posterior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
552
|
andrew@0
|
553
|
andrew@0
|
554 // ofSetColor(0, 200, 255);
|
andrew@0
|
555 // acceleration.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
556
|
andrew@0
|
557
|
andrew@0
|
558 }
|
andrew@0
|
559
|
andrew@0
|
560 }
|
andrew@0
|
561
|
andrew@0
|
562
|
andrew@0
|
563 /*
|
andrew@0
|
564
|
andrew@0
|
565 void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){
|
andrew@0
|
566 //speedratio is speed of played relative to the recording
|
andrew@0
|
567
|
andrew@0
|
568 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
|
andrew@0
|
569 // printf("\nindex of likelihood would be %f\n", index);
|
andrew@0
|
570 if (index >= 0 && index < relativeSpeedPrior.length){
|
andrew@0
|
571 //then we can do update
|
andrew@0
|
572
|
andrew@0
|
573 //set new likelihood
|
andrew@0
|
574 relativeSpeedLikelihood.zero();
|
andrew@0
|
575 relativeSpeedLikelihood.addConstant(speedLikelihoodNoise);
|
andrew@0
|
576
|
andrew@0
|
577 relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor);
|
andrew@0
|
578
|
andrew@0
|
579
|
andrew@0
|
580 //copy posterior to prior
|
andrew@0
|
581 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
582
|
andrew@0
|
583 //update
|
andrew@0
|
584 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
585
|
andrew@0
|
586 //normalise
|
andrew@0
|
587 relativeSpeedPosterior.renormalise();
|
andrew@0
|
588
|
andrew@0
|
589 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
590 }//end if within range
|
andrew@0
|
591
|
andrew@0
|
592
|
andrew@0
|
593 }
|
andrew@0
|
594
|
andrew@0
|
595 */ |