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')
|