📄 mfbox_denoise.m
字号:
function [sig]=mfbox_denoise(noisesig,m,k,delayspeed,clustermethod,reducemethod,undelaymethod,sortmethod,choosemethod,gamma,repeat)%denoise_locca - denoise with local component analysis%% Copyright by Peter Gruber and Fabian J. Theis% Signal Processing & Information Theory group% Institute of Biophysics, University of Regensburg, Germany% Homepage: http://research.fabian.theis.name% http://www-aglang.uni-regensburg.de%% This file is free software, subject to the% GNU GENERAL PUBLIC LICENSE, see gpl.txt% ------------------------------------------------------------------------------------------------% REFERENCES:%% P. Gruber, K. Stadlthanner, A.M. Tomé, A.R. Teixeira, F.J. Theis, C.G.% Puntonet, and E.W. Lang. Denoising using local ICA and a generalized% eigendecomposition with time-delayed signals. In Proc. ICA 2004, volume 3195% of Lecture Notes in Computer Science, pages 992-1000, Granada, Spain, 2004.%% P. Gruber, F.J. Theis, K. Stadlthanner, E.W. Lang, A.M. Tomé, and A.R.% Teixeira. Denoising using local ICA and kernel-PCA. In Proc. IJCNN 2004, pages% 2071-2076, Budapest, Hungary, 2004.%% P. Gruber, F.J. Theis, A.M. Tomé, and E.W. Lang. Automatic denoising using% local independent component analysis. In Proc. EIS 2004, Madeira, Portugal,% 2004.%if (nargin<4), delayspeed = 1; endif (nargin<5), clustermethod = 'kmeans'; endif (nargin<6), reducemethod = 'pca'; endif (nargin<7), undelaymethod = 'avg'; endif (nargin<8), sortmethod = 'var'; endif (nargin<9), choosemethod = 'mdl'; endif (nargin<10), gamma = 1; endif (nargin<11), repeat = 1; endif (iscell(noisesig)) grid = noisesig{2}; scale = ones(size(grid,1),1); for i=1:size(grid,1) v = unique(grid(i,:)); scale(i) = 1/min(v(2:end)-v(1:(end-1))); end grid = diag(scale)*grid; noisesig = noisesig{1}; mi = min(floor(grid),[],2)-1; ma = max(ceil(grid),[],2)+1; grid = 1+grid-repmat(mi,1,size(grid,2)); gr = mat2cell(round(grid),ones(1,size(grid,1)),size(grid,2)); gr = sub2ind(ma'-mi'+1,gr{:}); newnoisesig = reshape(mfbox_transgrid(grid,noisesig(:), ... mfbox_mkgrid(ma'-mi'+1)'),ma'-mi'+1); newnoisesig = mfbox_denoise(newnoisesig,m,k,delayspeed,clustermethod, ... reducemethod,undelaymethod,sortmethod,choosemethod,gamma,repeat); sig = newnoisesig(gr); returnendsigsize = size(noisesig);orgsigsize = sigsize;savedsig = delay(noisesig,m,delayspeed);savedmv = mean(savedsig,2);for i=1:size(savedsig,1), savedsig(i,:) = savedsig(i,:)-savedmv(i); endfor rcount=1:floor(repeat) if (rcount>1) rmix = repeat-floor(repeat); delayedsig = delay((1-rmix)*noisesig+(rmix)*newsig,m,delayspeed); mv = mean(delayedsig,2); for i=1:size(delayedsig,1), delayedsig(i,:) = delayedsig(i,:)-mv(i); end else delayedsig = savedsig; mv = savedmv; end [delayedsig,comp] = denoise_delayedcoordinates(delayedsig,k, ... clustermethod,reducemethod,choosemethod,sortmethod,gamma); newsig = undelay(delayedsig+mv*ones(1,size(delayedsig,2)),sigsize, ... m,delayspeed,undelaymethod);endsig = newsig;returnfunction p=choosenumberofcomponents(signal,D,choosemethod,gamma)[m,samples] = size(signal);V = sum(triu(D'));p = 1;if (m==1), return; endswitch choosemethod case 'mdl' p = mfbox_mdl(D,samples,gamma); case 'err' p = m; while (sum(V(1,p:m))<gamma*sum(V(1,:))) & (p>0) p = p-1; end; case 'abs' p = min(ceil(abs(gamma)),m); case 'num' p = min(max(abs(gamma),0),m); case 'cluster' if (gamma>0), [ce,cl] = kmeans_cluster(V(1,:),2); p = sum(cl==cl(1)); else [ce,cl] = cluster(V,2); p = sum(cl==cl(1)); endendreturnfunction delaysig=delay(sig,lag,step)d = size(sig);if ((length(d)==2) && ((d(1)==1)||(d(2)==1))) delaysig = []; for i=-lag:lag delaysig = [delaysig;circshift(sig',-round(i*step))']; end returnendml = ceil(lag)+2;linoffs = mfbox_mkgrid(1+(ones(1,length(d))*2*ml))'-ml;linoffs = linoffs(:,sum(linoffs.^2)<=(lag^2));lo = size(linoffs,2);%linoffs = ceil(step*linoffs);linoffs = ceil(step*(linoffs.*repmat(sum(linoffs.^2)/lag^2,length(d),1)));if (lo==0) delaysig = []; returnendnd = prod(d);delaysig = zeros(nd,lo);t = circshift(sig,-linoffs(:,1));delaysig(:,1) = t(:);for j=2:lo t = circshift(t,linoffs(:,[j-1:j])*[1;-1]); delaysig(:,j) = t(:);enddelaysig = delaysig';returnfunction sig=delocalize(localsig,permutation)[dummy,p] = sort(permutation);sig = localsig(:,p);returnfunction [sig,rk,components]=denoise_delayedcoordinates(noisesig,k,clustermethod,reducemethod,choosemethod,sortmethod,gamma)[m,samples] = size(noisesig);meanvalues = mean(noisesig,2);for i=1:size(noisesig,1), noisesig(i,:) = noisesig(i,:)-meanvalues(i); end[localsig,parts,permut] = localize(noisesig,k,m,clustermethod);ncomp = size(parts,1);rk = zeros(1,ncomp);for i=1:ncomp lsig = localsig(:,parts(i,1):parts(i,2)); lmean = mean(lsig,2); for j=1:size(lsig,1), lsig(j,:) = lsig(j,:)-lmean(j); end [V,W,D] = sortcomponents(lsig,reducemethod,sortmethod); p = choosenumberofcomponents(V*lsig,D,choosemethod,gamma); r = size(V,1); R = eye(r); R(:,p+1:r) = 0; rk(i) = p; lsig = W*R*V*lsig; localsig(:,parts(i,1):parts(i,2)) = lsig+lmean*ones(1,size(lsig,2));endsig = delocalize(localsig,permut)+meanvalues*ones(1,samples);returnfunction [localdata,parts,permutation]=localize(sig,k,m,method)[dim,samples] = size(sig);if (k==1), localdata = sig; parts = [1,samples]; permutation = 1:samples; return; endif (m>samples), m = samples; endswitch method case 'kmeans' [cent,cl] = cluster_kmeans(sig,k); case 'fast' numkmeans = max(max(500,ceil(samples/500)),n); rsig = sig(:,randperm(numkmeans)); [cent,cl] = cluster_kmeans(rsig,n); [err,cl] = min(repmat(sum(cent.^2,1)',1,samples)-2*cent'*sig); case 'seq' [cent,cl] = cluster(sig,k);endp = zeros(size(cent,2),1);for i=1:size(cent,2) p(i) = sum(cl==i); endwhile ((min(p)<m) || (sum(isfinite(p))>k)) [i,im] = min(p); q = zeros(size(cent,2),1); for i=1:size(cent,2) if (isfinite(p(i))), q(i) = dist(cent(:,im),cent(:,i),2); else q(i) = +Inf; end end [i,j] = sort(q); cl = cl+(cl==j(1))*(j(2)-j(1)); p(j(2)) = p(j(2))+p(j(1)); p(j(1)) = +Inf;endk = sum(isfinite(p));pt = zeros(k,3);[i,j] = sort(p);pt(:,3) = cumsum(i(1:k));pt(:,1) = j(1:k);pt(1,2) = 1; pt(2:k,2) = pt(1:k-1,3)+1;i = zeros(samples,1);for j=1:k, i = i+(cl==pt(j,1))*(j-pt(j,1)); endcl = cl+i; clear ilocaldata = zeros(dim,samples);permutation = zeros(samples,1);nn = 1:samples;for i=1:k localdata(:,pt(i,2):pt(i,3)) = sig(:,cl==i); permutation(pt(i,2):pt(i,3)) = nn(cl==i);endparts = pt(:,2:3);returnfunction [V,W,D]=sortcomponents(signal,reducemethod,ratingmethod)[m,samples] = size(signal);switch reducemethod case 'pca' [W,D] = eig(cov(signal')); V = W'; ksignal = V*signal; case 'mpencil' [W,D] = eig(cov(signal')); E = D; E(E>0) = 1./sqrt(E(E>0)); V = W*E*W'; c = max(10,ceil(samples/1000)); c = exp(-[-c:1:c].^2)/sqrt(2*pi); [P,Q] = eig(cov(matconv(V*signal,c)')); E = D; E(E>0) = sqrt(E(E>0)); W = W*E*W'*P; W = W./(ones(m,1)*sqrt(sum(W.^2))); W = ort(W); V = W^-1; ksignal = V*signal; case 'pearsonica' [ksignal,W,V] = mfbox_fasticapearson(signal',0.0001,200,[2.6,4],[0,1], ... size(signal,1),1,size(signal,1),'off'); W = W./(ones(m,1)*sqrt(sum(W.^2))); W = ort(W); V = W^-1; ksignal = V*signal; case 'mdlica' [E,D] = eig(cov(signal')); D = sum(D,1); D = D(m:-1:1); E = E(:,m:-1:1); p = mfbox_mdl(D,samples,1); ksignal = E'*signal; if (p==1) ksignal = ksignal(1,:); V = 1; W = 1; else [ksignal,W,V] = mfbox_fasticapearson(ksignal(1:p,:)',0.0001, ... 200,[2.6,4],[0,1],p,1,p,'off'); end V = [V,zeros(p,m-p)]*E'; W = E*[W;zeros(p,m-p)]; W = W./(ones(m,1)*sqrt(sum(W.^2))); V = W^-1; ksignal = V*signal;endk = size(ksignal,1);R = eye(k);R = R(k:-1:1,:);switch ratingmethod case 'kurt' [dummy,kp] = sort(kurtosis(ksignal').^2); [dummy2,kp] = sort(kp); case 'maxkurt' [dummy,kp] = sort(-kurtosis(ksignal')); [dummy2,kp] = sort(kp); case 'minkurt' [dummy,kp] = sort(kurtosis(ksignal')); [dummy2,kp] = sort(kp); case 'comb' [dummy,kp] = sort((var(ksignal').*kurtosis(ksignal')).^2); [dummy2,kp] = sort(kp); case 'auto' [dummy,kp] = sort(var(autocor(ksignal'))); [dummy2,kp] = sort(kp); otherwise [dummy,kp] = sort(var(ksignal')); [dummy2,kp] = sort(kp);endR = R(:,kp);V = R*V;W = W*R';switch reducemethod case 'pca' D = ones(m,1)*var((R*ksignal)'); otherwise T = W; C = cov((R*ksignal)'); D(1,:) = diag(C)'; for i=1:m S = ort(V(i+1:m,:)); S = ort(S(m-i+1:m,:)); d = S*T*C*T'*S'; D(i,1:i) = eig(d(1:i,1:i))'; D(i,i+1:m) = eig(d(i+1:m,i+1:m))'; endendreturnfunction N=matconv(M,C)[d,m] = size(M);c = length(C);N = zeros(d,m+c-1);for i=1:size(M,1) N(i,:) = conv(M(i,:),C(:));endreturnfunction sig=undelay(delaysig,d,lag,step,recon)if (length(d)==2) if ((d(1)==1)||(d(2)==1)) q = lag^2+1-(-lag:lag).^2; q = (2*lag+1)*q/sum(q); for i=-lag:lag j = i+lag+1; b = round(i*step); switch recon case 'avg' delaysig(j,:) = circshift(delaysig(j,:)',b)'; case 'quad' delaysig(j,:) = q(j)*circshift(delaysig(j,:)',b)'; end end sig = sum(delaysig,1)/size(delaysig,1); return endendpot = 0;switch recon case 'avg' pot = 0; case 'quad' pot = 2; otherwise pot = 0;endml = ceil(lag)+2;linoffs = mfbox_mkgrid(1+(ones(1,length(d))*2*ml))'-ml;weights = sum(linoffs.^2);linoffs = linoffs(:,weights<=(lag^2));weights = sqrt(weights(weights<=(lag^2))).^pot;lo = size(linoffs,2);%linoffs = ceil(step*linoffs);linoffs = ceil(step*(linoffs.*repmat(sum(linoffs.^2)/lag^2,length(d),1)));if (lo==0) delaysig = []; returnendnd = prod(d);ld = length(d);weights = 1+weights-min(weights);weights = weights/sum(weights);sig = zeros(d);delaysig = delaysig';for k=1:lo t = reshape(delaysig(:,k),d); t = circshift(t,linoffs(:,k)); sig = sig+(weights(k)*t);endreturnfunction [centroids,clusters,err]=cluster(D,n)epochs = 100;[dim,samples] = size(D);if (n==1) centroids = sum(D,2)/samples; clusters = ones(samples,1); err = sum(sqrt(sum((D-centroids*ones(1,samples)).^2,1)))/samples; returnendpartition = zeros(1,n+1); centers = zeros(1,n);for i=2:n, partition(i) = floor(samples/n)*(i-1); endpartition(n+1) = samples;for t=1:epochs oldpart = partition; for i=1:n, centers(i) = partition(i)+ceil((partition(i+1)-partition(i))/2); end for i=1:n-1 num = centers(i+1)-centers(i)+1; if (num==2), partition(i+1) = centers(i); else dists = zeros(1,num); for j=1:num-1 dists(j+1) = dists(j)+ ... sqrt(sum((D(:,centers(i)+j-1)-D(:,centers(i)+j)).^2)); end partition(i+1) = centers(i)+sum(dists<(dists(num)/2)); end end if all(partition==oldpart) break; endendcentroids = zeros(dim,n); clusters = zeros(samples,1); err = 0;for i=2:n+1 s = partition(i-1)+1; e = partition(i); n = e-s+1; centroids(:,i-1) = sum(D(:,s:e),2)/n; clusters(s:e) = ones(1,n)*(i-1); err = err+sum(sqrt(sum((D(:,s:e)-centroids(:,i-1)*ones(1,n)).^2,1)));enderr = err/samples;returnfunction [centroids,clusters]=cluster_kmeans(data,n)[dim dlen] = size(data);n = min(dlen,n);temp = randperm(dlen);centroids = data(:,temp(1:n));clusters = zeros(1,dlen);iter = 0;old_clusters = zeros(1,dlen);while (iter<100) [dummy clusters] = min(repmat(sum((centroids.^2),1)',1,dlen)-2*centroids'*data); for i=1:n, f = find(clusters==i); s = length(f); if (s), centroids(:,i) = sum(data(:,f),2)/s; end end if ((iter>0)&&all(old_clusters==clusters)) break; end old_clusters = clusters; iter = iter+1;end[qerrs clusters] = min(repmat(sum((centroids.^2),1)',1,dlen)-2*centroids'*data);clusters = clusters(:);returnfunction A=ort(A)[rows,columns] = size(A);if (rows>columns) A = ort(A')'; returnendfor i=1:rows A(i,:) = A(i,:)/norm(A(i,:));endwhile (rows<columns) m = zeros(rows+1); m(1:rows,1:rows+1) = A(1:rows,1:rows+1); n = zeros(1,columns); for i=1:rows+1 m(rows+1,i) = 1; n(1,i) = det(m); m(rows+1,i) = 0; end if (norm(n)>0), n = n/norm(n); end A = [A;n]; rows = rows+1;endreturnfunction err=dist(A,B,pot)A = reshape(A,1,prod(size(A)));B = reshape(B,1,prod(size(B)));err = sum(sum(sqrt((A-B).*conj(A-B)).^pot).^(1/pot))/size(A,2);returnfunction retval=kurtosis(x)[nr,nc] = size(x);x = x-ones(nr,1)*mean(x);retval = zeros(1,nc);s = std(x);ind = find(s>0);retval(ind) = sum(x(:,ind).^4)./(nr*s(ind).^4)-3;return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -