Mercurial > hg > nimfks
diff src/matlab/prune_corpus.m @ 0:c52bc3e8d3ad tip
user: boblsturm
branch 'default'
added README.md
added assets/.DS_Store
added assets/playButton.jpg
added assets/stopButton.png
added assets/swapButton.jpg
added data/.DS_Store
added data/fiveoctaves.mp3
added data/glock2.wav
added data/sinScale.mp3
added data/speech_female.mp3
added data/sweep.wav
added nimfks.m.lnk
added src/.DS_Store
added src/matlab/.DS_Store
added src/matlab/AnalysisCache.m
added src/matlab/CSS.m
added src/matlab/DataHash.m
added src/matlab/ExistsInCache.m
added src/matlab/KLDivCost.m
added src/matlab/LoadFromCache.m
added src/matlab/SA_B_NMF.m
added src/matlab/SaveInCache.m
added src/matlab/Sound.m
added src/matlab/SynthesisCache.m
added src/matlab/chromagram_E.m
added src/matlab/chromagram_IF.m
added src/matlab/chromagram_P.m
added src/matlab/chromsynth.m
added src/matlab/computeSTFTFeat.m
added src/matlab/controller.m
added src/matlab/decibelSliderReleaseCallback.m
added src/matlab/drawClickCallBack.m
added src/matlab/fft2chromamx.m
added src/matlab/hz2octs.m
added src/matlab/ifgram.m
added src/matlab/ifptrack.m
added src/matlab/istft.m
added src/matlab/nimfks.fig
added src/matlab/nimfks.m
added src/matlab/nmfFn.m
added src/matlab/nmf_beta.m
added src/matlab/nmf_divergence.m
added src/matlab/nmf_euclidean.m
added src/matlab/prune_corpus.m
added src/matlab/rot_kernel.m
added src/matlab/templateAdditionResynth.m
added src/matlab/templateDelCb.m
added src/matlab/templateScrollCb.m
author | boblsturm |
---|---|
date | Sun, 18 Jun 2017 06:26:13 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/matlab/prune_corpus.m Sun Jun 18 06:26:13 2017 -0400 @@ -0,0 +1,66 @@ +function [ Y, PrunedFrames, KeepCorpusFrames ] = prune_corpus( target, corpus, reduction_coef ) + + if reduction_coef == 1 + Y = corpus; + PrunedFrames = []; + KeepCorpusFrames = []; + return; + end + [targetRows, targetCols]= size( target ); + [corpusRows, corpusCols]= size( corpus ); + + % Matrix: distances of every target frame to every other target frame + % i.e. Self-similarity matrix + TargetSelfSimMat = zeros(targetCols); + + % Matrix: distances of every target frame to every corpus frame + % Matrix( i, j ) = Similarity of corpus frame i to target frame j +% TargetToCorpSimMat = -1*ones(WCols, targetCols); + + % Calculate self-similarity of target (euclidean dist) + X2 = sum(target.^2,1); + TargetSelfSimMat = bsxfun(@plus,X2,X2')-2*(target'*target); +% TargetSelfSimMat = exp(-(1/10) * DistanceMat); + + % Calculate the distance between each corpus frame to first target + % frame + KeepCorpusFrames = []; + RemainingTargetFrames = 1:targetCols; + RemainingCorpusFrames = 1:corpusCols; + + while ~isempty(RemainingTargetFrames) + Dist = repmat(target(:,RemainingTargetFrames(1)),1, ... + length(RemainingCorpusFrames)) - corpus(:,RemainingCorpusFrames); + Distances = sum(Dist.^2,1); + % compute mean distances + meanDistance = mean(Distances); + + % find those corpus frames closer than reduction_coef of mean + idxcorpuskeep = Distances < reduction_coef*meanDistance; + KeepCorpusFrames = [KeepCorpusFrames RemainingCorpusFrames(idxcorpuskeep)]; + + % find those target frames within twice that to next frame + distancetonext = TargetSelfSimMat(RemainingTargetFrames(1)+1,RemainingTargetFrames(1)); + idxtarget = TargetSelfSimMat(RemainingTargetFrames,RemainingTargetFrames(1)) ... + < 2*distancetonext; + + if ~any( idxtarget ) && distancetonext == 0 + idxtarget = RemainingTargetFrames(2); + end + + % shrink corpus + RemainingCorpusFrames = RemainingCorpusFrames(~idxcorpuskeep); + + % shrink target frames index + RemainingTargetFrames = RemainingTargetFrames(~idxtarget); + + fprintf( '%d remaining frames...\n', size( RemainingTargetFrames ) ); + end + +KeepCorpusFrames = sort( KeepCorpusFrames ); +Y = corpus( :, KeepCorpusFrames ); +PrunedFrames = setdiff( 1:corpusCols, KeepCorpusFrames ); + +fprintf( 'Pruned %d frames...\n', size( PrunedFrames ) ); + +end \ No newline at end of file