annotate hackday/DynamicBayesianArray.cpp @ 52:13194a9dca77 tip

Added exporting of image and text data
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Tue, 17 Jul 2012 22:13:10 +0100
parents 49a5b023df1e
children
rev   line source
andrew@28 1 /*
andrew@28 2 * DynamicDynamicBayesianArray.cpp
andrew@28 3 * midiCannamReader
andrew@28 4 *
andrew@28 5 * Created by Andrew on 17/07/2011.
andrew@28 6 * Copyright 2011 QMUL. All rights reserved.
andrew@28 7 *
andrew@28 8 */
andrew@28 9
andrew@28 10 #include "DynamicBayesianArray.h"
andrew@28 11 #include "math.h"
andrew@28 12 #include "ofMain.h"
andrew@28 13
andrew@28 14 DynamicBayesianArray::DynamicBayesianArray(){
andrew@28 15
andrew@28 16 // prior.createVector(240);
andrew@28 17 // likelihood.createVector(240);
andrew@28 18 // posterior.createVector(240);
andrew@28 19 testVector.createVector(240);
andrew@28 20 testVector.addGaussianShape(100,10, 0.1);
andrew@28 21
andrew@28 22
andrew@28 23 likelihoodNoise = 0.5;
andrew@28 24 likelihoodMean = ARRAY_SIZE/2;
andrew@28 25 likelihoodStdDev = ARRAY_SIZE / 12;
andrew@28 26 initialiseArray();
andrew@28 27 }
andrew@28 28
andrew@28 29 void DynamicBayesianArray::initialiseArray(){
andrew@28 30
andrew@28 31 //maximumIndex = 12;//change this
andrew@28 32 setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1);
andrew@28 33 setGaussianLikelihood(ARRAY_SIZE/2, ARRAY_SIZE/1);//likelihoodMean, likelihoodStdDev);
andrew@28 34
andrew@28 35 calculatePosterior();
andrew@28 36 renormalisePosterior();
andrew@28 37 posteriorDecayRate = 0.06;
andrew@28 38
andrew@28 39 eighthNoteProportion = 0.35;//must be less than 0.5 to discriminate - was 0.4
andrew@28 40 earlySixteenthNoteProportion = 0;
andrew@28 41 lateSixteenthNoteProportion = 0;
andrew@28 42 decayNoiseAmount = 0.1;
andrew@28 43 decayNoiseStdDev = ARRAY_SIZE/24;
andrew@28 44 standardDeviation = likelihoodStdDev;
andrew@28 45 setDecayNoiseGaussian(ARRAY_SIZE/2, decayNoiseStdDev);
andrew@28 46
andrew@28 47 setGaussianLikelihood(likelihoodMean, likelihoodStdDev);
andrew@28 48 }
andrew@28 49
andrew@28 50
andrew@28 51 void DynamicBayesianArray::setGaussianPrior(float mean, float StdDev){
andrew@28 52 int i;
andrew@28 53 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 54 prior[i] = (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev));
andrew@28 55 //posterior[i] = prior[i];
andrew@28 56 }
andrew@28 57 }
andrew@28 58
andrew@28 59 void DynamicBayesianArray::setGaussianPosterior(float mean, float StdDev){
andrew@28 60 int i;
andrew@28 61 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 62 posterior[i] = (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev));
andrew@28 63 }
andrew@28 64 }
andrew@28 65
andrew@28 66
andrew@28 67 void DynamicBayesianArray::setGaussianLikelihood(float mean, float StdDev){
andrew@28 68 if (mean >= 0 && mean <= ARRAY_SIZE){
andrew@28 69 int i; float eighthDifference;
andrew@28 70 int eighthPosition = ((int)mean + ARRAY_SIZE/2)%ARRAY_SIZE;
andrew@28 71 float mainDifference;
andrew@28 72 float gaussianProportion = 1 - likelihoodNoise;
andrew@28 73
andrew@28 74 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 75
andrew@28 76 mainDifference = min( double(fabs(i-mean)) , (double)(i + ARRAY_SIZE - mean));
andrew@28 77 //without * (1 - eighthNoteProportion)
andrew@28 78 likelihood[i] = gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(mainDifference)*(mainDifference)/(2*StdDev*StdDev)) ;
andrew@28 79
andrew@28 80 likelihood[i] += (likelihoodNoise / ARRAY_SIZE);
andrew@28 81 //likelihood[i] = (float) max(gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev)) ,
andrew@28 82 //(double) (likelihoodNoise / ARRAY_SIZE) );
andrew@28 83 }
andrew@28 84 // renormaliseArray(&likelihood[0], ARRAY_SIZE);
andrew@28 85 }//end if mean within limits
andrew@28 86 }
andrew@28 87
andrew@28 88 void DynamicBayesianArray::calculatePosterior(){
andrew@28 89 int i;
andrew@28 90 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 91 posterior[i] = likelihood[i] * prior[i];
andrew@28 92 }
andrew@28 93 //renormalisePosterior();
andrew@28 94 }
andrew@28 95
andrew@28 96
andrew@28 97 float DynamicBayesianArray::getMaximum(float *ptr, int length){
andrew@28 98 int i;
andrew@28 99 float max = 0;
andrew@28 100 for (i=0;i < length;i++){
andrew@28 101 if (*(ptr+i)>max)
andrew@28 102 max = *(ptr+i);
andrew@28 103 }
andrew@28 104 maximumValue = max;
andrew@28 105 return max;
andrew@28 106 }
andrew@28 107
andrew@28 108 float* DynamicBayesianArray::getMaximumEstimate(float *ptr, int length){
andrew@28 109 float returnArray[2];
andrew@28 110 int i;
andrew@28 111 float max = 0;
andrew@28 112 maximumIndex = 0;
andrew@28 113 for (i=0;i < length;i++){
andrew@28 114 if (*(ptr+i)>max){
andrew@28 115 max = *(ptr+i);
andrew@28 116 maximumIndex = i;
andrew@28 117 }
andrew@28 118 }
andrew@28 119 returnArray[0] = max;
andrew@28 120 returnArray[1] = maximumIndex;
andrew@28 121 maximumValue = max;
andrew@28 122 return &returnArray[0];
andrew@28 123 }
andrew@28 124
andrew@28 125
andrew@28 126
andrew@28 127 double DynamicBayesianArray::getIntegratedEstimateIndex(){
andrew@28 128 int i;
andrew@28 129 float integratedQuantity = 0;
andrew@28 130 float integratedTotal = 0;
andrew@28 131 double integratedIndex = 0;
andrew@28 132 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 133 integratedQuantity += posterior[i];//the values of the probability distribution
andrew@28 134 integratedTotal += i*posterior[i];
andrew@28 135 }
andrew@28 136 if (integratedQuantity > 0){
andrew@28 137 integratedIndex = integratedTotal / integratedQuantity;
andrew@28 138 }
andrew@28 139 integratedEstimate = (float) integratedIndex;
andrew@28 140 return integratedIndex;
andrew@28 141 }
andrew@28 142
andrew@28 143
andrew@28 144 double DynamicBayesianArray::calculateStandardDeviation(){
andrew@28 145
andrew@28 146 double total = 0;
andrew@28 147 double pdfSum;
andrew@28 148 double variance = 0;
andrew@28 149 for (int i=0;i < ARRAY_SIZE;i++){
andrew@28 150 //*posterior[i] *
andrew@28 151 total += posterior[i] * (i - integratedEstimate) * (i - integratedEstimate);//the values of the probability distribution
andrew@28 152 pdfSum += posterior[i];
andrew@28 153 }
andrew@28 154
andrew@28 155 if (pdfSum > 0)
andrew@28 156 variance = total / pdfSum;
andrew@28 157 else
andrew@28 158 variance = ARRAY_SIZE;
andrew@28 159
andrew@28 160 standardDeviation = sqrt(variance);
andrew@28 161 return standardDeviation;
andrew@28 162 }
andrew@28 163
andrew@28 164
andrew@28 165
andrew@28 166 void DynamicBayesianArray::renormaliseArray(float *ptr, int length){
andrew@28 167 int i;
andrew@28 168 float totalArea = 0;
andrew@28 169 for (i=0;i < length;i++){
andrew@28 170 totalArea += *(ptr+i);
andrew@28 171 }
andrew@28 172
andrew@28 173 for (i=0;i < length;i++){
andrew@28 174 *(ptr+i) /= totalArea;
andrew@28 175 }
andrew@28 176
andrew@28 177 }
andrew@28 178
andrew@28 179 void DynamicBayesianArray::resetPrior(){
andrew@28 180 int i;
andrew@28 181 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 182 prior[i] = posterior[i];
andrew@28 183 }
andrew@28 184 }
andrew@28 185
andrew@28 186 void DynamicBayesianArray::renormalisePosterior(){
andrew@28 187 int i;
andrew@28 188 float totalArea = 0;
andrew@28 189 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 190 totalArea += posterior[i];
andrew@28 191 }
andrew@28 192
andrew@28 193 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 194 posterior[i] /= totalArea;
andrew@28 195 }
andrew@28 196
andrew@28 197 }
andrew@28 198
andrew@28 199 void DynamicBayesianArray::decayPosterior(){
andrew@28 200 float *pointer;
andrew@28 201 pointer = getMaximumEstimate(&posterior[0], ARRAY_SIZE);
andrew@28 202 float maximum;
andrew@28 203 maximum = *pointer;
andrew@28 204 int i;
andrew@28 205 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 206 posterior[i] += (maximum - posterior[i]) * posteriorDecayRate * 0.01;;//usded to be * maximum not minus value
andrew@28 207 }
andrew@28 208 maximumIndex = *(pointer+1);
andrew@28 209 }
andrew@28 210
andrew@28 211 void DynamicBayesianArray::setDecayNoiseGaussian(float mean, float StdDev){
andrew@28 212 int i;
andrew@28 213 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 214 decayNoiseArray[i] = (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev));
andrew@28 215 }
andrew@28 216 }
andrew@28 217
andrew@28 218 void DynamicBayesianArray::decayPosteriorWithGaussianNoise(){
andrew@28 219
andrew@28 220 int i;
andrew@28 221 float currentMaximum = getMaximum(&posterior[0], ARRAY_SIZE);
andrew@28 222 for (i=0;i<ARRAY_SIZE;i++){
andrew@28 223 posterior[i] += decayNoiseArray[(i - (int)maximumIndex + ((3*ARRAY_SIZE)/2)) % ARRAY_SIZE] * currentMaximum * decayNoiseAmount;
andrew@28 224 //posteriorDecayRate * 0.01;;//usded to be * maximum not minus value
andrew@28 225 }
andrew@28 226
andrew@28 227 }
andrew@28 228
andrew@28 229 void DynamicBayesianArray::resetMaximumPosterior(){
andrew@28 230 int i;
andrew@28 231 float max = 0;
andrew@28 232 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 233 if (posterior[i]>max){
andrew@28 234 maximumIndex = i;
andrew@28 235 max = posterior[i];
andrew@28 236 }
andrew@28 237 }
andrew@28 238 }
andrew@28 239
andrew@28 240 void DynamicBayesianArray::translateDistribution(int translationIndex){
andrew@28 241 int tmpIndex;
andrew@28 242 //copy array
andrew@28 243 int i;
andrew@28 244 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 245 tempPosteriorArray[i] = posterior[i] ;
andrew@28 246 }
andrew@28 247 //translate values
andrew@28 248 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 249 tmpIndex = (i + translationIndex + ARRAY_SIZE)%ARRAY_SIZE;
andrew@28 250 posterior[tmpIndex] = tempPosteriorArray[i];
andrew@28 251 }
andrew@28 252 //now delete tmp array
andrew@28 253 }
andrew@28 254
andrew@28 255
andrew@28 256 void DynamicBayesianArray::drawFloatArray(float* arrayToDraw, const int& minIndex, const int& maxIndex){
andrew@28 257
andrew@28 258 if (minIndex >= 0){
andrew@28 259
andrew@28 260 double stepSize = ofGetWidth() / (double)(maxIndex - minIndex);
andrew@28 261 double screenHeight = ofGetHeight();
andrew@28 262 double maxVal = getMaximum(&arrayToDraw[0], maxIndex);
andrew@28 263
andrew@28 264 for (int i = minIndex+1;i < maxIndex;i++){
andrew@28 265
andrew@28 266 ofLine (stepSize*(i-1), screenHeight * (1 - arrayToDraw[i-1] / maxVal), stepSize*i, screenHeight * (1 - arrayToDraw[i] / maxVal) );
andrew@28 267 }
andrew@28 268
andrew@28 269 }
andrew@28 270
andrew@28 271
andrew@28 272 }
andrew@28 273
andrew@28 274
andrew@28 275
andrew@28 276 /*
andrew@28 277 void DynamicBayesianArray::drawDoubleArray(double[]& arrayToDraw, const int& minIndex, const int& maxIndex){
andrew@28 278
andrew@28 279 if (minIndex >= 0 && maxIndex <= arrayToDraw.size(0))
andrew@28 280
andrew@28 281 }
andrew@28 282 */
andrew@28 283 /*
andrew@28 284 void DynamicBayesianArray::setGaussianLikelihoodForBeats(float mean, float StdDev){
andrew@28 285 //this has eighth and sixteenth positions included
andrew@28 286
andrew@28 287 if (mean >= 0 && mean <= ARRAY_SIZE){
andrew@28 288 int i; float eighthDifference;
andrew@28 289 int eighthPosition = ((int)mean + ARRAY_SIZE/2)%ARRAY_SIZE;
andrew@28 290 int earlySixteenthPosition = ((int)mean + (3*ARRAY_SIZE/4))%ARRAY_SIZE;;
andrew@28 291 int lateSixteenthPosition = ((int)mean + (ARRAY_SIZE/4))%ARRAY_SIZE;;
andrew@28 292
andrew@28 293 float mainDifference, sixteenthDifference;
andrew@28 294 float gaussianProportion = 1 - likelihoodNoise;
andrew@28 295 float mainProportion = (1 - eighthNoteProportion - earlySixteenthNoteProportion - lateSixteenthNoteProportion);
andrew@28 296
andrew@28 297 for (i=0;i < ARRAY_SIZE;i++){
andrew@28 298
andrew@28 299 mainDifference = min( fabs(i-mean) , (double)(i + ARRAY_SIZE - mean));
andrew@28 300 likelihood[i] = gaussianProportion * mainProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(mainDifference)*(mainDifference)/(2*StdDev*StdDev)) ;
andrew@28 301
andrew@28 302 eighthDifference = min( abs(i - eighthPosition) , i + ARRAY_SIZE - eighthPosition);
andrew@28 303 eighthDifference = min(eighthDifference , (float)(ARRAY_SIZE + eighthPosition - i ));
andrew@28 304 //for e.g. +0.43, or -0.47 we require the gaussian around the half note too
andrew@28 305 likelihood[i] += gaussianProportion * eighthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(eighthDifference)*(eighthDifference)/(2*StdDev*StdDev)) ;
andrew@28 306
andrew@28 307 sixteenthDifference = min( abs(i - earlySixteenthPosition) , i + ARRAY_SIZE - earlySixteenthPosition);
andrew@28 308 sixteenthDifference = min(sixteenthDifference , (float)(ARRAY_SIZE + earlySixteenthPosition - i ));
andrew@28 309 //for e.g. +0.43, or -0.47 we require the gaussian around the half note too
andrew@28 310 likelihood[i] += gaussianProportion * earlySixteenthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(sixteenthDifference)*(sixteenthDifference)/(2*StdDev*StdDev)) ;
andrew@28 311
andrew@28 312 sixteenthDifference = min( abs(i - lateSixteenthPosition) , i + ARRAY_SIZE - lateSixteenthPosition);
andrew@28 313 sixteenthDifference = min(sixteenthDifference , (float)(ARRAY_SIZE + lateSixteenthPosition - i ));
andrew@28 314 //for e.g. +0.43, or -0.47 we require the gaussian around the half note too
andrew@28 315 likelihood[i] += gaussianProportion * lateSixteenthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(sixteenthDifference)*(sixteenthDifference)/(2*StdDev*StdDev)) ;
andrew@28 316
andrew@28 317
andrew@28 318
andrew@28 319 likelihood[i] += (likelihoodNoise / ARRAY_SIZE);
andrew@28 320 //likelihood[i] = (float) max(gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev)) ,
andrew@28 321 //(double) (likelihoodNoise / ARRAY_SIZE) );
andrew@28 322 }
andrew@28 323 // renormaliseArray(&likelihood[0], ARRAY_SIZE);
andrew@28 324 }//end if mean within limits
andrew@28 325 }
andrew@28 326 */