📄 sobi.m
字号:
function W=sobi(x,n,p)
%二阶盲辨识
%W=sobi(x,n,p)估计分离矩阵
%一般调用方法W=sobi(x);
%x混合信号
%m传感器个数
%N采样点数
%n源信号个数
%p协方差矩阵个数
[m,N]=size(x);
if nargin==1
n=m;
p=100;
end
if nargin==2
p=100;
end
xz=x-mean(x')'*ones(1,N);
Rxx=(xz(:,1:N-1)*xz(:,2:N)')/(N-1);
[Ux,Dx,Vx]=svd(Rxx);
Dx=diag(Dx);
if n<m
Dx=Dx-real((mean(Dx(n+1:m))));
Q=diag(real(sqrt(1./D(1:n))))*Ux(:,1:n)';
else
n=max(find(Dx>1e-14));;
Q=diag(real(sqrt(1./Dx(1:n))))*Ux(:,1:n)';
end
Xb=Q*xz;%prewhitened data
%Estimation of the time delayed covariance matrices
k=1;
pn=p*n;
for u=1:n:pn
k=k+1;
Rxp=Xb(:,k:N)*Xb(:,1:N-k+1)'/(N-k+1);
M(:,u:u+n-1)=norm(Rxp,'fro')*Rxp;
end
%approximate joint daigonalization
eps=1/sqrt(N)/100;
encore=1;
U=eye(n);
while encore
encore=0;
for p=1:n-1
for q=p+1:n
%givens rotations:
g=[M(p,p:n:pn)-M(q,q:n:pn);...
M(p,q:n:pn)+M(q,p:n:pn);...
i*(M(q,p:n:pn)-M(p,q:n:pn))];
[Ucp,D]=eig(real(g*g');
[la,k]=sort(diag(D));
angles=Ucp(:,k(3));
angles=sign(angles(1))*angles;
c=sqrt(0.5+angles(1)/2);
sr=0.5*(angles(2)-j*angles(3))/c;
sc=conj(sr);
encore=encore | asr;
if asr
colp=M(:,p:n:pn);
colq=M(:,q:n:pn);
M(:,p:n:pn)=c*colp+sr*colq;
M(:,q:n:pn)=c*colq-sc*colp;
rowp=M(p,:);
rowq=M(q,:);
M(p,:)=c*rowp+sc*rowq;
M(q,:)=c*rowq-sr(rowp;
temp=U(:,p);
U(:,p)=c*U(:,p)+sr*U(:,q);
U(:,q)=c*U(:,q)-sc*temp;
end
end
end
end
W=U'*Q;
y=W*x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -