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@0
|
33 priorWidth = 50;
|
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@0
|
139 if (*realTimeMode)
|
andrew@0
|
140 lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
|
andrew@0
|
141 //cannot just be zero - offline bug
|
andrew@0
|
142 //printf("start playing - best estimate %f\n", lastBestEstimateUpdateTime);
|
andrew@0
|
143
|
andrew@0
|
144 resetArrays();
|
andrew@0
|
145 }
|
andrew@0
|
146
|
andrew@0
|
147 void BayesianArrayStructure::resetArrays(){
|
andrew@0
|
148 //called when we start playing
|
andrew@0
|
149
|
andrew@0
|
150 prior.zero();
|
andrew@0
|
151 likelihood.zero();
|
andrew@0
|
152 posterior.zero();
|
andrew@0
|
153
|
andrew@0
|
154 updateCounter = 0;
|
andrew@0
|
155
|
andrew@0
|
156 posterior.offset = -1000;
|
andrew@0
|
157 setNewDistributionOffsets(0);
|
andrew@0
|
158
|
andrew@0
|
159 int zeroIndex = posterior.getRealTermsAsIndex(0);
|
andrew@0
|
160
|
andrew@0
|
161 posterior.addGaussianShape(zeroIndex, 500, 1);
|
andrew@0
|
162 // posterior.addToIndex(0, 1);
|
andrew@0
|
163 likelihood.addConstant(1);
|
andrew@0
|
164
|
andrew@0
|
165 updateCounter = 0;
|
andrew@0
|
166
|
andrew@0
|
167
|
andrew@0
|
168 printf("bayes reset arrays - best estimate %f\n", lastBestEstimateUpdateTime);
|
andrew@0
|
169
|
andrew@0
|
170 setSpeedPrior(speedPriorValue);
|
andrew@0
|
171 }
|
andrew@0
|
172
|
andrew@0
|
173
|
andrew@0
|
174 void BayesianArrayStructure::zeroArrays(){
|
andrew@0
|
175 prior.zero();
|
andrew@0
|
176 likelihood.zero();
|
andrew@0
|
177 posterior.zero();
|
andrew@0
|
178
|
andrew@0
|
179 relativeSpeedPrior.zero();
|
andrew@0
|
180 relativeSpeedPosterior.zero();
|
andrew@0
|
181 relativeSpeedLikelihood.zero();
|
andrew@0
|
182
|
andrew@0
|
183 }
|
andrew@0
|
184
|
andrew@0
|
185
|
andrew@0
|
186 void BayesianArrayStructure::updateTmpBestEstimate(const double& timeDifference){
|
andrew@0
|
187 //input is the time since the start of playing
|
andrew@0
|
188 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime;
|
andrew@0
|
189 double timeDiff = timeDifference;
|
andrew@0
|
190 if (*realTimeMode)
|
andrew@0
|
191 timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime;
|
andrew@0
|
192
|
andrew@0
|
193 double tmp = relativeSpeedPosterior.getIntegratedEstimate();
|
andrew@0
|
194 tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
195 //
|
andrew@0
|
196 //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
|
197 //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
|
andrew@0
|
198 }
|
andrew@0
|
199
|
andrew@0
|
200 void BayesianArrayStructure::updateBestEstimate(const double& timeDifference){
|
andrew@0
|
201 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//
|
andrew@0
|
202
|
andrew@0
|
203 double timeDiff = timeDifference;
|
andrew@0
|
204
|
andrew@0
|
205 //Using timedifferencfe here will make it go wrong. Is time since beginning of playing
|
andrew@0
|
206
|
andrew@0
|
207 if (*realTimeMode)
|
andrew@0
|
208 timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime;
|
andrew@0
|
209
|
andrew@0
|
210 //lastbest is time we started playing
|
andrew@0
|
211
|
andrew@0
|
212 if (usingIntegratedTempoEstimate)
|
andrew@0
|
213 speedEstimateIndex = relativeSpeedPosterior.getIntegratedEstimate();
|
andrew@0
|
214 else
|
andrew@0
|
215 speedEstimateIndex = relativeSpeedPosterior.MAPestimate;
|
andrew@0
|
216
|
andrew@0
|
217 speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(speedEstimateIndex);
|
andrew@0
|
218 bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*speedEstimate;
|
andrew@0
|
219
|
andrew@0
|
220 }
|
andrew@0
|
221
|
andrew@0
|
222 void BayesianArrayStructure::calculatePosterior(){
|
andrew@0
|
223 //posterior.doProduct(prior, likelihood);
|
andrew@0
|
224
|
andrew@0
|
225 int i;
|
andrew@0
|
226 for (i = 0;i < posterior.length;i++){
|
andrew@0
|
227 posterior.array[i] = likelihood.array[i] * prior.array[i];
|
andrew@0
|
228 }
|
andrew@0
|
229
|
andrew@0
|
230 posterior.renormalise();
|
andrew@0
|
231
|
andrew@0
|
232 }
|
andrew@0
|
233
|
andrew@0
|
234
|
andrew@0
|
235
|
andrew@0
|
236
|
andrew@0
|
237 void BayesianArrayStructure::setNewDistributionOffsets(const double& newOffset){
|
andrew@0
|
238 prior.offset = newOffset;
|
andrew@0
|
239 likelihood.offset = newOffset;
|
andrew@0
|
240 //posterior.offset = newOffset;
|
andrew@0
|
241 }
|
andrew@0
|
242
|
andrew@0
|
243
|
andrew@0
|
244 void BayesianArrayStructure::crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference){
|
andrew@0
|
245 //set the cutoff for offset of position first! XXX
|
andrew@0
|
246
|
andrew@0
|
247 // printf("time difference %f, ", timeDifference);
|
andrew@0
|
248
|
andrew@0
|
249 double timeDifferenceInPositionVectorUnits = timeDifference / prior.scalar;
|
andrew@0
|
250
|
andrew@0
|
251
|
andrew@0
|
252 prior.zero();//kill prior
|
andrew@0
|
253 calculateNewPriorOffset(timeDifference);//set new prior offset here
|
andrew@0
|
254
|
andrew@0
|
255 if (timeDifferenceInPositionVectorUnits > crossUpdateTimeThreshold)
|
andrew@0
|
256 complexCrossUpdate(timeDifferenceInPositionVectorUnits);
|
andrew@0
|
257 else
|
andrew@0
|
258 translateByMaximumSpeed(timeDifferenceInPositionVectorUnits);
|
andrew@0
|
259
|
andrew@0
|
260
|
andrew@0
|
261 updateCounter++;
|
andrew@0
|
262 prior.renormalise();
|
andrew@0
|
263
|
andrew@0
|
264 }
|
andrew@0
|
265
|
andrew@0
|
266 void BayesianArrayStructure::complexCrossUpdate(const double& timeDifferenceInPositionVectorUnits){
|
andrew@0
|
267 int distanceMoved, newPriorIndex;
|
andrew@0
|
268
|
andrew@0
|
269 double speedValue = relativeSpeedPosterior.offset;
|
andrew@0
|
270
|
andrew@0
|
271 for (int i = 0;i < relativeSpeedPosterior.arraySize;i++){
|
andrew@0
|
272
|
andrew@0
|
273 // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
274
|
andrew@0
|
275 //so we have moved
|
andrew@0
|
276 distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value
|
andrew@0
|
277
|
andrew@0
|
278 if (relativeSpeedPosterior.array[i] != 0){
|
andrew@0
|
279 double speedContribution = relativeSpeedPosterior.array[i];
|
andrew@0
|
280 // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits);
|
andrew@0
|
281
|
andrew@0
|
282 newPriorIndex = posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
283
|
andrew@0
|
284 for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){
|
andrew@0
|
285 //old posterior contributing to new prior
|
andrew@0
|
286 // newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
287
|
andrew@0
|
288 if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){
|
andrew@0
|
289 prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution);
|
andrew@0
|
290 }
|
andrew@0
|
291
|
andrew@0
|
292 newPriorIndex++;//optimised code - the commented line above explains how this works
|
andrew@0
|
293 }//end for
|
andrew@0
|
294
|
andrew@0
|
295
|
andrew@0
|
296 }//if not zero
|
andrew@0
|
297 speedValue += relativeSpeedPosterior.scalar;
|
andrew@0
|
298 //optimised line
|
andrew@0
|
299 //as we wanted:
|
andrew@0
|
300 // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
301 }//end speed
|
andrew@0
|
302 }
|
andrew@0
|
303
|
andrew@0
|
304
|
andrew@0
|
305
|
andrew@0
|
306 void BayesianArrayStructure::translateByMaximumSpeed(const double& timeDifferenceInPositionVectorUnits){
|
andrew@0
|
307
|
andrew@0
|
308 int distanceMoved, newPriorIndex;
|
andrew@0
|
309
|
andrew@0
|
310 double speedValue = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
311 //so for scalar 0.01, 50 -> speed value of 0.5
|
andrew@0
|
312 double speedContribution = relativeSpeedPosterior.array[relativeSpeedPosterior.integratedEstimate];
|
andrew@0
|
313 //so we have moved
|
andrew@0
|
314 distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value
|
andrew@0
|
315 // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits);
|
andrew@0
|
316
|
andrew@0
|
317 for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){
|
andrew@0
|
318 //old posterior contributing to new prior
|
andrew@0
|
319 newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved;
|
andrew@0
|
320 if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){
|
andrew@0
|
321 prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution);
|
andrew@0
|
322 }
|
andrew@0
|
323
|
andrew@0
|
324 }
|
andrew@0
|
325
|
andrew@0
|
326 }
|
andrew@0
|
327
|
andrew@0
|
328 void BayesianArrayStructure::addGaussianNoiseToSpeedPosterior(const double& std_dev){
|
andrew@0
|
329 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
330
|
andrew@0
|
331 for (int i = 0;i < relativeSpeedPosterior.length;i++){
|
andrew@0
|
332 tmpPosteriorForStorage.addGaussianShape(i, std_dev, relativeSpeedPosterior.array[i]);
|
andrew@0
|
333 }
|
andrew@0
|
334
|
andrew@0
|
335 tmpPosteriorForStorage.renormalise();
|
andrew@0
|
336
|
andrew@0
|
337 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
|
andrew@0
|
338 }
|
andrew@0
|
339
|
andrew@0
|
340
|
andrew@0
|
341 void BayesianArrayStructure::addTriangularNoiseToSpeedPosterior(const double& std_dev){
|
andrew@0
|
342 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
343
|
andrew@0
|
344 for (int i = 0;i < relativeSpeedPosterior.length;i++){
|
andrew@0
|
345 //adding a linear amount depending on distance
|
andrew@0
|
346 tmpPosteriorForStorage.addTriangularShape(i, std_dev*2.0, relativeSpeedPosterior.array[i]);
|
andrew@0
|
347 }
|
andrew@0
|
348
|
andrew@0
|
349 tmpPosteriorForStorage.renormalise();
|
andrew@0
|
350
|
andrew@0
|
351 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
|
andrew@0
|
352 }
|
andrew@0
|
353
|
andrew@0
|
354 void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){
|
andrew@0
|
355
|
andrew@0
|
356 double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
357 // printf("Maxspeed is %f\n", maxSpeed);
|
andrew@0
|
358
|
andrew@0
|
359 double priorMax = posterior.getMaximum();
|
andrew@0
|
360 double distanceTravelled = maxSpeed * (timeDifference / prior.scalar);
|
andrew@0
|
361 double newMaxLocation = posterior.MAPestimate + distanceTravelled;
|
andrew@0
|
362 // printf("MAP: %i, tim df %f, distance %f, new location %f\n", posterior.MAPestimate, timeDifference, distanceTravelled, newMaxLocation);
|
andrew@0
|
363
|
andrew@0
|
364 }
|
andrew@0
|
365
|
andrew@0
|
366
|
andrew@0
|
367 void BayesianArrayStructure::decaySpeedDistribution(double timeDifference){
|
andrew@0
|
368
|
andrew@0
|
369 // commented for the moment
|
andrew@0
|
370 double relativeAmount = max(1.0, timeDifference/1000.);
|
andrew@0
|
371 // printf("decay %f around %i \n", timeDifference, relativeSpeedPosterior.MAPestimate);
|
andrew@0
|
372 relativeAmount *= speedDecayAmount;
|
andrew@0
|
373 relativeSpeedPosterior.renormalise();
|
andrew@0
|
374 relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, relativeAmount);
|
andrew@0
|
375
|
andrew@0
|
376 relativeSpeedPosterior.renormalise();
|
andrew@0
|
377 double newMax = relativeSpeedPosterior.getMaximum();
|
andrew@0
|
378
|
andrew@0
|
379 //old code
|
andrew@0
|
380 // relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, 10);
|
andrew@0
|
381 //relativeSpeedPosterior.addConstant(1);
|
andrew@0
|
382
|
andrew@0
|
383 /*
|
andrew@0
|
384 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
385 relativeSpeedLikelihood.zero();
|
andrew@0
|
386 relativeSpeedLikelihood.addConstant(0.2);
|
andrew@0
|
387 relativeSpeedLikelihood.addGaussianShape(relativeSpeedPosterior.maximumValue, speedDecayWidth, relativeAmount);
|
andrew@0
|
388 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
389 relativeSpeedPosterior.renormalise();
|
andrew@0
|
390 */
|
andrew@0
|
391
|
andrew@0
|
392
|
andrew@0
|
393
|
andrew@0
|
394 }
|
andrew@0
|
395
|
andrew@0
|
396 void BayesianArrayStructure::setLikelihoodToConstant(){
|
andrew@0
|
397 //set new likelihood
|
andrew@0
|
398 relativeSpeedLikelihood.zero();
|
andrew@0
|
399 relativeSpeedLikelihood.addConstant(speedLikelihoodNoise);
|
andrew@0
|
400 }
|
andrew@0
|
401
|
andrew@0
|
402
|
andrew@0
|
403 void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){
|
andrew@0
|
404
|
andrew@0
|
405 //speedratio is speed of played relative to the recording
|
andrew@0
|
406
|
andrew@0
|
407 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
|
andrew@0
|
408 // printf("index of likelihood would be %f for ratio %f\n", index, speedRatio);
|
andrew@0
|
409 if (index >= 0 && index < relativeSpeedPrior.length){
|
andrew@0
|
410 relativeSpeedLikelihood.addGaussianShape(index , relativeSpeedLikelihoodStdDev, matchFactor);
|
andrew@0
|
411 }
|
andrew@0
|
412 }
|
andrew@0
|
413
|
andrew@0
|
414
|
andrew@0
|
415
|
andrew@0
|
416 void BayesianArrayStructure::updateTempoDistribution(){
|
andrew@0
|
417
|
andrew@0
|
418 //copy posterior to prior
|
andrew@0
|
419 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
420
|
andrew@0
|
421 //update
|
andrew@0
|
422 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
423
|
andrew@0
|
424 //normalise
|
andrew@0
|
425 relativeSpeedPosterior.renormalise();
|
andrew@0
|
426
|
andrew@0
|
427 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
428
|
andrew@0
|
429 //relativeSpeedPosterior.updateIntegratedEstimate(); - could be swayed when off to side
|
andrew@0
|
430 //so now limited to where there is room sround the MAP estimate
|
andrew@0
|
431 relativeSpeedPosterior.updateLimitedIntegratedEstimate();
|
andrew@0
|
432
|
andrew@0
|
433 speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate);
|
andrew@0
|
434 }
|
andrew@0
|
435
|
andrew@0
|
436
|
andrew@0
|
437 void BayesianArrayStructure::calculateTempoUpdate(){
|
andrew@0
|
438 //copy posterior to prior
|
andrew@0
|
439 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
440
|
andrew@0
|
441 //update
|
andrew@0
|
442 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
443
|
andrew@0
|
444 //normalise
|
andrew@0
|
445 relativeSpeedPosterior.renormalise();
|
andrew@0
|
446
|
andrew@0
|
447 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
448
|
andrew@0
|
449 }
|
andrew@0
|
450
|
andrew@0
|
451
|
andrew@0
|
452 void BayesianArrayStructure::drawArrays(){
|
andrew@0
|
453
|
andrew@0
|
454 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
|
andrew@0
|
455 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
|
andrew@0
|
456
|
andrew@0
|
457 int displaySize = prior.arraySize;
|
andrew@0
|
458 ofSetColor(0,0,255);
|
andrew@0
|
459 prior.drawVector(0, displaySize);
|
andrew@0
|
460 ofSetColor(0,255,0);
|
andrew@0
|
461 likelihood.drawVector(0, displaySize);
|
andrew@0
|
462 ofSetColor(255,0,255);
|
andrew@0
|
463 posterior.drawVector(0, displaySize);
|
andrew@0
|
464
|
andrew@0
|
465
|
andrew@0
|
466
|
andrew@0
|
467 }
|
andrew@0
|
468
|
andrew@0
|
469
|
andrew@0
|
470 void BayesianArrayStructure::drawTempoArrays(){
|
andrew@0
|
471 ofSetColor(0,0,255);
|
andrew@0
|
472 // relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize);
|
andrew@0
|
473
|
andrew@0
|
474 ofSetColor(0,150,255);
|
andrew@0
|
475 relativeSpeedLikelihood.drawVector(0, relativeSpeedLikelihood.arraySize);
|
andrew@0
|
476
|
andrew@0
|
477 // relativeSpeedLikelihood.drawConstrainedVector(0, 199, 0, 1000);// relativeSpeedLikelihood.arraySize);
|
andrew@0
|
478 ofSetColor(255,0,0);
|
andrew@0
|
479 relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize);
|
andrew@0
|
480
|
andrew@0
|
481 // ofSetColor(0,0,255);
|
andrew@0
|
482 // tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize);
|
andrew@0
|
483
|
andrew@0
|
484 ofSetColor(255,255, 255);
|
andrew@0
|
485 ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen
|
andrew@0
|
486
|
andrew@0
|
487 ofSetColor(25, 0, 250);
|
andrew@0
|
488 double fractionOfScreen = ((double)relativeSpeedPosterior.integratedEstimate / relativeSpeedPosterior.length);
|
andrew@0
|
489 ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight());
|
andrew@0
|
490
|
andrew@0
|
491 ofSetColor(255, 0, 20);
|
andrew@0
|
492 fractionOfScreen = ((double)relativeSpeedPosterior.MAPestimate / relativeSpeedPosterior.length);
|
andrew@0
|
493 ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight());
|
andrew@0
|
494
|
andrew@0
|
495
|
andrew@0
|
496 }
|
andrew@0
|
497
|
andrew@0
|
498
|
andrew@0
|
499 void BayesianArrayStructure::drawArraysRelativeToTimeframe(const double& startTimeMillis, const double& endTimeMillis){
|
andrew@0
|
500
|
andrew@0
|
501 screenWidth = ofGetWidth();
|
andrew@0
|
502
|
andrew@0
|
503 int startArrayIndex = 0;
|
andrew@0
|
504
|
andrew@0
|
505 if (prior.getIndexInRealTerms(prior.arraySize-1) > startTimeMillis){
|
andrew@0
|
506 //i.e. the array is on the page
|
andrew@0
|
507
|
andrew@0
|
508 while (prior.getIndexInRealTerms(startArrayIndex) < startTimeMillis){
|
andrew@0
|
509 startArrayIndex++;
|
andrew@0
|
510 }
|
andrew@0
|
511 int endArrayIndex = prior.arraySize-1;
|
andrew@0
|
512 //could find constraints here
|
andrew@0
|
513 if (prior.getIndexInRealTerms(prior.arraySize-1) > endTimeMillis)
|
andrew@0
|
514 endArrayIndex = (floor)((endTimeMillis - prior.offset)/prior.scalar);
|
andrew@0
|
515
|
andrew@0
|
516 //so we need to figure where start and end array are on screen
|
andrew@0
|
517 int startScreenPosition, endScreenPosition;
|
andrew@0
|
518 double screenWidthMillis = endTimeMillis - startTimeMillis;
|
andrew@0
|
519
|
andrew@0
|
520 startScreenPosition = (prior.getIndexInRealTerms(startArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
|
andrew@0
|
521 endScreenPosition = (double)(prior.getIndexInRealTerms(endArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
|
andrew@0
|
522
|
andrew@0
|
523 ofSetColor(0,0,100);
|
andrew@0
|
524 string relativeString = " offset "+ofToString(prior.offset, 1);//starttimes("+ofToString(startTimeMillis)+", "+ofToString(endTimeMillis);
|
andrew@0
|
525 relativeString += ": index "+ofToString(startArrayIndex)+" , "+ofToString(endArrayIndex)+" [";
|
andrew@0
|
526 // relativeString += ofToString(prior.getIndexInRealTerms(endArrayIndex), 3)+"] (sc-width:"+ofToString(screenWidthMillis, 1)+") ";
|
andrew@0
|
527 relativeString += " mapped to screen "+ofToString(startScreenPosition)+" , "+ofToString(endScreenPosition);
|
andrew@0
|
528 // ofDrawBitmapString(relativeString, 100, 180);
|
andrew@0
|
529
|
andrew@0
|
530
|
andrew@0
|
531
|
andrew@0
|
532 ofSetColor(100,100,100);//255, 255, 0);
|
andrew@0
|
533 likelihood.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
534
|
andrew@0
|
535 // ofSetColor(0,0,200);
|
andrew@0
|
536 ofSetColor(170,170,170);//00,200);
|
andrew@0
|
537 prior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
538
|
andrew@0
|
539 ofSetColor(0,0,150);
|
andrew@0
|
540 // ofSetColor(200, 0, 0);
|
andrew@0
|
541 posterior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
542
|
andrew@0
|
543
|
andrew@0
|
544 // ofSetColor(0, 200, 255);
|
andrew@0
|
545 // acceleration.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
|
andrew@0
|
546
|
andrew@0
|
547
|
andrew@0
|
548 }
|
andrew@0
|
549
|
andrew@0
|
550 }
|
andrew@0
|
551
|
andrew@0
|
552
|
andrew@0
|
553 /*
|
andrew@0
|
554
|
andrew@0
|
555 void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){
|
andrew@0
|
556 //speedratio is speed of played relative to the recording
|
andrew@0
|
557
|
andrew@0
|
558 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
|
andrew@0
|
559 // printf("\nindex of likelihood would be %f\n", index);
|
andrew@0
|
560 if (index >= 0 && index < relativeSpeedPrior.length){
|
andrew@0
|
561 //then we can do update
|
andrew@0
|
562
|
andrew@0
|
563 //set new likelihood
|
andrew@0
|
564 relativeSpeedLikelihood.zero();
|
andrew@0
|
565 relativeSpeedLikelihood.addConstant(speedLikelihoodNoise);
|
andrew@0
|
566
|
andrew@0
|
567 relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor);
|
andrew@0
|
568
|
andrew@0
|
569
|
andrew@0
|
570 //copy posterior to prior
|
andrew@0
|
571 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
|
andrew@0
|
572
|
andrew@0
|
573 //update
|
andrew@0
|
574 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
|
andrew@0
|
575
|
andrew@0
|
576 //normalise
|
andrew@0
|
577 relativeSpeedPosterior.renormalise();
|
andrew@0
|
578
|
andrew@0
|
579 relativeSpeedPosterior.getMaximum();
|
andrew@0
|
580 }//end if within range
|
andrew@0
|
581
|
andrew@0
|
582
|
andrew@0
|
583 }
|
andrew@0
|
584
|
andrew@0
|
585 */ |