Mercurial > hg > midi-score-follower
diff src/BayesianArrayStructure.cpp @ 9:75dcd1308658
looked at tempo process, likelihood function changed and improved. Now drawing using constrained vector function. Good working version.
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Tue, 23 Aug 2011 11:20:44 +0100 |
parents | 4a8e6a6cd224 |
children | 3f103cf78148 |
line wrap: on
line diff
--- a/src/BayesianArrayStructure.cpp Fri Aug 19 19:45:46 2011 +0100 +++ b/src/BayesianArrayStructure.cpp Tue Aug 23 11:20:44 2011 +0100 @@ -20,6 +20,7 @@ posterior.createVector(1); speedPriorValue = 1.0; + speedEstimate = speedPriorValue; lastEventTime = ofGetElapsedTimeMillis(); @@ -76,6 +77,7 @@ relativeSpeedPosterior.getMaximum(); setSpeedPrior(speedPriorValue); + speedEstimate = speedPriorValue; prior.zero(); posterior.zero(); @@ -204,16 +206,20 @@ // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime; - tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); + tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); // - printf("tmp best %f and best %f time diff %f posterior MAP %f at speed %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate), relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate)); + //printf("tmp best %f and best %f time diff %f posterior MAP %f at speed %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate), relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate)); //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); } void BayesianArrayStructure::updateBestEstimate(){ // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;// double timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime; - bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); + + double speedEstimate = relativeSpeedPosterior.getIntegratedEstimate(); + speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(speedEstimate); + //relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate) + bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*speedEstimate; // bestEstimate = tmpBestEstimate; } @@ -268,9 +274,12 @@ void BayesianArrayStructure::complexCrossUpdate(const double& timeDifferenceInPositionVectorUnits){ int distanceMoved, newPriorIndex; + + double speedValue = relativeSpeedPosterior.offset; + for (int i = 0;i < relativeSpeedPosterior.arraySize;i++){ - double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5 + // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5 //so we have moved distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value @@ -279,28 +288,37 @@ double speedContribution = relativeSpeedPosterior.array[i]; // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits); + newPriorIndex = posterior.offset - prior.offset + distanceMoved; + for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){ //old posterior contributing to new prior - newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved; + // newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved; + if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){ prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution); } - } + newPriorIndex++;//optimised code - the commented line above explains how this works + }//end for + }//if not zero + speedValue += relativeSpeedPosterior.scalar; + //optimised line + //as we wanted: + // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5 }//end speed } void BayesianArrayStructure::translateByMaximumSpeed(const double& timeDifferenceInPositionVectorUnits){ + int distanceMoved, newPriorIndex; - - - double speedValue = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate);//using max value only + + double speedValue = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); //so for scalar 0.01, 50 -> speed value of 0.5 - double speedContribution = relativeSpeedPosterior.array[relativeSpeedPosterior.MAPestimate]; + double speedContribution = relativeSpeedPosterior.array[relativeSpeedPosterior.integratedEstimate]; //so we have moved distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits); @@ -344,7 +362,7 @@ void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){ - double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); + double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); // printf("Maxspeed is %f\n", maxSpeed); double priorMax = posterior.getMaximum(); @@ -362,7 +380,7 @@ // printf("decay %f around %i \n", timeDifference, relativeSpeedPosterior.MAPestimate); relativeAmount *= speedDecayAmount; relativeSpeedPosterior.renormalise(); - relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, relativeAmount); + relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.integratedEstimate, speedDecayWidth, relativeAmount); relativeSpeedPosterior.renormalise(); double newMax = relativeSpeedPosterior.getMaximum(); @@ -384,20 +402,26 @@ } -void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){ +void BayesianArrayStructure::setLikelihoodToConstant(){ + //set new likelihood + relativeSpeedLikelihood.zero(); + relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); +} + + +void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){ + //speedratio is speed of played relative to the recording double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio); -// printf("\nindex of likelihood would be %f\n", index); - if (index >= 0 && index < relativeSpeedPrior.length){ - //then we can do update - - //set new likelihood - relativeSpeedLikelihood.zero(); - relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); - - relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor); + // printf("index of likelihood would be %f for ratio %f\n", index, speedRatio); + if (index >= 0 && index < relativeSpeedPrior.length){ + relativeSpeedLikelihood.addGaussianShape(index , 5, matchFactor); + } +} + +void BayesianArrayStructure::updateTempoDistribution(){ //copy posterior to prior relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); @@ -409,24 +433,9 @@ relativeSpeedPosterior.renormalise(); relativeSpeedPosterior.getMaximum(); - }//end if within range - -} - - -void BayesianArrayStructure::setFlatTempoLikelihood(){ //set new likelihood - relativeSpeedLikelihood.zero(); - relativeSpeedLikelihood.addConstant(0.3); -} - -void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){ - - double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio); - - if (index >= 0 && index < relativeSpeedPrior.length){ - relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5);//*matchFactor); - } + relativeSpeedPosterior.updateIntegratedEstimate(); + speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); } @@ -466,23 +475,23 @@ void BayesianArrayStructure::drawTempoArrays(){ - ofSetColor(0,255,255); - relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize); + ofSetColor(0,0,255); +// relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize); ofSetColor(255,0,255); relativeSpeedLikelihood.drawVector(0, relativeSpeedLikelihood.arraySize); - - ofSetColor(255,255,0); +// relativeSpeedLikelihood.drawConstrainedVector(0, 199, 0, 1000);// relativeSpeedLikelihood.arraySize); + ofSetColor(255,0,0); relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize); - ofSetColor(0,0,255); - tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize); +// ofSetColor(0,0,255); +// tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize); ofSetColor(255,255, 255); ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen - ofSetColor(0, 255, 0); - double fractionOfScreen = ((double)relativeSpeedPosterior.MAPestimate / relativeSpeedPosterior.length); + ofSetColor(155,255, 0); + double fractionOfScreen = ((double)relativeSpeedPosterior.integratedEstimate / relativeSpeedPosterior.length); ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight()); } @@ -534,4 +543,39 @@ } -} \ No newline at end of file +} + + +/* + + void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){ + //speedratio is speed of played relative to the recording + + double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio); + // printf("\nindex of likelihood would be %f\n", index); + if (index >= 0 && index < relativeSpeedPrior.length){ + //then we can do update + + //set new likelihood + relativeSpeedLikelihood.zero(); + relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); + + relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor); + + + //copy posterior to prior + relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); + + //update + relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood); + + //normalise + relativeSpeedPosterior.renormalise(); + + relativeSpeedPosterior.getMaximum(); + }//end if within range + + + } + + */ \ No newline at end of file