diff src/matlab/CSS.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/CSS.m	Sun Jun 18 06:26:13 2017 -0400
@@ -0,0 +1,126 @@
+classdef CSS < handle
+    properties
+        NMF_features
+        Activations
+        Cost
+        Synthesis_method
+        Synthesis
+    end
+    
+    methods
+        function obj = CSS(varargin)
+            if nargin == 2
+                obj.NMF_features = varargin{1};
+                obj.Synthesis_method = varargin{2};
+            end
+        end
+    end
+    
+    methods
+        function obj = nmf(obj, corpus_sound, target_sound, varargin)
+            if( nargin == 4  )
+                pct_prune = varargin{1}
+            else
+                pct_prune = 1
+            end
+            nmf_alg = obj.NMF_features.Algorithm;
+            target_spect = abs(target_sound.Features.STFT.S);
+            corpus_spect = abs(corpus_sound.Features.STFT.S);
+            [corpus_spect, pruned_frames, frames_to_keep] = prune_corpus( target_spect, corpus_spect, pct_prune );
+            
+            switch nmf_alg
+                case 'Euclidean'
+                    if length(fieldnames(obj.NMF_features)) > 1
+                        [H, obj.Cost] = nmf_euclidean(target_spect, corpus_spect, obj.NMF_features);
+                    else
+                        [H, obj.Cost] = nmf_euclidean(target_spect, corpus_spect);
+                    end
+                case 'Divergence'
+                    if length(fieldnames(obj.NMF_features)) > 1
+                        [H, obj.Cost] = nmf_divergence(target_spect, corpus_spect, obj.NMF_features);
+                    else
+                        [H, obj.Cost] = nmf_divergence(target_spect, corpus_spect);
+                    end
+                case 'Sparse NMF'                 
+                    if length(fieldnames(obj.NMF_features)) > 1
+                        [~, H, deleted, obj.Cost] = SA_B_NMF(target_spect, corpus_spect, 5, obj.NMF_features);
+                    else
+                        [~, H, deleted, obj.Cost] = SA_B_NMF(target_spect, corpus_spect, 5 );
+                    end
+                    
+                    H( deleted, : ) = 0;
+                    obj.Activations = H;
+            end
+            
+            if size( frames_to_keep ) > 0
+                tmp = zeros( size( corpus_sound.Features.STFT.S,2 ), size( target_spect,2 ) );
+                for i = 1:length( frames_to_keep )
+                    tmp(frames_to_keep(i), :) = H(i,:);
+                end
+                H = tmp;
+            end
+%             H( pruned_frames, : ) = 0;
+%             % Pad activations to size of corpus frames
+%             % since pruned frames maximum can be < size of corpus
+%             H( setdiff( 1:( size( corpus_spect, 2 ) + length( pruned_frames ) ), 1:size( H, 1 ) ), : ) = 0;
+            obj.Activations = H;
+        end
+        
+        function obj = synthesize(obj, corpus_sound)
+            synth_method = obj.Synthesis_method;
+            win = corpus_sound.Features.window;
+            W = abs(corpus_sound.Features.STFT.S);
+            H = obj.Activations;
+            
+            switch synth_method
+                case 'ISTFT'
+                    parameters = [];
+                    parameters.synHop = win.Hop;
+                    parameters.win = window(lower(win.Type), win.Length);
+
+                    reconstruction = W*H;
+                    padding = size(reconstruction, 1)*2 - win.Length - 2;
+                    if padding >= 0
+                        parameters.zeroPad = padding;
+                    end
+
+                    obj.Synthesis = istft(reconstruction, parameters);
+                case 'Template Addition'
+                    obj.Synthesis = templateAdditionResynth(corpus_sound.Signal, H, win);
+            end
+        end
+        
+        function plot_activations(obj, varargin)
+            if(nargin > 1)
+                maxDb = varargin{1};
+            else
+                maxDb = -45;
+            end
+            
+            H = obj.Activations;
+            
+            HdB = 20*log10(H./max(max(H)));
+            HdB = HdB - maxDb;
+            HdB(HdB < 0) = 0;
+            imagesc(HdB);
+            cmap = colormap('gray');
+            cmap(1,:) = 0*ones(1,3);
+            colormap(flipud(cmap))
+            colorbar
+            axis xy; grid on;
+            set(gca, 'Layer', 'top');
+            ylabel('Template');
+            xlabel('Time');
+            grid on;
+            set(gca,'FontSize',16);
+        end
+        
+        function plot_cost(obj)
+            plot(obj.Cost);
+            xlabel('Iteration');
+            ylabel('Cost');
+            title('Cost vs. Iteration');
+            grid on
+        end
+    end
+end
\ No newline at end of file