andrew@0: /* andrew@0: * BayesianArrayStructure.h andrew@0: * midiCannamReader andrew@0: * andrew@0: * Created by Andrew on 17/07/2011. andrew@0: * Copyright 2011 QMUL. All rights reserved. andrew@0: * andrew@0: */ andrew@0: #ifndef BAYESIAN_ARRAY_STRUCTURE andrew@0: #define BAYESIAN_ARRAY_STRUCTURE andrew@0: andrew@0: andrew@0: #include "ofMain.h" andrew@0: //#include "DynamicBayesianArray.h" andrew@0: #include "DynamicVector.h" andrew@0: andrew@0: class BayesianArrayStructure { andrew@0: andrew@0: public: andrew@0: // BayesianArrayStructure(); andrew@0: BayesianArrayStructure(); andrew@0: BayesianArrayStructure(int length); andrew@0: andrew@0: void calculatePosterior(); andrew@0: void drawArrays(); andrew@0: void drawArraysRelativeToTimeframe(const double& startTimeMillis, const double& endTimeMillis); andrew@0: andrew@0: void drawTempoArrays(); andrew@0: andrew@0: void resetSize(int length); andrew@0: void resetArrays(); andrew@0: void simpleExample(); andrew@0: void setStartPlaying(); andrew@0: void zeroArrays(); andrew@0: andrew@0: double screenWidth; andrew@0: andrew@0: void copyPriorToPosterior(); andrew@0: // DynamicBayesianArray bayesArray; andrew@0: andrew@0: double lastEventTime; andrew@0: double likelihoodNoise; andrew@0: double speedLikelihoodNoise; andrew@0: andrew@0: //DynamicVector tmpPrior; andrew@0: DynamicVector tmpPosteriorForStorage; andrew@0: DynamicVector prior; andrew@0: DynamicVector posterior; andrew@0: DynamicVector likelihood; andrew@0: andrew@0: DynamicVector relativeSpeedPrior; andrew@0: DynamicVector relativeSpeedLikelihood; andrew@0: DynamicVector relativeSpeedPosterior; andrew@0: DynamicVector acceleration; andrew@0: andrew@0: double tmpBestEstimate; andrew@4: andrew@4: // void updateTmpBestEstimate(const double& timeDifference); andrew@0: andrew@0: int updateCounter; andrew@0: andrew@0: void setPositionDistributionScalar(double f); andrew@0: andrew@0: void resetSpeedToOne(); andrew@0: void addGaussianNoiseToSpeedPosterior(const double& std_dev); andrew@0: void addTriangularNoiseToSpeedPosterior(const double& std_dev); andrew@0: andrew@0: double bestEstimate; andrew@0: void updateBestEstimate(const double& timeDifference); andrew@0: double lastBestEstimateUpdateTime; andrew@0: double speedEstimate, speedEstimateIndex; andrew@4: double getSpeedEstimateIndex(); andrew@0: andrew@0: double speedDecayWidth, speedDecayAmount; andrew@0: void decaySpeedDistribution(double timeDifference); andrew@0: andrew@0: void resetSpeedSize(int length); andrew@0: void setRelativeSpeedScalar(double f); andrew@0: void setSpeedPrior(double f); andrew@0: void calculateNewPriorOffset(const double& timeDifference); andrew@0: void setNewDistributionOffsets(const double& newOffset); andrew@0: andrew@0: void setLikelihoodToConstant(); andrew@0: void updateTempoLikelihood(const double& speedRatio, const double& matchFactor); andrew@0: void updateTempoDistribution(); andrew@0: andrew@0: void calculateTempoUpdate(); andrew@0: andrew@6: void updateBayesianDistributions(const double& newEventTime); andrew@0: void crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference); andrew@0: void complexCrossUpdate(const double& timeDifferenceInPositionVectorUnits); andrew@0: void translateByMaximumSpeed(const double& timeDifferenceInPositionVectorUnits); andrew@0: double crossUpdateTimeThreshold;//time after which we do complex update of multiple speeds andrew@0: andrew@0: double speedPriorValue; andrew@0: int priorWidth; andrew@0: bool* realTimeMode; andrew@0: bool usingIntegratedTempoEstimate; andrew@0: double relativeSpeedLikelihoodStdDev; andrew@6: andrew@11: void projectDistribution(const double& newEventTime, const double& newAlignmentPosition, DynamicVector& projectedPrior); andrew@11: void complexCrossUpdateProjection(DynamicVector& projectedPrior, const double& timeDifferenceInPositionVectorUnits); andrew@11: void translatePosteriorByMaximumSpeed(DynamicVector& translatedPosterior, const double& timeDifferenceInPositionVectorUnits); andrew@11: andrew@6: void printPostOffset(); andrew@42: int startingWindowWidth, matchWindowWidth; andrew@7: bool updatingSpeedDistribution;//false for testing andrew@0: andrew@53: void zeroDistributionAtPosition(DynamicVector& distribution, const double& position); andrew@0: }; andrew@0: #endif