Mercurial > hg > audio-time-warp
changeset 9:9adcffbdc16d
fixed bug with switching and make sure alignIndex never goes to zero, added in limit to the joint matrix that gets created.
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Mon, 07 Nov 2011 18:08:43 +0000 |
parents | 166bece5922c |
children | 69419f188284 |
files | src/TimeWarp.cpp src/TimeWarp.h src/testApp.cpp src/timeWarp.cpp src/timeWarp.h |
diffstat | 5 files changed, 28 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/TimeWarp.cpp Mon Nov 07 17:24:52 2011 +0000 +++ b/src/TimeWarp.cpp Mon Nov 07 18:08:43 2011 +0000 @@ -428,7 +428,7 @@ -void TimeWarp::calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX){ +void TimeWarp::calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX, int endY){ printf("PART SIM CALC Calculate similarity : pointers : size %i x %i ", startX, startY);//(int) (*firstEnergyVector).size(), (int) (*secondEnergyVector).size()); conversionFactor = (int) round((*firstEnergyVector).size() / (*chromaSimMatrix).size() ); @@ -443,7 +443,8 @@ for (int x = startX;x <= endX;x++){ DoubleVector d; - for (int y = startY;y < (*secondEnergyVector).size();y++){ + for (int y = startY;y < min( endY+1, (int)(*secondEnergyVector).size());y++){ + //was thinking to restrict the y part too, but not working yet distance = (*firstEnergyVector)[x] * (*secondEnergyVector)[y];//energy similarity
--- a/src/TimeWarp.h Mon Nov 07 17:24:52 2011 +0000 +++ b/src/TimeWarp.h Mon Nov 07 18:08:43 2011 +0000 @@ -89,7 +89,7 @@ void calculateJointSimilarityMatrix(DoubleVector* energyVectorOne, DoubleVector* energyVectorTwo, DoubleMatrix* chromaSimilarityMatrix, DoubleMatrix* simMatrix); - void calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX); + void calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX, int endY); double getJointChromaAndEnergyDistance(DoubleVector* energyVectorOne, DoubleMatrix* firstChromaMatrix, DoubleVector* energyVectorTwo, DoubleMatrix* secondChromaMatrix, int energyIndexX, int energyIndexY, double energyProportion, double chromaProportion);
--- a/src/testApp.cpp Mon Nov 07 17:24:52 2011 +0000 +++ b/src/testApp.cpp Mon Nov 07 18:08:43 2011 +0000 @@ -183,7 +183,8 @@ // tw.calculatePartSimilarityMatrix(&tw.firstChromaEnergyMatrix, &tw.secondChromaEnergyMatrix, &tw.tmpSimilarityMatrix, startFrameX, startFrameY, startFrameX+frameSize); //NEW FUNCTION - calls only the energy and uses the stored chromagram - tw.calculatePartJointSimilarityMatrix(&tw.firstEnergyVector, &tw.secondEnergyVector, &tw.chromaSimilarityMatrix, &tw.tmpSimilarityMatrix, startFrameX, startFrameY, startFrameX+frameSize); + tw.calculatePartJointSimilarityMatrix(&tw.firstEnergyVector, &tw.secondEnergyVector, &tw.chromaSimilarityMatrix, &tw.tmpSimilarityMatrix, + startFrameX, startFrameY, startFrameX+frameSize, startFrameY + 3*frameSize); @@ -212,11 +213,11 @@ tw.calculateMinimumAlignmentPath(&tw.tmpAlignmentMeasureMatrix, &tw.tmpBackwardsPath, true);//true is for greedy calculation printf("\n PART ALIGNMENT GENERATES THIS BACKWARDS PATH:: \n"); tw.extendForwardAlignmentPath(hopsize, &tw.tmpBackwardsPath, startFrameX, startFrameY); - printf("forwards path printed\n"); + startFrameY = tw.forwardsAlignmentPath[1][(tw.forwardsAlignmentPath[0].size()-1)]; - - tw.printBackwardsPath(0, tw.forwardsAlignmentPath[0].size(), &tw.forwardsAlignmentPath); + //printf("forwards path printed\n"); + // tw.printBackwardsPath(0, tw.forwardsAlignmentPath[0].size(), &tw.forwardsAlignmentPath); //pushSimCode()? }//end for startFrameX @@ -306,12 +307,17 @@ void testApp::updateAlignmentPathIndex(int identifier){ + if (tw.backwardsAlignmentPath.size() > 0){ + + if (backwardsAlignmentIndex >= tw.backwardsAlignmentPath[identifier].size()) + backwardsAlignmentIndex = tw.backwardsAlignmentPath[identifier].size()-1; + //this is the alignment where we are currently playing - i.e. switching between files int chromaPosition = audioPosition;///conversionFactor;//CHROMA_CONVERSION_FACTOR; - while (tw.backwardsAlignmentPath[identifier][backwardsAlignmentIndex] < chromaPosition) + while (tw.backwardsAlignmentPath[identifier][backwardsAlignmentIndex] < chromaPosition && backwardsAlignmentIndex > 0) { backwardsAlignmentIndex--; } @@ -628,7 +634,7 @@ // printf("DRAW SIM SIZE start frames %i x %i \n", startingXframe, startingYframe); if (tw.backwardsAlignmentPath.size() > 0 ){ startingXframe = (tw.backwardsAlignmentPath[0][backwardsAlignmentIndex]/ scrollWidth); - startingYframe = max(0, (int)(tw.backwardsAlignmentPath[1][backwardsAlignmentIndex]/ scrollWidth));//*conversionFactor + startingYframe = max(0 , (int)(tw.backwardsAlignmentPath[1][backwardsAlignmentIndex]/ scrollWidth));//*conversionFactor //FIX THE 1 - ASDDED AS DEBUG // printf("alignment index %i, VERSUS DRAW SIM SIZE %i x %i \n", backwardsAlignmentIndex, startingXframe, startingYframe); } @@ -1409,7 +1415,7 @@ //swapping between files //printf("current playing (energy scale) frame was %i \n", currentPlayingFrame); float oldPosition = (*playingAudio).getPosition(); - printf("\n playing position is %f and c onv factor %f \n", (*playingAudio).getPosition(), conversionFactor); + printf("\n playing position is %f and conv factor %f \n", (*playingAudio).getPosition(), conversionFactor); //(*playingAudio).stop(); (*playingAudio).setPaused(true); @@ -1430,7 +1436,7 @@ // currentChromaFrame = oldPosition * (float) tw.backwardsAlignmentPath[1-newIndicator][0]; currentChromaFrame = currentPlayingFrame;// / conversionFactor; - printf("current chroma frame %i and using energy frames would have been %i \n", currentChromaFrame, currentPlayingFrame / conversionFactor);//CHROMA_CONVERSION_FACTOR); + printf("current chroma frame %i \n", currentChromaFrame);//and using energy frames would have been %i \n", currentChromaFrame, currentPlayingFrame / conversionFactor);//CHROMA_CONVERSION_FACTOR); int matchingFrame = findMatchFromAlignment(firstAudioFilePlaying); float relativePosition = matchingFrame / (float) tw.backwardsAlignmentPath[newIndicator][0]; @@ -1440,7 +1446,7 @@ (*playingAudio).setPosition(relativePosition); printf("matching frame is %i and length is %i \n", matchingFrame, tw.backwardsAlignmentPath[newIndicator][0]); - printf("new playing position is %f \n", (*playingAudio).getPosition()); + printf("new playing position is %f and back align index %i \n", (*playingAudio).getPosition(), backwardsAlignmentIndex); firstAudioFilePlaying = !firstAudioFilePlaying; @@ -1458,10 +1464,13 @@ int oppositeIndicator = 1 - indicator; - int frame = tw.backwardsAlignmentPath[indicator].size()-1; + int frame = backwardsAlignmentIndex;// tw.backwardsAlignmentPath[indicator].size()-1; + while (tw.backwardsAlignmentPath[indicator][frame] > currentChromaFrame && backwardsAlignmentIndex < tw.backwardsAlignmentPath[indicator].size()-1){ + frame++; + } - while (tw.backwardsAlignmentPath[indicator][frame] < currentChromaFrame){ + while (tw.backwardsAlignmentPath[indicator][frame] < currentChromaFrame && frame > 0){ frame--; } //printf("frame found is %i \n", frame);
--- a/src/timeWarp.cpp Mon Nov 07 17:24:52 2011 +0000 +++ b/src/timeWarp.cpp Mon Nov 07 18:08:43 2011 +0000 @@ -428,7 +428,7 @@ -void TimeWarp::calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX){ +void TimeWarp::calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX, int endY){ printf("PART SIM CALC Calculate similarity : pointers : size %i x %i ", startX, startY);//(int) (*firstEnergyVector).size(), (int) (*secondEnergyVector).size()); conversionFactor = (int) round((*firstEnergyVector).size() / (*chromaSimMatrix).size() ); @@ -443,7 +443,8 @@ for (int x = startX;x <= endX;x++){ DoubleVector d; - for (int y = startY;y < (*secondEnergyVector).size();y++){ + for (int y = startY;y < min( endY+1, (int)(*secondEnergyVector).size());y++){ + //was thinking to restrict the y part too, but not working yet distance = (*firstEnergyVector)[x] * (*secondEnergyVector)[y];//energy similarity
--- a/src/timeWarp.h Mon Nov 07 17:24:52 2011 +0000 +++ b/src/timeWarp.h Mon Nov 07 18:08:43 2011 +0000 @@ -89,7 +89,7 @@ void calculateJointSimilarityMatrix(DoubleVector* energyVectorOne, DoubleVector* energyVectorTwo, DoubleMatrix* chromaSimilarityMatrix, DoubleMatrix* simMatrix); - void calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX); + void calculatePartJointSimilarityMatrix(DoubleVector* firstEnergyVector, DoubleVector* secondEnergyVector, DoubleMatrix* chromaSimMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX, int endY); double getJointChromaAndEnergyDistance(DoubleVector* energyVectorOne, DoubleMatrix* firstChromaMatrix, DoubleVector* energyVectorTwo, DoubleMatrix* secondChromaMatrix, int energyIndexX, int energyIndexY, double energyProportion, double chromaProportion);