资源简介
matlab编写的对原信号进行独立成分分离FastICA算法实现
,输入信号需自行修改。
代码片段和文件信息
%导入数据,并输出原始数据
%--------对输入的两通道信号进行盲源分离---------
%---导入数据,并输出原始数据---
close all;
clc;
clear;
N=1000;
k=1:N;
%s1=load (‘e:\EMG-co-1-ECG‘);
%s2=load (‘e:\ECG-co‘);
zq=load(‘E:\11q‘);
sq=load(‘E:\11s‘);
t1=1:1:1000;
%s1=sin(2*pi*0.05*t1);
si=sin(2*pi*0.05*t1);
%s1=sq(801:1800)+0.5*si;
s1=sq(801:1800);
%s1=s1-mean(s1‘)
s2=si;
x=[s1;s2]; %观察的信号组
[rowcol] = size(x);
%---对数据进行白化,使之为0均值,单位协方差---
x = x - (mean(x‘))‘*ones(1col);
[v d]= eig(cov(x‘1));
Aw= v*inv(sqrtm(d));
x= Aw‘*x;
%--------用 FastICA 算法实现对源信进行分离---------
epsilon=0.0001;
W=rand(row);
for p=1:row
W(:p)=W(:p)/norm(W(:p));
exit=0;
count=0;
iter=1;
while exit==0;
count=count+1;
temp=W(:p); %记录上次迭代的值
W(:p)=1/(N-1)*x*((temp‘*x).^3)‘-3*temp;
ssum=zeros(row1);
for counter=1:p-1
ssum=ssum+(W(:p)‘*W(:counter))*W(:counter);
end
W(:p)=W(:p)-ssum; %正交化
W(:p)=W(:p)/norm(W(:p));
if(abs((dot(W(:p)temp)))<1+epsilon)&(abs((dot(W(:p)temp)))>1-epsilon) %判断是否收敛
exit=1;
end
iter=iter+1;
end
end
u2= W*x;
y1=u2(1:);
y2=u2(2:);
figure(1);
subplot(
评论
共有 条评论