view src/TimeWarp.h @ 4:f40577e6b30d

revised this to work with onset and chroma and looking now to do sequential DTW
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Wed, 08 Jun 2011 17:35:56 +0100
parents
children 0d51e93bfe74
line wrap: on
line source
/*
 *  TimeWarp.h
 *  chromaReader13
 *
 *  Created by Andrew on 16/05/2011.
 *  Copyright 2011 QMUL. All rights reserved.
 *
 */

#ifndef _TIME_WARP
#define _TIME_WARP


#include "ofMain.h"
#include "chromaGram.h"
#include "ChordDetect.h"
#include "sndfile.h"
#include "ofxFileDialogOSX.h"


#define FRAMESIZE 512
#define ENERGY_LENGTH 80000
#define CHROMA_LENGTH 12000
#define CHROMA_CONVERSION_FACTOR 16 //16 times as many frames in energy as in chroma
//length in terms of frames (at 512 samples per frame - there are 90 per second) => 900: 10 seconds
#define ALIGNMENT_FRAMESIZE 128

class TimeWarp : public ofBaseApp{
	
public:
	TimeWarp();											// constructor
	~TimeWarp();

	void initialiseVariables();

	//variables
	typedef std::vector<double> DoubleVector;
	typedef std::vector<DoubleVector> DoubleMatrix;
	
	DoubleMatrix chromaMatrix;
	DoubleMatrix secondMatrix;
	DoubleMatrix* matrixPtr;

	DoubleVector firstEnergyVector;
	DoubleVector secondEnergyVector;	
	
	DoubleMatrix firstChromaEnergyMatrix;
	DoubleMatrix secondChromaEnergyMatrix;
	
	Chromagram chromoGramm;
	Chromagram secondChromoGramm;
	
	DoubleMatrix similarityMatrix;
	DoubleMatrix tmpSimilarityMatrix;
	DoubleMatrix alignmentMeasureMatrix;
	DoubleMatrix tmpAlignmentMeasureMatrix;	
	DoubleVector minimumAlignmentPath;
	
	double partAlignmentMeasureMatrix[ALIGNMENT_FRAMESIZE][ALIGNMENT_FRAMESIZE];
	
	typedef std::vector<int> IntVector;
	typedef std::vector<IntVector> IntMatrix;
	IntMatrix backwardsAlignmentPath;
	IntMatrix tmpBackwardsPath;
	
	int backwardsAlignmentIndex;
	
	IntMatrix partBackwardsAlignmentPath;
	IntMatrix forwardsAlignmentPath;
	
	int partBackwardsAlignmentIndex;

	
	void createCombinedMatrix(DoubleMatrix myChromaMatrix, DoubleVector energyVector, DoubleMatrix* chromaEnergyMatrix);

	void calculateSimilarityMatrix();

	
	
	
	//new addition
	void calculateSimilarityMatrixWithPointers(DoubleMatrix firstChromaMatrix, DoubleMatrix secondChromaMatrix, DoubleMatrix* simMatrix);
	DoubleMatrix superAlignmentMeasureMatrix;	//for the onset + chromagram alignment
	DoubleVector superMinimumAlignmentPath;	
	//end new additions
	
	int findStartWidthFrame();	  

	


	
	void calculateAlignmentMatrix(DoubleMatrix firstMatrix, DoubleMatrix secondMatrix, DoubleMatrix *alignmentMatrix);
	double getDistance(int i, int j);

	double getRestrictedMinimum(int i, int j, float newValue, int minX, int minY);
	bool extendRestrictedAlignmentUp(int startX, int startY, int endIndexY, DoubleMatrix *alignmentMatrix);
	bool extendRestrictedAlignmentAlong(int startX, int startY, int endIndexX, DoubleMatrix* alignmentMatrix);
	
	double getMinimum(int i, int j, float newValue);
	bool extendAlignmentUp(int endIndexY, DoubleMatrix *alignmentMatrix);
	bool extendAlignmentAlong(int endIndexX, DoubleMatrix *alignmentMatrix);
	void calculateMinimumAlignmentPath(DoubleMatrix alignmentMatrix);
	void extendForwardAlignmentPath(int endX);
	
	
	bool findPreviousMinimumInBackwardsPath();
	bool testForNewAlignmentMinimum(double *previousMinimum, int i, int j);	
	
	int findMinimumOfVector(DoubleVector *d);
	
	
	void addNewForwardsPath(int indexX);

	void calculatePartSimilarityMatrix(DoubleMatrix firstChromaMatrix, DoubleMatrix secondChromaMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX);
	
//	void calculatePartAlignmentMatrix(int startIndexX, int startIndexY, int endIndexX, int endIndexY, DoubleMatrix* alignmentMatrix);
	void calculatePartMinimumAlignmentPath(int startX, int startY, int endX, int endY, DoubleMatrix alignmentMatrix);
		bool findPreviousMinimumInPartBackwardsPath();
	
	float diagonalPenalty;
	
};

#endif