function [imf]=emd(Sig);%
if(nargin<1),
error('At least one input needed! ');
end
Sig=Sig'
SigLen=length(Sig);
t=1:SigLen;
c=Sig;
Imf=[];
nLoop=1;
MaxLoop=1000;
[IndMax,IndMin]=ExtrPoint(c);%
[Index_zer]=ZeroPoint(c);%
NExtr=length(IndMin)+length(IndMax);
NZero=length(Index_zer);
Bool=1;
NEtd=2;
IMFNum=0;
while(NExtr > 2 & Bool > 0),
h=c;
nLoop=1;
SD=1;
while((SD>0.3|(abs(NZero-NExtr)>1))&(NExtr>2)&nLoop<MaxLoop),
%
LMaxEtd=fliplr(IndMax(1:min(end,NEtd)));
LMinEtd=fliplr(IndMin(1:min(end,NEtd)));
hlMaxEtd=h(LMaxEtd);
hlMinEtd=h(LMinEtd);
LMaxEtd=-LMaxEtd+1;
LMinEtd=-LMinEtd+1;
RMaxEtd=fliplr(IndMax(max(end-NEtd+1,1):end));
RMinEtd=fliplr(IndMin(max(end-NEtd+1,1):end));
hrMaxEtd=h(RMaxEtd);
hrMinEtd=h(RMinEtd);
RMaxEtd=2*SigLen-RMaxEtd;
RMinEtd=2*SigLen-RMinEtd;
%
Max_Env = interp1([LMaxEtd t(IndMax) RMaxEtd],[hlMaxEtd h(IndMax) hrMaxEtd],t,'spline');
%
Min_Env = interp1([LMinEtd t(IndMin) RMinEtd],[hlMinEtd h(IndMin) hrMinEtd],t,'spline');
Mean_Env=(Max_Env+Min_Env)/2;%
Preh=h;
h=h-Mean_Env;
alarm=1.0e-08;
SD=sum(((Preh-h).^2/(Preh.^2+alarm)));
[IndMax,Indmin]=ExtrPoint(h);
[Index_zer]=ZeroPoint(h);
NExtr=length(IndMin)+length(IndMax);
NZero=length(Index_zer);
nLoop=nLoop+1;
end %
IMFNum=IMFNum+1;
disp([num2str(IMFNum),'IMFs have been obtained.']);
Imf=[Imf;h];
c=c-h;
[IndMax,IndMin]=ExtrPoint(c);%
[Index_zer]=ZeroPoint(c);%
NExtr=length(IndMin)+length(IndMax);
NZero=length(Index_zer);
Bool=1;
if((range(c)/range(Sig))<2e-4),
Bool=-1;
end
end
imf=[Imf;c];
[m n]=size(imf);
%xCor=[];