function [signalFiltered]=SSA(signal,windowLen)
%======================================================================
==
% ²Î¿´http://www.ilovematlab.cn/thread-301868-1-
1.htmlÁøÐõÑ޵ķÖÏí´úÂëssa¸Äд
% signal Ô-ʼÐźÅ
% windowLen ´°¿Ú³¤¶È
% signalFiltered Öع¹Ê±¼äÐòÁÐ
%======================================================================
===
clear all;
clc;
%%
% Step1 : ½¨Á¢¹ì¼£¾ØÕó
signal=1:1024;
windowLen=512;
N=length(signal);
if windowLen>N/2;
windowLen=N-windowLen;
end
K=N-windowLen+1;
X=zeros(windowLen,K);
for i=1:K
X(1:windowLen,i)=signal(i:windowLen+i-1);
end
%%
% Step 2: ÆæÒìÖµ·Ö½â
S=X*X';
[U,autoval]=eig(S);%eig·µ»Ø¾ØÕóµÄÌØÕ÷ÖµºÍÌØÕ÷ÏòÁ¿£¬UÊÇÌØÕ÷ÏòÁ¿£¬autoval
ÊÇÌØÕ÷Öµ
[d,i]=sort(diag(autoval),'descend');
sev=sum(d); %ÌØÕ÷ÖµµÄºÍ,¿É¸ù¾ÝÕ¼±ÈÑ¡ÔñÓÐЧÐźÅ
U=U(:,i);
V=(X')*U;
%%
% Step 3:·Ö×é
I=[1:windowLen/2];%IµÄÑ¡Ôñ¿É¸ù¾ÝÐźÅÌØÕ÷Ñ¡Ôñ
Vt=V';
rca=U(:,I)*Vt(I,:);
%%
% Step 4: ¶Ô½»Æ½¾ù»¯Öع¹ÐźÅ
y=zeros(N,1);
Lp=min(windowLen,K);
Kp=max(windowLen,K);
%Öع¹ 1~Lp-1
for k=0:Lp-2
for m=1:k+1;
y(k+1)=y(k+1)+(1/(k+1))*rca(m,k-m+2);
end
end
%Öع¹ Lp~Kp
for k=Lp-1:Kp-1
for m=1:Lp;
y(k+1)=y(k+1)+(1/(Lp))*rca(m,k-m+2);
end
end
%Öع¹ Kp+1~N
评论1