# HG changeset patch # User Andrew N Robertson # Date 1331053456 0 # Node ID fc095148e2a8d1ba785eaa985e3aa2bcb1ce2a85 # Parent 4288150c257b8286cc0bf3b730cccba6e99f9aa0 sending out the KL information that cognitive dynamic paper will be using diff -r 4288150c257b -r fc095148e2a8 newOFsrc/BayesDrumTracker.cpp --- a/newOFsrc/BayesDrumTracker.cpp Tue Mar 06 14:15:35 2012 +0000 +++ b/newOFsrc/BayesDrumTracker.cpp Tue Mar 06 17:04:16 2012 +0000 @@ -304,7 +304,7 @@ m.addFloatArg(maxPhase); beatTimes.tatum = maxTempo; - printf("BEAT INFO %f, %f\n", beatTimes.tatum, maxPhase); +// printf("BEAT INFO %f, %f\n", beatTimes.tatum, maxPhase); sender.sendMessage( m ); @@ -320,7 +320,7 @@ maxTempo += tempoMinimum; beatTimes.tatum = maxTempo; - printf("SEND TATUM %f\n", beatTimes.tatum); +// printf("SEND TATUM %f\n", beatTimes.tatum); m.addFloatArg( maxTempo ); sender.sendMessage( m ); diff -r 4288150c257b -r fc095148e2a8 newOFsrc/bayesianArray.cpp --- a/newOFsrc/bayesianArray.cpp Tue Mar 06 14:15:35 2012 +0000 +++ b/newOFsrc/bayesianArray.cpp Tue Mar 06 17:04:16 2012 +0000 @@ -13,16 +13,16 @@ bayesianArray::bayesianArray(){ likelihoodNoise = 0.5; - likelihoodMean = ARRAY_SIZE/2; - likelihoodStdDev = ARRAY_SIZE / 12; + likelihoodMean = arraySize/2; + likelihoodStdDev = arraySize / 12; initialiseArray(); } void bayesianArray::initialiseArray(){ //maximumIndex = 12;//change this - setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1); - setGaussianLikelihood(ARRAY_SIZE/2, ARRAY_SIZE/1);//likelihoodMean, likelihoodStdDev); + setGaussianPrior(arraySize/2, arraySize/1); + setGaussianLikelihood(arraySize/2, arraySize/1);//likelihoodMean, likelihoodStdDev); calculatePosterior(); renormalisePosterior(); @@ -32,9 +32,9 @@ earlySixteenthNoteProportion = 0; lateSixteenthNoteProportion = 0; decayNoiseAmount = 0.1; - decayNoiseStdDev = ARRAY_SIZE/24; + decayNoiseStdDev = arraySize/24; standardDeviation = likelihoodStdDev; - setDecayNoiseGaussian(ARRAY_SIZE/2, decayNoiseStdDev); + setDecayNoiseGaussian(arraySize/2, decayNoiseStdDev); setGaussianLikelihood(likelihoodMean, likelihoodStdDev); } @@ -42,7 +42,7 @@ void bayesianArray::setGaussianPrior(float mean, float StdDev){ int i; - for (i=0;i= 0 && mean <= ARRAY_SIZE){ +if (mean >= 0 && mean <= arraySize){ int i; float eighthDifference; //main beat position plus these three: -int eighthPosition = ((int)mean + ARRAY_SIZE/2)%ARRAY_SIZE; -int earlySixteenthPosition = ((int)mean + (3*ARRAY_SIZE/4))%ARRAY_SIZE;; -int lateSixteenthPosition = ((int)mean + (ARRAY_SIZE/4))%ARRAY_SIZE;; +int eighthPosition = ((int)mean + arraySize/2)%arraySize; +int earlySixteenthPosition = ((int)mean + (3*arraySize/4))%arraySize;; +int lateSixteenthPosition = ((int)mean + (arraySize/4))%arraySize;; float mainDifference, sixteenthDifference; float gaussianProportion = 1 - likelihoodNoise; float mainProportion = (1 - eighthNoteProportion - earlySixteenthNoteProportion - lateSixteenthNoteProportion); - for (i=0;i < ARRAY_SIZE;i++){ + for (i=0;i < arraySize;i++){ - mainDifference = min( fabs(i-mean) , (double)(i + ARRAY_SIZE - mean)); + mainDifference = min( fabs(i-mean) , (double)(i + arraySize - mean)); likelihood[i] = gaussianProportion * mainProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(mainDifference)*(mainDifference)/(2*StdDev*StdDev)) ; - eighthDifference = min( abs(i - eighthPosition) , i + ARRAY_SIZE - eighthPosition); - eighthDifference = min(eighthDifference , (float)(ARRAY_SIZE + eighthPosition - i )); + eighthDifference = min( abs(i - eighthPosition) , i + arraySize - eighthPosition); + eighthDifference = min(eighthDifference , (float)(arraySize + eighthPosition - i )); //for e.g. +0.43, or -0.47 we require the gaussian around the half note too likelihood[i] += gaussianProportion * eighthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(eighthDifference)*(eighthDifference)/(2*StdDev*StdDev)) ; - sixteenthDifference = min( abs(i - earlySixteenthPosition) , i + ARRAY_SIZE - earlySixteenthPosition); - sixteenthDifference = min(sixteenthDifference , (float)(ARRAY_SIZE + earlySixteenthPosition - i )); + sixteenthDifference = min( abs(i - earlySixteenthPosition) , i + arraySize - earlySixteenthPosition); + sixteenthDifference = min(sixteenthDifference , (float)(arraySize + earlySixteenthPosition - i )); //for e.g. +0.43, or -0.47 we require the gaussian around the half note too likelihood[i] += gaussianProportion * earlySixteenthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(sixteenthDifference)*(sixteenthDifference)/(2*StdDev*StdDev)) ; - sixteenthDifference = min( abs(i - lateSixteenthPosition) , i + ARRAY_SIZE - lateSixteenthPosition); - sixteenthDifference = min(sixteenthDifference , (float)(ARRAY_SIZE + lateSixteenthPosition - i )); + sixteenthDifference = min( abs(i - lateSixteenthPosition) , i + arraySize - lateSixteenthPosition); + sixteenthDifference = min(sixteenthDifference , (float)(arraySize + lateSixteenthPosition - i )); //for e.g. +0.43, or -0.47 we require the gaussian around the half note too likelihood[i] += gaussianProportion * lateSixteenthNoteProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(sixteenthDifference)*(sixteenthDifference)/(2*StdDev*StdDev)) ; - likelihood[i] += (likelihoodNoise / ARRAY_SIZE); + likelihood[i] += (likelihoodNoise / arraySize); //likelihood[i] = (float) max(gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev)) , - //(double) (likelihoodNoise / ARRAY_SIZE) ); + //(double) (likelihoodNoise / arraySize) ); } -// renormaliseArray(&likelihood[0], ARRAY_SIZE); +// renormaliseArray(&likelihood[0], arraySize); }//end if mean within limits } void bayesianArray::setGaussianLikelihood(float mean, float StdDev){ -if (mean >= 0 && mean <= ARRAY_SIZE){ +if (mean >= 0 && mean <= arraySize){ int i; float eighthDifference; -int eighthPosition = ((int)mean + ARRAY_SIZE/2)%ARRAY_SIZE; +int eighthPosition = ((int)mean + arraySize/2)%arraySize; float mainDifference; float gaussianProportion = 1 - likelihoodNoise; - for (i=0;i < ARRAY_SIZE;i++){ + for (i=0;i < arraySize;i++){ - mainDifference = min( fabs(i-mean) , (double)(i + ARRAY_SIZE - mean)); + mainDifference = min( fabs(i-mean) , (double)(i + arraySize - mean)); //without * (1 - eighthNoteProportion) likelihood[i] = gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(mainDifference)*(mainDifference)/(2*StdDev*StdDev)) ; - likelihood[i] += (likelihoodNoise / ARRAY_SIZE); + likelihood[i] += (likelihoodNoise / arraySize); //likelihood[i] = (float) max(gaussianProportion * (1/(StdDev*sqrt(2*PI)))*exp(-1*(i-mean)*(i-mean)/(2*StdDev*StdDev)) , - //(double) (likelihoodNoise / ARRAY_SIZE) ); + //(double) (likelihoodNoise / arraySize) ); } -// renormaliseArray(&likelihood[0], ARRAY_SIZE); +// renormaliseArray(&likelihood[0], arraySize); }//end if mean within limits } void bayesianArray::calculatePosterior(){ int i; - for (i=0;i < ARRAY_SIZE;i++){ + for (i=0;i < arraySize;i++){ posterior[i] = likelihood[i] * prior[i]; } //renormalisePosterior(); @@ -165,7 +165,7 @@ float integratedQuantity = 0; float integratedTotal = 0; double integratedIndex = 0; - for (i=0;i < ARRAY_SIZE;i++){ + for (i=0;i < arraySize;i++){ integratedQuantity += posterior[i];//the values of the probability distribution integratedTotal += i*posterior[i]; } @@ -182,7 +182,7 @@ double total = 0; double pdfSum; double variance = 0; - for (int i=0;i < ARRAY_SIZE;i++){ + for (int i=0;i < arraySize;i++){ //*posterior[i] * total += posterior[i] * (i - integratedEstimate) * (i - integratedEstimate);//the values of the probability distribution pdfSum += posterior[i]; @@ -191,7 +191,7 @@ if (pdfSum > 0) variance = total / pdfSum; else - variance = ARRAY_SIZE; + variance = arraySize; standardDeviation = sqrt(variance); return standardDeviation; @@ -214,7 +214,7 @@ void bayesianArray::resetPrior(){ int i; - for (i=0;imax){ maximumIndex = i; max = posterior[i]; @@ -288,12 +288,12 @@ int tmpIndex; //copy array int i; - for (i=0;i < ARRAY_SIZE;i++){ + for (i=0;i < arraySize;i++){ tempPosteriorArray[i] = posterior[i] ; } //translate values - for (i=0;i < ARRAY_SIZE;i++){ - tmpIndex = (i + translationIndex + ARRAY_SIZE)%ARRAY_SIZE; + for (i=0;i < arraySize;i++){ + tmpIndex = (i + translationIndex + arraySize)%arraySize; posterior[tmpIndex] = tempPosteriorArray[i]; } //now delete tmp array @@ -304,7 +304,7 @@ //take no chances - renormalise both prior and posterior renormalisePosterior(); renormalisePrior(); - for (int i = 0;i < ARRAY_SIZE;i++){ + for (int i = 0;i < arraySize;i++){ if (posterior[i] > 0 && prior[i] > 0){ KLsum += (posterior[i]*log(posterior[i]/prior[i])); } @@ -315,7 +315,7 @@ double bayesianArray::getEntropyOfPosterior(){ double entropy = 0; //make sure normalised? (it is) - for (int i = 0;i < ARRAY_SIZE;i++){ + for (int i = 0;i < arraySize;i++){ if (posterior[i] > 0){ entropy += posterior[i]*log(posterior[i]); } diff -r 4288150c257b -r fc095148e2a8 newOFsrc/bayesianArray.h --- a/newOFsrc/bayesianArray.h Tue Mar 06 14:15:35 2012 +0000 +++ b/newOFsrc/bayesianArray.h Tue Mar 06 17:04:16 2012 +0000 @@ -10,7 +10,7 @@ #ifndef _BAYESIAN_ARRAY #define _BAYESIAN_ARRAY -#define ARRAY_SIZE 240 +//#define arraySize 240 class bayesianArray{ @@ -42,12 +42,14 @@ float* getMaximumEstimate(float *ptr, int length); double getIntegratedEstimateIndex(); - float prior [ARRAY_SIZE]; - float posterior [ARRAY_SIZE]; - float likelihood [ARRAY_SIZE]; - float tempPosteriorArray[ARRAY_SIZE]; + static int const arraySize = 240; + + float prior [arraySize]; + float posterior [arraySize]; + float likelihood [arraySize]; + float tempPosteriorArray[arraySize]; - float decayNoiseArray[ARRAY_SIZE]; + float decayNoiseArray[arraySize]; float decayNoiseStdDev, decayNoiseAmount; float likelihoodMean, likelihoodStdDev, likelihoodNoise; diff -r 4288150c257b -r fc095148e2a8 newOFsrc/testApp.cpp --- a/newOFsrc/testApp.cpp Tue Mar 06 14:15:35 2012 +0000 +++ b/newOFsrc/testApp.cpp Tue Mar 06 17:04:16 2012 +0000 @@ -55,29 +55,7 @@ KLdiv = 0; entropy = 0; -/* - beatDistribution.initialiseArray(); - tempoDistribution.initialiseArray(); - beatTimes.lastBeatTime = 0; - correctionFactor = 0.5; - - - tempoDistribution.likelihoodStdDev = ARRAY_SIZE / 32; -// tempoDistribution.likelihoodNoise = 0.96; - tempoDistribution.likelihoodNoise = 0.7; - tempoDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1);//wide - - beatDistribution.likelihoodStdDev = ARRAY_SIZE / 32; - beatDistribution.likelihoodNoise = 0.56; - beatDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1); - - - tempoMinimum = 180; - tempoMaximum = 400; - posteriorMaximum = 0.1; - - */ hidePriorMode = false; printInterval = true; @@ -106,27 +84,7 @@ void testApp::resetParameters(){ - /* - beatTimes.startIndex = 0; - beatTimes.lastBeatTime = 0; - maxPhase = 0; - posteriorMaximum = 0.1; - - accompanimentStarted = false; - tempoDistribution.likelihoodNoise = 0.8; - tempoDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/2);//wide - - beatDistribution.initialiseArray(); - tempoDistribution.initialiseArray(); - - tempoDistribution.calculateStandardDeviation(); - beatDistribution.calculateStandardDeviation(); - - tempoStdDev = tempoDistribution.standardDeviation; - - beatTimes.resetBeatTimeArray(); - */ } //-------------------------------------------------------------- @@ -168,11 +126,22 @@ if ( m.getAddress() == "/beatError" ){ double timeNow = ofGetElapsedTimeMillis(); if (timeNow - drumTracker.setBeatToNowTime > 1000) + recentError = m.getArgAsFloat(0); + int size = drumTracker.beatDistribution.arraySize; + int newIndex = round((size/2)+(recentError*size)); + double priorValue = drumTracker.beatDistribution.posterior[newIndex]; drumTracker.newKickError(m.getArgAsFloat(0), m.getArgAsFloat(2), m.getArgAsString(1)); + KLdiv = drumTracker.beatDistribution.getKLdivergence(); entropy = drumTracker.beatDistribution.getEntropyOfPosterior(); - recentError = m.getArgAsFloat(0); + drumType = m.getArgAsString(1); + beatPosition = m.getArgAsFloat(3); + printf("NEW BEAT: time %f error %f, position %f, drum %s, ", m.getArgAsFloat(2), recentError, beatPosition, drumType.c_str()); + + printf("KL div %f, entropy %f prior value %f, ", KLdiv, entropy, priorValue); + + printf("tatum is %f\n", drumTracker.beatTimes.tatum ); }//end if new error @@ -1549,3 +1518,48 @@ } */ +/* + beatDistribution.initialiseArray(); + tempoDistribution.initialiseArray(); + beatTimes.lastBeatTime = 0; + correctionFactor = 0.5; + + + + tempoDistribution.likelihoodStdDev = ARRAY_SIZE / 32; + // tempoDistribution.likelihoodNoise = 0.96; + tempoDistribution.likelihoodNoise = 0.7; + tempoDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1);//wide + + beatDistribution.likelihoodStdDev = ARRAY_SIZE / 32; + beatDistribution.likelihoodNoise = 0.56; + beatDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/1); + + + tempoMinimum = 180; + tempoMaximum = 400; + posteriorMaximum = 0.1; + + */ + +/* + beatTimes.startIndex = 0; + beatTimes.lastBeatTime = 0; + maxPhase = 0; + posteriorMaximum = 0.1; + + accompanimentStarted = false; + + tempoDistribution.likelihoodNoise = 0.8; + tempoDistribution.setGaussianPrior(ARRAY_SIZE/2, ARRAY_SIZE/2);//wide + + beatDistribution.initialiseArray(); + tempoDistribution.initialiseArray(); + + tempoDistribution.calculateStandardDeviation(); + beatDistribution.calculateStandardDeviation(); + + tempoStdDev = tempoDistribution.standardDeviation; + + beatTimes.resetBeatTimeArray(); + */ \ No newline at end of file diff -r 4288150c257b -r fc095148e2a8 newOFsrc/testApp.h --- a/newOFsrc/testApp.h Tue Mar 06 14:15:35 2012 +0000 +++ b/newOFsrc/testApp.h Tue Mar 06 17:04:16 2012 +0000 @@ -124,6 +124,8 @@ double KLdiv, entropy, recentError; string drumType; + double beatPosition; + void drawKLdivAndEntropy(); private: