danieleb@156: clear danieleb@156: danieleb@156: %% Parameteres danieleb@156: danieleb@156: % Dictionary learning parameters danieleb@156: toolbox = 'TwoStepDL'; %dictionary learning toolbox danieleb@156: dicUpdate = {'ksvd','mailhe'}; %dictionary updates danieleb@156: iterNum = 20; %number of iterations danieleb@156: danieleb@156: % Test signal parameters danieleb@156: signal = audio('music03_16kHz.wav'); %audio signal danieleb@156: blockSize = 256; %size of audio frames danieleb@156: dictSize = 512; %number of atoms in the dictionary danieleb@156: overlap = 0.5; %overlap between consecutive frames danieleb@156: sigma = 1e6; %snr of noise (set to be negligible so that the problem becomes approximation rather than denoising) danieleb@156: percActiveAtoms = 5; %percentage of active atoms danieleb@156: danieleb@156: % Dependent parameters danieleb@156: nActiveAtoms = fix(blockSize/100*percActiveAtoms); %number of active atoms danieleb@156: epsilon = 1/sigma; %error constraint for sparse representation step (corresponds to noise applied to signals) danieleb@156: minCoherence = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); %target coherence (based on coherence lower bound) danieleb@156: danieleb@156: % Initial dictionaries danieleb@156: dctDict = dictionary('dct',blockSize,dictSize); danieleb@156: dctDict = dctDict.phi; danieleb@156: gaborParam = struct('N',blockSize,'redundancyFactor',2,'wd',@rectwin); danieleb@156: gaborDict = Gabor_Dictionary(gaborParam); danieleb@156: danieleb@156: %% Generate audio denoising problem with low noise (audio representation) danieleb@156: SMALL.Problem = generateAudioDenoiseProblem(signal.s,[],blockSize,... danieleb@156: dictSize,overlap,sigma); % generate representation problem danieleb@156: SMALL.Problem.b1 = SMALL.Problem.b; % copy signals from training set b to test set b1 (needed for later functions) danieleb@156: danieleb@156: % omp2 sparse representation solver danieleb@156: ompParam = struct('X',SMALL.Problem.b,'epsilon',epsilon,'maxatoms',nActiveAtoms); %parameters danieleb@156: solver = SMALL_init_solver('ompbox','omp2',ompParam,false); %solver structure danieleb@156: danieleb@156: danieleb@156: %% Test ksvd dictionary update danieleb@156: name = dicUpdate{1}; %use ksvd update danieleb@156: SMALL.DL(1:9) = SMALL_init_DL(toolbox,name); %create dictionary learning structures danieleb@156: danieleb@156: % learn with random initialisation and no decorrelation danieleb@156: SMALL.DL(1).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none'); %parameters for the dictionary learning danieleb@156: SMALL.DL(1) = SMALL_learn(SMALL.Problem,SMALL.DL(1)); %learn dictionary danieleb@156: danieleb@156: % learn with random initialisation and mailhe decorrelation danieleb@156: SMALL.DL(2).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence); %parameters for the dictionary learning danieleb@156: SMALL.DL(2) = SMALL_learn(SMALL.Problem,SMALL.DL(2)); %learn dictionary danieleb@156: danieleb@156: % learn with random initialisation and tropp decorrelation danieleb@156: SMALL.DL(3).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence); %parameters for the dictionary learning danieleb@156: SMALL.DL(3) = SMALL_learn(SMALL.Problem,SMALL.DL(3)); %learn dictionary danieleb@156: danieleb@156: % Learn with dct initialisation and no decorrelation danieleb@156: SMALL.DL(4).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none','initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(4) = SMALL_learn(SMALL.Problem,SMALL.DL(4)); %learn dictionary danieleb@156: danieleb@156: % learn with dct initialisation and mailhe decorrelation danieleb@156: SMALL.DL(5).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(5) = SMALL_learn(SMALL.Problem,SMALL.DL(5)); %learn dictionary danieleb@156: danieleb@156: % learn with dct initialisation and tropp decorrelation danieleb@156: SMALL.DL(6).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(6) = SMALL_learn(SMALL.Problem,SMALL.DL(6)); %learn dictionary danieleb@156: danieleb@156: % Learn with gabor initialisation and no decorrelation danieleb@156: SMALL.DL(7).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none','initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(7) = SMALL_learn(SMALL.Problem,SMALL.DL(7)); %learn dictionary danieleb@156: danieleb@156: % learn with gabor initialisation and mailhe decorrelation danieleb@156: SMALL.DL(8).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(8) = SMALL_learn(SMALL.Problem,SMALL.DL(8)); %learn dictionary danieleb@156: danieleb@156: % learn with gabor initialisation and tropp decorrelation danieleb@156: SMALL.DL(9).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(9) = SMALL_learn(SMALL.Problem,SMALL.DL(9)); %learn dictionary danieleb@156: danieleb@156: %% Test mailhe dictionary update danieleb@156: name = dicUpdate{2}; %use mailhe update danieleb@156: SMALL.DL(10:18) = SMALL_init_DL(toolbox,name); %create dictionary learning structure danieleb@156: danieleb@156: % learn with random initialisation and no decorrelation danieleb@156: SMALL.DL(10).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none'); %parameters for the dictionary learning danieleb@156: SMALL.DL(10) = SMALL_learn(SMALL.Problem,SMALL.DL(10)); %learn dictionary danieleb@156: danieleb@156: % learn with random initialisation and mailhe decorrelation danieleb@156: SMALL.DL(11).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence); %parameters for the dictionary learning danieleb@156: SMALL.DL(11) = SMALL_learn(SMALL.Problem,SMALL.DL(11)); %learn dictionary danieleb@156: danieleb@156: % learn with random initialisation and tropp decorrelation danieleb@156: SMALL.DL(12).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence); %parameters for the dictionary learning danieleb@156: SMALL.DL(12) = SMALL_learn(SMALL.Problem,SMALL.DL(12)); %learn dictionary danieleb@156: danieleb@156: % Learn with dct initialisation and no decorrelation danieleb@156: SMALL.DL(13).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none','initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(13) = SMALL_learn(SMALL.Problem,SMALL.DL(13)); %learn dictionary danieleb@156: danieleb@156: % learn with dct initialisation and mailhe decorrelation danieleb@156: SMALL.DL(14).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(14) = SMALL_learn(SMALL.Problem,SMALL.DL(14)); %learn dictionary danieleb@156: danieleb@156: % learn with dct initialisation and tropp decorrelation danieleb@156: SMALL.DL(15).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence,'initdict',dctDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(15) = SMALL_learn(SMALL.Problem,SMALL.DL(15)); %learn dictionary danieleb@156: danieleb@156: % Learn with gabor initialisation and no decorrelation danieleb@156: SMALL.DL(16).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','none','initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(16) = SMALL_learn(SMALL.Problem,SMALL.DL(16)); %learn dictionary danieleb@156: danieleb@156: % learn with gabor initialisation and mailhe decorrelation danieleb@156: SMALL.DL(17).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','mailhe','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(17) = SMALL_learn(SMALL.Problem,SMALL.DL(17)); %learn dictionary danieleb@156: danieleb@156: % learn with gabor initialisation and tropp decorrelation danieleb@156: SMALL.DL(18).param = struct('data',SMALL.Problem.b,'Tdata',nActiveAtoms,... danieleb@156: 'dictsize',dictSize,'iternum',iterNum,'memusage','high','solver',solver,... danieleb@156: 'decFcn','tropp','coherence',minCoherence,'initdict',gaborDict); %parameters for the dictionary learning danieleb@156: SMALL.DL(18) = SMALL_learn(SMALL.Problem,SMALL.DL(18)); %learn dictionary danieleb@156: danieleb@156: %% Evaluate coherence and snr of representation for the various methods danieleb@156: sigNoiseRatio = zeros(18,1); danieleb@156: mu = zeros(18,1); danieleb@156: for i=1:18 danieleb@156: SMALL.Problem.A = SMALL.DL(i).D; danieleb@156: tempSolver = SMALL_solve(SMALL.Problem,solver); danieleb@156: sigNoiseRatio(i) = snr(SMALL.Problem.b,SMALL.DL(i).D*tempSolver.solution); danieleb@156: dic(i) = dictionary(SMALL.DL(i).D); danieleb@156: mu(i) = dic(i).coherence; danieleb@156: end danieleb@156: danieleb@156: %% Plot results danieleb@156: minMu = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); danieleb@156: maxSNR = max(sigNoiseRatio); danieleb@156: danieleb@156: figure, subplot(2,2,1) danieleb@156: snrMat = buffer(sigNoiseRatio(1:9),3); danieleb@156: bar(snrMat'); danieleb@156: title('SNR - KSVD Update') danieleb@156: xlabel('Initial dictionary') danieleb@156: ylabel('SNR (dB)') danieleb@156: set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]); danieleb@156: legend('none','Mailhe','Tropp') danieleb@156: grid on danieleb@156: danieleb@156: subplot(2,2,2), grid on danieleb@156: snrMat = buffer(sigNoiseRatio(10:18),3); danieleb@156: bar(snrMat'); danieleb@156: title('SNR - Mailhe Update') danieleb@156: xlabel('Initial dictionary') danieleb@156: ylabel('SNR (dB)') danieleb@156: set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]); danieleb@156: legend('none','Mailhe','Tropp') danieleb@156: grid on danieleb@156: danieleb@156: subplot(2,2,3), hold on, grid on danieleb@156: title('Coherence - KSVD Update') danieleb@156: muMat = buffer(mu(1:9),3); danieleb@156: line([0.5 3.5],[1 1],'Color','r'); danieleb@156: bar(muMat'); danieleb@156: line([0.5 3.5],[minMu minMu],'Color','k'); danieleb@156: set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05]) danieleb@156: legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}') danieleb@156: ylabel('\mu') danieleb@156: xlabel('Initial dictionary') danieleb@156: danieleb@156: subplot(2,2,4), hold on, grid on danieleb@156: title('Coherence - Mailhe Update') danieleb@156: muMat = buffer(mu(10:18),3); danieleb@156: line([0.5 3.5],[1 1],'Color','r'); danieleb@156: bar(muMat'); danieleb@156: line([0.5 3.5],[minMu minMu],'Color','k'); danieleb@156: set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05]) danieleb@156: legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}') danieleb@156: ylabel('\mu') danieleb@156: xlabel('Initial dictionary')