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