資源簡介
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(
評論
共有 條評論