view hackday/DynamicVector.cpp @ 36:5a1b0c6fa1fb

Added class to read in the csv Annotation file, then write out the respective difference between the performed piece as followed here, and the annotation of RWC by Ewert and Muller
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Thu, 15 Dec 2011 02:28:49 +0000
parents 9a70d9abdc8b
children
line wrap: on
line source
/*
 *  DynamicVector.cpp
 *  midiCannamReader
 *
 *  Created by Andrew on 18/07/2011.
 *  Copyright 2011 QMUL. All rights reserved.
 *
 */


#include "DynamicVector.h"

DynamicVector::DynamicVector(){
	length = 0;
	arraySize = 0;
	maximumValue = 0;
	MAPestimate = 0;
	offset = 0;
	scalar = 1;
	integratedEstimate = length/2;
	
	gaussianLookupMean = (double) GAUSSIAN_LOOKUP_LENGTH/2;
	gaussianLookupStdDev = (double)(GAUSSIAN_LOOKUP_LENGTH/16);
	double factor = 1.0;//(1.0 / (gaussianLookupStdDev*sqrt(2*PI)) );//1.0;//-1.0/(2*PI*sqrt(gaussianLookupStdDev));
	for (int i = 0;i < GAUSSIAN_LOOKUP_LENGTH;i++){
	gaussianLookupTable[i] = factor*exp(-1.0*(i-gaussianLookupMean)*(i-gaussianLookupMean)/(2.0*gaussianLookupStdDev*gaussianLookupStdDev));
	}
	
}

void DynamicVector::copyFromDynamicVector(const DynamicVector& dynamicVec){
	if (dynamicVec.length == length){
		for (int i = 0;i < length;i++)
			array[i] = dynamicVec.array[i];
	}
	else{
		printf("CANNOT COPY VECTORS OF NON SAME LENGTH!!\n");
	}
}

void DynamicVector::createVector(int len){
	array.clear();
	for (int i = 0; i < len;i++){
		array.push_back(0);
	}
	length = len;
	arraySize = array.size();
	integratedEstimate = length/2;
}


double DynamicVector::getMaximum(){
	int i;
	double max = 0;
	for (i=0;i < length;i++){	
		if (array[i] > max){
			max = array[i];
			MAPestimate = i;
		}
	}
	maximumValue = max;
	return max;
}

double DynamicVector::getIntegratedEstimate(){
	//returns the index of the integrated average - where the probability distribution is centred
	integratedEstimate = 0;
	double integratedTotal = 0;
	for (int i = 0;i < length;i++){
		integratedEstimate += array[i]*i;
		integratedTotal += array[i];
	}
	if (integratedTotal > 0){
		integratedEstimate /= integratedTotal;
	}
	return integratedEstimate;
}

void DynamicVector::updateIntegratedEstimate(){
	//returns the index of the integrated average - where the probability distribution is centred
	integratedEstimate = 0;
	double integratedTotal = 0;
	for (int i = 0;i < length;i++){
		integratedEstimate += array[i]*i;
		integratedTotal += array[i];
	}
	if (integratedTotal > 0){
		integratedEstimate /= integratedTotal;
	}

}

void DynamicVector::updateLimitedIntegratedEstimate(){
	//returns the index of the integrated average - where the probability distribution is centred
	//but limited round the MAP estimate
	double tmp = getMaximum();
	int limit = min(MAPestimate, length - MAPestimate);
	int start = max(0, MAPestimate - limit);
	int end = min(MAPestimate + limit, length-1);
	
	integratedEstimate = 0;
	double integratedTotal = 0;
	for (int i = start;i <= end;i++){
		integratedEstimate += array[i]*i;
		integratedTotal += array[i];
	}
	if (integratedTotal > 0){
		integratedEstimate /= integratedTotal;
	}
	
}


void DynamicVector::zero(){
	for (int i = 0;i < array.size();i++)
		array[i] = 0;
}

void DynamicVector::renormalise(){
	double tmpMax = getMaximum();
	if (tmpMax > 0){
//	printf("renormalise : max is %f and size is %i\n", tmpMax, arraySize);		
		for (int i = 0;i < array.size();i++)
			array[i] /= tmpMax;

	}
	//printArray();
}

void DynamicVector::doProduct(DynamicVector& arrayOne, DynamicVector& arrayTwo){

	for (int i = 0;i < arrayOne.length;i++)
		array[i] = arrayOne.array[i] * arrayTwo.array[i];
}


void DynamicVector::printArray(){
	for (int i = 0;i < arraySize;i++){
		printf("[%i] = %f\n", i, array[i]);
	}
}

void DynamicVector::translateDistribution(int translationIndex){
	int tmpIndex;
	DoubleVector tmpArray;
	int i;

	for (i=0;i < arraySize;i++){
		tmpArray.push_back(array[i]);
	}
	//translate values
	for (i=0;i < arraySize;i++){
		tmpIndex = (i + translationIndex + arraySize)%arraySize;
		array[tmpIndex] = tmpArray[i]; 
	}
	tmpArray.clear();
	//now delete tmp array
}

void DynamicVector::addGaussianShape(const double& mean, const double& StdDev, double factor){
	
	int i;
	double std_dev_factor = (2*StdDev*StdDev);
	factor *= (1/(StdDev*sqrt(2*PI)));
	int maxVal = min((int) array.size(), (int)(mean + 4.8*StdDev));
	int minVal = max(0, (int)(mean - 4.8*StdDev));
	
	for (i=minVal;i < maxVal;i++){
		array[i] += factor*exp(-1*(i-mean)*(i-mean)/(std_dev_factor));
	}
	
//	addGaussianShapeByLookupTable(mean, StdDev, factor);
}

void DynamicVector::addGaussianShapeByLookupTable(double& mean, double& StdDev, double factor){
	int i;
	int lookupIndex ;
	factor *= (1/(StdDev*sqrt(2*PI)));
	for (i=0;i<array.size()-1;i++){
		lookupIndex = round(getLookupIndex(i, mean, StdDev));
		array[i] += factor*gaussianLookupTable[lookupIndex];
	}
	//printf("ADDED GAUSSIAN SHAPE %i\n", (int)array.size());
}

double DynamicVector::getLookupIndex(const int& i, const double& mean, const double& StdDev){
	
	double Z = ((double)i - mean)/StdDev;
	double lookupIndex = Z*gaussianLookupStdDev + gaussianLookupMean;
	
	if (lookupIndex < 0)
		lookupIndex = 0;
	
	if (lookupIndex >= GAUSSIAN_LOOKUP_LENGTH)
		lookupIndex = GAUSSIAN_LOOKUP_LENGTH-1;
	
//	(i - mean)*(i-mean)*(GAUSSIAN_LOOKUP_LENGTH*GAUSSIAN_LOOKUP_LENGTH/16.0)/(StdDev*StdDev);
	return lookupIndex;
}

void DynamicVector::addTriangularShape(double mean, double width, double factor){
	int i;

	for (i= max(0., (double)(mean - width));i < min((mean+width), (double)array.size());i++){
		array[i] += factor * abs(i - mean) / mean;		
	}

}

void DynamicVector::addConstant(const double& value){
	for (int i=0;i<array.size();i++){
		array[i] += value;
	}
}


void DynamicVector::addToIndex(const int& index, const double& constant){
	array[index] += constant;
}


double DynamicVector::getIndexInRealTerms(const int& index){
	if (index < arraySize)
		return (offset + scalar*index);
	else
		return 0;
}

double DynamicVector::getRealTermsAsIndex(double value){
	value -= offset;
	value /= scalar;
	
	return value;
	
}

double DynamicVector::getValueAtMillis(const double& millis){
	
	int index = round(getRealTermsAsIndex(millis));
		if (index >= 0 && index < length)
			return array[index];
		else
			return 0;
}

void DynamicVector::drawVector(const int& minIndex, const int& maxIndex){

		
		double stepSize = ofGetWidth() / (double)(maxIndex - minIndex);
		double screenHeight = (double) ofGetHeight();
		double maxVal = getMaximum();
	
		int startInt = max(1,minIndex+1);
		int endInt = min(maxIndex, (int)array.size());
		double heightConstant = screenHeight / maxVal;
		int lastHeightPixel = heightConstant * (maxVal - array[startInt-1]);
		int newHeightPixel;
		for (int i = startInt;i < endInt;i++){
			newHeightPixel = (int) heightConstant * (maxVal - array[i]);
			ofLine (stepSize*(i-1), lastHeightPixel, stepSize*i, newHeightPixel);
			lastHeightPixel = newHeightPixel;
		}
	
}


void DynamicVector::drawConstrainedVector(const int& minIndex, const int& maxIndex, const int& minScreenIndex, const int& maxScreenIndex){
	//constrain the height and width
	
	double stepSize = (maxScreenIndex - minScreenIndex) / (double)(maxIndex - minIndex);//step size in pixels per array bin 
	double screenHeight = ofGetHeight();
	double maxVal = getMaximum();

	//OPTIMIZE!! XXX could just add stepsize each time
	//not add minindex each time
	int i = max(1,minIndex+1);
//	ofDrawBitmapString("i = "+ofToString(i)+"  :: screen min: "+ofToString(minScreenIndex + stepSize*(i-minIndex-1)), 20, 640);
	
	while ((minScreenIndex + stepSize*(i-minIndex)) < 0)
		i++;//only draw what is on the screen
	
	for ( ; i < min(maxIndex+1, (int)array.size());i++){
		ofLine (minScreenIndex + (stepSize*(i-minIndex-1)), screenHeight * (1 - array[i-1] / maxVal), 
				minScreenIndex + (stepSize*(i-minIndex)),	 screenHeight * (1 - array[i] / maxVal) );
		
	}
	
	ofLine(minScreenIndex, screenHeight, minScreenIndex, screenHeight/2);
	ofLine(maxScreenIndex, screenHeight, maxScreenIndex, screenHeight/2);
	
//	ofDrawBitmapString(ofToString(stepSize, 2)+"  "+ofToString(maxScreenIndex - minScreenIndex, 0), 20, 600);

}