annotate examples/SMALL_test_coherence.m @ 167:8324c7ea6602 danieleb

Added symmetric de-correlation function, modified target de-correlation in test function.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Tue, 20 Sep 2011 14:27:14 +0100
parents a4d0977d4595
children 290cca7d3469
rev   line source
danieleb@156 1 clear
danieleb@156 2
danieleb@156 3 %% Parameteres
danieleb@156 4
danieleb@156 5 % Dictionary learning parameters
danieleb@156 6 toolbox = 'TwoStepDL'; %dictionary learning toolbox
danieleb@156 7 dicUpdate = {'ksvd','mailhe'}; %dictionary updates
danieleb@156 8 iterNum = 20; %number of iterations
danieleb@156 9
danieleb@156 10 % Test signal parameters
danieleb@156 11 signal = audio('music03_16kHz.wav'); %audio signal
danieleb@156 12 blockSize = 256; %size of audio frames
danieleb@156 13 dictSize = 512; %number of atoms in the dictionary
danieleb@156 14 overlap = 0.5; %overlap between consecutive frames
danieleb@156 15 sigma = 1e6; %snr of noise (set to be negligible so that the problem becomes approximation rather than denoising)
danieleb@156 16 percActiveAtoms = 5; %percentage of active atoms
danieleb@156 17
danieleb@156 18 % Dependent parameters
danieleb@156 19 nActiveAtoms = fix(blockSize/100*percActiveAtoms); %number of active atoms
danieleb@156 20 epsilon = 1/sigma; %error constraint for sparse representation step (corresponds to noise applied to signals)
daniele@167 21 %minCoherence = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); %target coherence (based on coherence lower bound)
daniele@167 22 minCoherence = 0.4; %target coherence
danieleb@156 23
danieleb@156 24 % Initial dictionaries
danieleb@156 25 dctDict = dictionary('dct',blockSize,dictSize);
danieleb@156 26 dctDict = dctDict.phi;
danieleb@156 27 gaborParam = struct('N',blockSize,'redundancyFactor',2,'wd',@rectwin);
danieleb@156 28 gaborDict = Gabor_Dictionary(gaborParam);
danieleb@156 29
danieleb@156 30 %% Generate audio denoising problem with low noise (audio representation)
danieleb@156 31 SMALL.Problem = generateAudioDenoiseProblem(signal.s,[],blockSize,...
danieleb@156 32 dictSize,overlap,sigma); % generate representation problem
danieleb@156 33 SMALL.Problem.b1 = SMALL.Problem.b; % copy signals from training set b to test set b1 (needed for later functions)
danieleb@156 34
danieleb@156 35 % omp2 sparse representation solver
danieleb@156 36 ompParam = struct('X',SMALL.Problem.b,'epsilon',epsilon,'maxatoms',nActiveAtoms); %parameters
danieleb@156 37 solver = SMALL_init_solver('ompbox','omp2',ompParam,false); %solver structure
danieleb@156 38
danieleb@156 39
danieleb@156 40 %% Test ksvd dictionary update
danieleb@156 41 name = dicUpdate{1}; %use ksvd update
danieleb@156 42 SMALL.DL(1:9) = SMALL_init_DL(toolbox,name); %create dictionary learning structures
danieleb@156 43
danieleb@156 44 % learn with random initialisation and no decorrelation
danieleb@156 45 SMALL.DL(1).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 46 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 47 'decFcn','none'); %parameters for the dictionary learning
danieleb@156 48 SMALL.DL(1) = SMALL_learn(SMALL.Problem,SMALL.DL(1)); %learn dictionary
danieleb@156 49
danieleb@156 50 % learn with random initialisation and mailhe decorrelation
danieleb@156 51 SMALL.DL(2).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 52 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 53 'decFcn','mailhe','coherence',minCoherence); %parameters for the dictionary learning
danieleb@156 54 SMALL.DL(2) = SMALL_learn(SMALL.Problem,SMALL.DL(2)); %learn dictionary
danieleb@156 55
danieleb@156 56 % learn with random initialisation and tropp decorrelation
danieleb@156 57 SMALL.DL(3).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 58 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 59 'decFcn','tropp','coherence',minCoherence); %parameters for the dictionary learning
danieleb@156 60 SMALL.DL(3) = SMALL_learn(SMALL.Problem,SMALL.DL(3)); %learn dictionary
danieleb@156 61
danieleb@156 62 % Learn with dct initialisation and no decorrelation
danieleb@156 63 SMALL.DL(4).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 64 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 65 'decFcn','none','initdict',dctDict); %parameters for the dictionary learning
danieleb@156 66 SMALL.DL(4) = SMALL_learn(SMALL.Problem,SMALL.DL(4)); %learn dictionary
danieleb@156 67
danieleb@156 68 % learn with dct initialisation and mailhe decorrelation
danieleb@156 69 SMALL.DL(5).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 70 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 71 'decFcn','mailhe','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning
danieleb@156 72 SMALL.DL(5) = SMALL_learn(SMALL.Problem,SMALL.DL(5)); %learn dictionary
danieleb@156 73
danieleb@156 74 % learn with dct initialisation and tropp decorrelation
danieleb@156 75 SMALL.DL(6).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 76 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 77 'decFcn','tropp','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning
danieleb@156 78 SMALL.DL(6) = SMALL_learn(SMALL.Problem,SMALL.DL(6)); %learn dictionary
danieleb@156 79
danieleb@156 80 % Learn with gabor initialisation and no decorrelation
danieleb@156 81 SMALL.DL(7).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 82 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 83 'decFcn','none','initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 84 SMALL.DL(7) = SMALL_learn(SMALL.Problem,SMALL.DL(7)); %learn dictionary
danieleb@156 85
danieleb@156 86 % learn with gabor initialisation and mailhe decorrelation
danieleb@156 87 SMALL.DL(8).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 88 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 89 'decFcn','mailhe','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 90 SMALL.DL(8) = SMALL_learn(SMALL.Problem,SMALL.DL(8)); %learn dictionary
danieleb@156 91
danieleb@156 92 % learn with gabor initialisation and tropp decorrelation
danieleb@156 93 SMALL.DL(9).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 94 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 95 'decFcn','tropp','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 96 SMALL.DL(9) = SMALL_learn(SMALL.Problem,SMALL.DL(9)); %learn dictionary
danieleb@156 97
danieleb@156 98 %% Test mailhe dictionary update
danieleb@156 99 name = dicUpdate{2}; %use mailhe update
danieleb@156 100 SMALL.DL(10:18) = SMALL_init_DL(toolbox,name); %create dictionary learning structure
danieleb@156 101
danieleb@156 102 % learn with random initialisation and no decorrelation
danieleb@156 103 SMALL.DL(10).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 104 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 105 'decFcn','none'); %parameters for the dictionary learning
danieleb@156 106 SMALL.DL(10) = SMALL_learn(SMALL.Problem,SMALL.DL(10)); %learn dictionary
danieleb@156 107
danieleb@156 108 % learn with random initialisation and mailhe decorrelation
danieleb@156 109 SMALL.DL(11).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 110 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 111 'decFcn','mailhe','coherence',minCoherence); %parameters for the dictionary learning
danieleb@156 112 SMALL.DL(11) = SMALL_learn(SMALL.Problem,SMALL.DL(11)); %learn dictionary
danieleb@156 113
danieleb@156 114 % learn with random initialisation and tropp decorrelation
danieleb@156 115 SMALL.DL(12).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 116 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 117 'decFcn','tropp','coherence',minCoherence); %parameters for the dictionary learning
danieleb@156 118 SMALL.DL(12) = SMALL_learn(SMALL.Problem,SMALL.DL(12)); %learn dictionary
danieleb@156 119
danieleb@156 120 % Learn with dct initialisation and no decorrelation
danieleb@156 121 SMALL.DL(13).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 122 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 123 'decFcn','none','initdict',dctDict); %parameters for the dictionary learning
danieleb@156 124 SMALL.DL(13) = SMALL_learn(SMALL.Problem,SMALL.DL(13)); %learn dictionary
danieleb@156 125
danieleb@156 126 % learn with dct initialisation and mailhe decorrelation
danieleb@156 127 SMALL.DL(14).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 128 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 129 'decFcn','mailhe','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning
danieleb@156 130 SMALL.DL(14) = SMALL_learn(SMALL.Problem,SMALL.DL(14)); %learn dictionary
danieleb@156 131
danieleb@156 132 % learn with dct initialisation and tropp decorrelation
danieleb@156 133 SMALL.DL(15).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 134 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 135 'decFcn','tropp','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning
danieleb@156 136 SMALL.DL(15) = SMALL_learn(SMALL.Problem,SMALL.DL(15)); %learn dictionary
danieleb@156 137
danieleb@156 138 % Learn with gabor initialisation and no decorrelation
danieleb@156 139 SMALL.DL(16).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 140 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 141 'decFcn','none','initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 142 SMALL.DL(16) = SMALL_learn(SMALL.Problem,SMALL.DL(16)); %learn dictionary
danieleb@156 143
danieleb@156 144 % learn with gabor initialisation and mailhe decorrelation
danieleb@156 145 SMALL.DL(17).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 146 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 147 'decFcn','mailhe','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 148 SMALL.DL(17) = SMALL_learn(SMALL.Problem,SMALL.DL(17)); %learn dictionary
danieleb@156 149
danieleb@156 150 % learn with gabor initialisation and tropp decorrelation
danieleb@156 151 SMALL.DL(18).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,...
danieleb@156 152 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,...
danieleb@156 153 'decFcn','tropp','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning
danieleb@156 154 SMALL.DL(18) = SMALL_learn(SMALL.Problem,SMALL.DL(18)); %learn dictionary
danieleb@156 155
danieleb@156 156 %% Evaluate coherence and snr of representation for the various methods
danieleb@156 157 sigNoiseRatio = zeros(18,1);
danieleb@156 158 mu = zeros(18,1);
danieleb@156 159 for i=1:18
danieleb@156 160 SMALL.Problem.A = SMALL.DL(i).D;
danieleb@156 161 tempSolver = SMALL_solve(SMALL.Problem,solver);
danieleb@156 162 sigNoiseRatio(i) = snr(SMALL.Problem.b,SMALL.DL(i).D*tempSolver.solution);
danieleb@156 163 dic(i) = dictionary(SMALL.DL(i).D);
danieleb@156 164 mu(i) = dic(i).coherence;
danieleb@156 165 end
danieleb@156 166
danieleb@156 167 %% Plot results
danieleb@156 168 minMu = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1)));
danieleb@156 169 maxSNR = max(sigNoiseRatio);
danieleb@156 170
daniele@167 171 figure, subplot(1,2,1)
danieleb@156 172 snrMat = buffer(sigNoiseRatio(1:9),3);
danieleb@156 173 bar(snrMat');
daniele@167 174 title('Signal to noise ratio')
danieleb@156 175 xlabel('Initial dictionary')
danieleb@156 176 ylabel('SNR (dB)')
daniele@167 177 set(gca,'XTickLabel',{'data','dct','gabor'});
danieleb@156 178 legend('none','Mailhe','Tropp')
danieleb@156 179 grid on
danieleb@156 180
daniele@167 181 % subplot(2,2,2), grid on
daniele@167 182 % snrMat = buffer(sigNoiseRatio(10:18),3);
daniele@167 183 % bar(snrMat');
daniele@167 184 % title('SNR - Mailhe Update')
daniele@167 185 % xlabel('Initial dictionary')
daniele@167 186 % ylabel('SNR (dB)')
daniele@167 187 % set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]);
daniele@167 188 % legend('none','Mailhe','Tropp')
daniele@167 189 % grid on
danieleb@156 190
daniele@167 191 subplot(1,2,2), hold on, grid on
daniele@167 192 title('Coherence')
danieleb@156 193 muMat = buffer(mu(1:9),3);
danieleb@156 194 line([0.5 3.5],[1 1],'Color','r');
danieleb@156 195 bar(muMat');
danieleb@156 196 line([0.5 3.5],[minMu minMu],'Color','k');
danieleb@156 197 set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05])
danieleb@156 198 legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}')
danieleb@156 199 ylabel('\mu')
danieleb@156 200 xlabel('Initial dictionary')
danieleb@156 201
daniele@167 202 % subplot(2,2,4), hold on, grid on
daniele@167 203 % title('Coherence - Mailhe Update')
daniele@167 204 % muMat = buffer(mu(10:18),3);
daniele@167 205 % line([0.5 3.5],[1 1],'Color','r');
daniele@167 206 % bar(muMat');
daniele@167 207 % line([0.5 3.5],[minMu minMu],'Color','k');
daniele@167 208 % set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05])
daniele@167 209 % legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}')
daniele@167 210 % ylabel('\mu')
daniele@167 211 % xlabel('Initial dictionary')