annotate hackday/DynamicBayesianArray.cpp @ 36:5a1b0c6fa1fb

Added class to read in the csv Annotation file, then write out the respective difference between the performed piece as followed here, and the annotation of RWC by Ewert and Muller
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Thu, 15 Dec 2011 02:28:49 +0000
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 */