www.pudn.com > duichengyantuo.rar > duichenyantuo.m, change:2009-04-22,size:3098b


t=linspace(0,1,1024); 
x=cos(2*pi*3*t)+0.4*cos(2*pi*10*t)+0.9*sin(2*pi*25*t); 
%figure(1) 
plot(x); 
[indmin,indmax,indzer] = extr(x); 
for i=1:986 
    x1(1,i)=x(10+i-1); 
end 
figure(2) 
plot(x1) 
x2=[x1 x1 x1] 
figure(3) 
plot(x2) 
figure(4) 
t1=1:1:2958; 
plot(t1(1:987),x2(1:987),'-',t1(987:1973),x2(987:1973),'-',t1(1973:2958),x2(1973:2958),'-'); 
 
 
n=4; 
N = length(x2); 
 
%------------------------------------------------------------------------- 
% loop to decompose the input signal into n successive IMFs 
 
imf = []; % Matrix which will contain the successive IMF, and the residue 
 
for k=1:n % loop on successive IMFs 
    
   %------------------------------------------------------------------------- 
   % inner loop to find each imf 
    
   h = x; % at the beginning of the sifting process, h is the signal 
   SD = 1; % Standard deviation which will be used to stop the sifting process 
    
   while SD > 0.3 % while the standard deviation is higher than 0.3 (typical value) 
       
      % find local max/min points 
      d = diff(h); % approximate derivative 
      maxmin = []; % to store the optima (min and max without distinction so far) 
      for i=1:N-2 
         if d(i)==0                        % we are on a zero 
            if sign(d(i-1))~=sign(d(i+1))  % it is a maximum 
               maxmin = [maxmin, i]; 
            end 
         elseif sign(d(i))~=sign(d(i+1))   % we are straddling a zero so 
            maxmin = [maxmin, i+1];        % define zero as at i+1 (not i) 
         end 
      end 
       
      if size(maxmin,2) < 2 % then it is the residue 
         break 
      end 
       
      % divide maxmin into maxes and mins 
      if maxmin(1)>maxmin(2)              % first one is a max not a min 
         maxes = maxmin(1:2:length(maxmin)); 
         mins  = maxmin(2:2:length(maxmin)); 
      else                                % is the other way around 
         maxes = maxmin(2:2:length(maxmin)); 
         mins  = maxmin(1:2:length(maxmin)); 
      end 
       
      % make endpoints both maxes and mins 
      maxes = [1 maxes N]; 
      mins  = [1 mins  N]; 
       
       
      %------------------------------------------------------------------------- 
      % spline interpolate to get max and min envelopes; form imf 
      maxenv = spline(maxes,h(maxes),1:N); 
      minenv = spline(mins, h(mins),1:N); 
       
      m = (maxenv + minenv)/2; % mean of max and min enveloppes 
      prevh = h; % copy of the previous value of h before modifying it 
      h = h - m; % substract mean to h 
       
      % calculate standard deviation 
      eps = 0.0000001; % to avoid zero values 
      SD = sum ( ((prevh - h).^2) ./ (prevh.^2 + eps) ); 
       
   end 
    
   imf = [imf; h]; % store the extracted IMF in the matrix imf 
   % if size(maxmin,2)<2, then h is the residue 
        plot(imf); 
   % stop criterion of the algo. if we reach the end before n 
   if size(maxmin,2) < 2 
      break 
   end 
    
   x= x - h; % substract the extracted IMF from the signal 
 
end 
c=imf'; 
figure(1) 
nt= plot4c(t,c,1);