Mercurial > hg > midi-score-follower
diff src/BayesianArrayStructure.cpp @ 2:5581023e0de4
Added separate CannamMidiFileLoader class to handle the loading in.
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Fri, 19 Aug 2011 01:26:40 +0100 |
parents | 1a32ce016bb9 |
children | de86d77f2612 |
line wrap: on
line diff
--- a/src/BayesianArrayStructure.cpp Thu Aug 18 23:27:42 2011 +0100 +++ b/src/BayesianArrayStructure.cpp Fri Aug 19 01:26:40 2011 +0100 @@ -16,16 +16,16 @@ likelihood.createVector(1); posterior.createVector(1); - - tmpPrior.createVector(240); - tmpPrior.addGaussianShape(100, 40, 1); - tmpPrior.addGaussianShape(200, 10, 0.2); - tmpPrior.translateDistribution(20); - + lastEventTime = ofGetElapsedTimeMillis(); - speedDecayWidth = 20; - speedDecayAmount = 10; + /* + tmpPrior.createVector(240); + tmpPrior.addGaussianShape(100, 40, 1); + tmpPrior.addGaussianShape(200, 10, 0.2); + tmpPrior.translateDistribution(20); + */ + tmpBestEstimate = 0; } BayesianArrayStructure::BayesianArrayStructure(int length){ @@ -34,6 +34,8 @@ prior.createVector(length); likelihood.createVector(length); posterior.createVector(length); + + lastEventTime = 0; } @@ -46,6 +48,7 @@ likelihood.createVector(length); posterior.createVector(length); + acceleration.createVector(length); } @@ -57,13 +60,24 @@ relativeSpeedPosterior.zero(); relativeSpeedLikelihood.zero(); - relativeSpeedPosterior.addGaussianShape(40, 5, 0.6); + //relativeSpeedPosterior.addGaussianShape(40, 5, 0.6); - relativeSpeedPosterior.addGaussianShape(100, 5, 0.8); + relativeSpeedPosterior.addGaussianShape(100, 20, 0.8); +// relativeSpeedPosterior.addGaussianShape(50, 1, 0.8); + +// relativeSpeedPosterior.addToIndex(100, 1); + //relativeSpeedPosterior.addToIndex(50, 1); relativeSpeedPosterior.renormalise(); relativeSpeedPosterior.getMaximum(); - acceleration.addGaussianShape(2000, 20, 0.8); + prior.zero(); + posterior.zero(); +// posterior.offset = - 200; +// posterior.addGaussianShape(200, 40, 1); + posterior.addToIndex(0, 1); + posterior.renormalise(); + + //acceleration.addGaussianShape(2000, 20, 0.8); } @@ -73,32 +87,44 @@ relativeSpeedPrior.createVector(length); relativeSpeedLikelihood.createVector(length); relativeSpeedPosterior.createVector(length); - + tmpPosteriorForStorage.createVector(length); } + void BayesianArrayStructure::setRelativeSpeedScalar(double f){ relativeSpeedPrior.scalar = f; relativeSpeedPosterior.scalar = f; relativeSpeedLikelihood.scalar = f; } + +void BayesianArrayStructure::setPositionDistributionScalar(double f){ + if (f > 0){ + prior.scalar = f; + posterior.scalar = f; + likelihood.scalar = f; + } +} + void BayesianArrayStructure::simpleExample(){ //simple example - prior.addGaussianShape(50, 10, 1); - prior.addGaussianShape(150, 30, 0.3); - prior.addGaussianShape(250, 30, 0.2); - likelihood.addGaussianShape(90, 20, 0.6); - likelihood.addConstant(0.02); - posterior.doProduct(prior, likelihood); +// prior.addGaussianShape(50, 10, 1); +// prior.addGaussianShape(150, 30, 0.3); +// prior.addGaussianShape(250, 30, 0.2); + +// likelihood.addGaussianShape(90, 20, 0.6); +// likelihood.addConstant(0.02); +// posterior.doProduct(prior, likelihood); // relativeSpeedPosterior.addToIndex(100, 1); // relativeSpeedPosterior.addToIndex(40, 0.7); - relativeSpeedPosterior.addGaussianShape(100, 20, 1); -// relativeSpeedPosterior.addGaussianShape(10, 2, 0.5); + +// relativeSpeedPosterior.addGaussianShape(100, 2, 1); +// relativeSpeedPosterior.addGaussianShape(40, 2, 0.5); relativeSpeedPosterior.getMaximum(); - + relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); } void BayesianArrayStructure::copyPriorToPosterior(){ @@ -108,39 +134,82 @@ } } +void BayesianArrayStructure::setStartPlaying(){ + lastEventTime = 0;//ofGetElapsedTimeMillis(); + bestEstimate = 0; + lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); + + resetArrays(); +} + void BayesianArrayStructure::resetArrays(){ + //called when we start playing + prior.zero(); likelihood.zero(); - prior.addGaussianShape(0, 80, 1); + posterior.zero(); + + updateCounter = 0; + + posterior.offset = 0; + setNewDistributionOffsets(0); + + int zeroIndex = posterior.getRealTermsAsIndex(0); + + posterior.addGaussianShape(zeroIndex, 500, 1); + // posterior.addToIndex(0, 1); likelihood.addConstant(1); - posterior.zero(); - posterior.addGaussianShape(0, 60, 1); - setNewDistributionOffsets(0); + + updateCounter = 0; + bestEstimate = 0; // lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); } +void BayesianArrayStructure::zeroArrays(){ + prior.zero(); + likelihood.zero(); + posterior.zero(); + + relativeSpeedPrior.zero(); + relativeSpeedPosterior.zero(); + relativeSpeedLikelihood.zero(); + +} + + +void BayesianArrayStructure::updateTmpBestEstimate(const double& timeDifference){ + //input is the time since the start of playing + +// double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime; + + tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); + // + printf("tmp best %f and best %f time diff %f posterior MAP %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate)); + //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); +} + void BayesianArrayStructure::updateBestEstimate(){ - double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime; +// double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;// + double timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime; + bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); - bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); - // - //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); +// bestEstimate = tmpBestEstimate; } void BayesianArrayStructure::calculatePosterior(){ - posterior.doProduct(prior, likelihood); + //posterior.doProduct(prior, likelihood); + + int i; + for (i = 0;i < posterior.length;i++){ + posterior.array[i] = likelihood.array[i] * prior.array[i]; + } + + posterior.renormalise(); - /* - int i; - for (i = 0;i < prior.length;i++){ - // printf("priori [%i] is %f\n", i, prior[i]); - *(posterior+i) = *(prior+i); - // posterior[i] = likelihood[i] * prior[i]; - } - */ + } @@ -151,7 +220,7 @@ void BayesianArrayStructure::setNewDistributionOffsets(const double& newOffset){ prior.offset = newOffset; likelihood.offset = newOffset; -// posterior.offset = newOffset; + //posterior.offset = newOffset; } @@ -175,10 +244,10 @@ if (speed.array[i] != 0){ - // printf("speed [%i] gives %f moved %i\n", i, speedValue, distanceMoved); + // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits); for (int postIndex = 0;postIndex < position.arraySize;postIndex++){ - //old posterior contributing to new prior + //old posterior contributing to new prior int newPriorIndex = postIndex + position.offset - prior.offset + distanceMoved; if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){ prior.addToIndex(newPriorIndex, position.array[postIndex]*speed.array[i]); @@ -189,11 +258,38 @@ }//if not zero }//end speed - + updateCounter++; prior.renormalise(); } + +void BayesianArrayStructure::addGaussianNoiseToSpeedPosterior(const double& std_dev){ + tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior); + + for (int i = 0;i < relativeSpeedPosterior.length;i++){ + tmpPosteriorForStorage.addGaussianShape(i, std_dev, relativeSpeedPosterior.array[i]); + } + + tmpPosteriorForStorage.renormalise(); + + relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage); +} + + +void BayesianArrayStructure::addTriangularNoiseToSpeedPosterior(const double& std_dev){ + tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior); + + for (int i = 0;i < relativeSpeedPosterior.length;i++){ + //adding a linear amount depending on distance + tmpPosteriorForStorage.addTriangularShape(i, std_dev*2.0, relativeSpeedPosterior.array[i]); + } + + tmpPosteriorForStorage.renormalise(); + + relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage); +} + void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){ double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); @@ -246,7 +342,7 @@ //set new likelihood relativeSpeedLikelihood.zero(); - relativeSpeedLikelihood.addConstant(0.05); + relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor); @@ -303,14 +399,13 @@ //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200); int displaySize = prior.arraySize; - ofSetColor(255,0,0); + ofSetColor(0,0,255); prior.drawVector(0, displaySize); ofSetColor(0,255,0); likelihood.drawVector(0, displaySize); - ofSetColor(0,0,255); + ofSetColor(255,0,255); posterior.drawVector(0, displaySize); - ofSetColor(255,255,0); - relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize); + // ofSetColor(255,255,255); // tmpPrior.drawVector(0,300); @@ -328,6 +423,9 @@ ofSetColor(255,255,0); relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize); + ofSetColor(0,0,255); + tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize); + ofSetColor(255,255, 255); ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen