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