Mercurial > hg > smallbox
changeset 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 | 1495bdfa13e9 |
children | ff866a412be5 |
files | DL/two-step DL/SMALL_two_step_DL.m DL/two-step DL/dico_decorr_symetric.m examples/SMALL_test_coherence.m |
diffstat | 3 files changed, 89 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/DL/two-step DL/SMALL_two_step_DL.m Mon Sep 19 14:53:23 2011 +0100 +++ b/DL/two-step DL/SMALL_two_step_DL.m Tue Sep 20 14:27:14 2011 +0100 @@ -116,7 +116,7 @@ dico = normcols(dico); switch DL.param.decFcn case 'mailhe' - dico = dico_decorr(dico, mu, solver.solution); + dico = dico_decorr_symetric(dico, mu, solver.solution); case 'tropp' [n m] = size(dico); dico = grassmannian(n,m,[],[],[],dico,true);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DL/two-step DL/dico_decorr_symetric.m Tue Sep 20 14:27:14 2011 +0100 @@ -0,0 +1,62 @@ +function dico = dico_decorr_symetric(dico, mu, amp) + %DICO_DECORR decorrelate a dictionary + % Parameters: + % dico: the dictionary + % mu: the coherence threshold + % amp: the amplitude coefficients, only used to decide which atom to + % project + % + % Result: + % dico: a dictionary close to the input one with coherence mu. + + eps = 1e-6; % define tolerance for normalisation term alpha + + % convert mu to the to the mean direction + theta = acos(mu)/2; + ctheta = cos(theta); + stheta = sin(theta); + + % compute atom weights + % if nargin > 2 + % rank = sum(amp.*amp, 2); + % else + % rank = randperm(length(dico)); + % end + + % several decorrelation iterations might be needed to reach global + % coherence mu. niter can be adjusted to needs. + niter = 1; + while niter < 5 && ... + max(max(abs(dico'*dico -eye(length(dico))))) > mu + eps + % find pairs of high correlation atoms + colors = dico_color(dico, mu); + + % iterate on all pairs + nbColors = max(colors); + for c = 1:nbColors + index = find(colors==c); + if numel(index) == 2 + if dico(:,index(1))'*dico(:,index(2)) > 0 + %build the basis vectors + v1 = dico(:,index(1))+dico(:,index(2)); + v1 = v1/norm(v1); + v2 = dico(:,index(1))-dico(:,index(2)); + v2 = v2/norm(v2); + + dico(:,index(1)) = ctheta*v1+stheta*v2; + dico(:,index(2)) = ctheta*v1-stheta*v2; + else + v1 = dico(:,index(1))-dico(:,index(2)); + v1 = v1/norm(v1); + v2 = dico(:,index(1))+dico(:,index(2)); + v2 = v2/norm(v2); + + dico(:,index(1)) = ctheta*v1+stheta*v2; + dico(:,index(2)) = -ctheta*v1+stheta*v2; + end + end + end + niter = niter+1; + end +end +
--- a/examples/SMALL_test_coherence.m Mon Sep 19 14:53:23 2011 +0100 +++ b/examples/SMALL_test_coherence.m Tue Sep 20 14:27:14 2011 +0100 @@ -18,7 +18,8 @@ % Dependent parameters nActiveAtoms = fix(blockSize/100*percActiveAtoms); %number of active atoms epsilon = 1/sigma; %error constraint for sparse representation step (corresponds to noise applied to signals) -minCoherence = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); %target coherence (based on coherence lower bound) +%minCoherence = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); %target coherence (based on coherence lower bound) +minCoherence = 0.4; %target coherence % Initial dictionaries dctDict = dictionary('dct',blockSize,dictSize); @@ -167,28 +168,28 @@ minMu = sqrt((dictSize-blockSize)/(blockSize*(dictSize-1))); maxSNR = max(sigNoiseRatio); -figure, subplot(2,2,1) +figure, subplot(1,2,1) snrMat = buffer(sigNoiseRatio(1:9),3); bar(snrMat'); -title('SNR - KSVD Update') +title('Signal to noise ratio') xlabel('Initial dictionary') ylabel('SNR (dB)') -set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]); +set(gca,'XTickLabel',{'data','dct','gabor'}); legend('none','Mailhe','Tropp') grid on -subplot(2,2,2), grid on -snrMat = buffer(sigNoiseRatio(10:18),3); -bar(snrMat'); -title('SNR - Mailhe Update') -xlabel('Initial dictionary') -ylabel('SNR (dB)') -set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]); -legend('none','Mailhe','Tropp') -grid on +% subplot(2,2,2), grid on +% snrMat = buffer(sigNoiseRatio(10:18),3); +% bar(snrMat'); +% title('SNR - Mailhe Update') +% xlabel('Initial dictionary') +% ylabel('SNR (dB)') +% set(gca,'XTickLabel',{'data','dct','gabor'},'YLim',[0 maxSNR+1]); +% legend('none','Mailhe','Tropp') +% grid on -subplot(2,2,3), hold on, grid on -title('Coherence - KSVD Update') +subplot(1,2,2), hold on, grid on +title('Coherence') muMat = buffer(mu(1:9),3); line([0.5 3.5],[1 1],'Color','r'); bar(muMat'); @@ -198,13 +199,13 @@ ylabel('\mu') xlabel('Initial dictionary') -subplot(2,2,4), hold on, grid on -title('Coherence - Mailhe Update') -muMat = buffer(mu(10:18),3); -line([0.5 3.5],[1 1],'Color','r'); -bar(muMat'); -line([0.5 3.5],[minMu minMu],'Color','k'); -set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05]) -legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}') -ylabel('\mu') -xlabel('Initial dictionary') +% subplot(2,2,4), hold on, grid on +% title('Coherence - Mailhe Update') +% muMat = buffer(mu(10:18),3); +% line([0.5 3.5],[1 1],'Color','r'); +% bar(muMat'); +% line([0.5 3.5],[minMu minMu],'Color','k'); +% set(gca,'XTick',1:3,'XTickLabel',{'data','dct','gabor'},'YLim',[0 1.05]) +% legend('\mu_{max}','none','Mailhe','Tropp','\mu_{min}') +% ylabel('\mu') +% xlabel('Initial dictionary')