boblsturm@0: function [ Y, PrunedFrames, KeepCorpusFrames ] = prune_corpus( target, corpus, reduction_coef ) boblsturm@0: boblsturm@0: if reduction_coef == 1 boblsturm@0: Y = corpus; boblsturm@0: PrunedFrames = []; boblsturm@0: KeepCorpusFrames = []; boblsturm@0: return; boblsturm@0: end boblsturm@0: [targetRows, targetCols]= size( target ); boblsturm@0: [corpusRows, corpusCols]= size( corpus ); boblsturm@0: boblsturm@0: % Matrix: distances of every target frame to every other target frame boblsturm@0: % i.e. Self-similarity matrix boblsturm@0: TargetSelfSimMat = zeros(targetCols); boblsturm@0: boblsturm@0: % Matrix: distances of every target frame to every corpus frame boblsturm@0: % Matrix( i, j ) = Similarity of corpus frame i to target frame j boblsturm@0: % TargetToCorpSimMat = -1*ones(WCols, targetCols); boblsturm@0: boblsturm@0: % Calculate self-similarity of target (euclidean dist) boblsturm@0: X2 = sum(target.^2,1); boblsturm@0: TargetSelfSimMat = bsxfun(@plus,X2,X2')-2*(target'*target); boblsturm@0: % TargetSelfSimMat = exp(-(1/10) * DistanceMat); boblsturm@0: boblsturm@0: % Calculate the distance between each corpus frame to first target boblsturm@0: % frame boblsturm@0: KeepCorpusFrames = []; boblsturm@0: RemainingTargetFrames = 1:targetCols; boblsturm@0: RemainingCorpusFrames = 1:corpusCols; boblsturm@0: boblsturm@0: while ~isempty(RemainingTargetFrames) boblsturm@0: Dist = repmat(target(:,RemainingTargetFrames(1)),1, ... boblsturm@0: length(RemainingCorpusFrames)) - corpus(:,RemainingCorpusFrames); boblsturm@0: Distances = sum(Dist.^2,1); boblsturm@0: % compute mean distances boblsturm@0: meanDistance = mean(Distances); boblsturm@0: boblsturm@0: % find those corpus frames closer than reduction_coef of mean boblsturm@0: idxcorpuskeep = Distances < reduction_coef*meanDistance; boblsturm@0: KeepCorpusFrames = [KeepCorpusFrames RemainingCorpusFrames(idxcorpuskeep)]; boblsturm@0: boblsturm@0: % find those target frames within twice that to next frame boblsturm@0: distancetonext = TargetSelfSimMat(RemainingTargetFrames(1)+1,RemainingTargetFrames(1)); boblsturm@0: idxtarget = TargetSelfSimMat(RemainingTargetFrames,RemainingTargetFrames(1)) ... boblsturm@0: < 2*distancetonext; boblsturm@0: boblsturm@0: if ~any( idxtarget ) && distancetonext == 0 boblsturm@0: idxtarget = RemainingTargetFrames(2); boblsturm@0: end boblsturm@0: boblsturm@0: % shrink corpus boblsturm@0: RemainingCorpusFrames = RemainingCorpusFrames(~idxcorpuskeep); boblsturm@0: boblsturm@0: % shrink target frames index boblsturm@0: RemainingTargetFrames = RemainingTargetFrames(~idxtarget); boblsturm@0: boblsturm@0: fprintf( '%d remaining frames...\n', size( RemainingTargetFrames ) ); boblsturm@0: end boblsturm@0: boblsturm@0: KeepCorpusFrames = sort( KeepCorpusFrames ); boblsturm@0: Y = corpus( :, KeepCorpusFrames ); boblsturm@0: PrunedFrames = setdiff( 1:corpusCols, KeepCorpusFrames ); boblsturm@0: boblsturm@0: fprintf( 'Pruned %d frames...\n', size( PrunedFrames ) ); boblsturm@0: boblsturm@0: end