⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emd.m

📁 希尔伯特黄变换的程序源码
💻 M
字号:
function [imf,ort,nbits] = emd(x,t,stop,tst);% EMD (Empirical Mode Decomposition) according to:%% N. E. Huang et al., "The empirical mode decomposition and the % Hilbert spectrum for non-linear and non stationary time series analysis,"  % Proc. Royal Soc. London A, Vol. 454, pp. 903-995, 1998.%% stopping criterion for sifting : %   at each point : mean amplitude < threshold2*envelope amplitude%   &%   mean of boolean array ((mean amplitude)/(envelope amplitude) > threshold) < tolerance%   &%   |#zeros-#extrema|<=1%%%[imf,ort,nbits] = emd(x,t,stop,tst)% inputs: %         - x : analysed signal (line vector)%         - t (optional) : sampling times (line vector) (default : 1:length(x))%         - stop (optional) : threshold, threshold2 and tolerance (optional)%                             for sifting stopping criterion %                             default : [0.05,0.5,0.05]%         - tst (optional) : if equals to 1 shows sifting steps with pause%                            if equals to 2 no pause%% outputs:%         - imf : intrinsic mode functions (last line = residual)%         - ort : index of orthogonality%         - nbits : number of iterations for each mode%% calls:%         - extr (finds extrema and zero-crossings)%         - io : computes the index of orthogonality% % G. Rilling, July 2002% default for stoppingdefstop = [0.05,0.5,0.05];if(nargin==1)  t = 1:length(x);  stop = defstop;  tst = 0;endif(nargin==2)  stop = defstop;  tst = 0;endif (nargin==3)  tst=0;endS = size(x);if ((S(1) > 1) & (S(2) > 1)) | (length(S) > 2)  error('x must have only one row or one column')endif S(1) > 1  x = x';endS = size(t);if ((S(1) > 1) & (S(2) > 1)) | (length(S) > 2)  error('t must have only one row or one column')endif S(1) > 1  t = t';endif (length(t)~=length(x))  error('x and t must have the same length')endS = size(stop);if ((S(1) > 1) & (S(2) > 1)) | (S(1) > 3) | (S(2) > 3) | (length(S) > 2)  error('stop must have only one row or one column of max three elements')endif S(1) > 1  stop = stop';  S = size(stop);endif S(2) < 3  stop(3)=defstop(3);endif S(2) < 2  stop(2)=defstop(2);endsd = stop(1);sd2 = stop(2);tol = stop(3);if tst  figureend% maximum number of iterationsMAXITERATIONS=2000;% maximum number of symmetrized points for interpolationsNBSYM = 2;lx = length(x);sdt(lx) = 0;sdt = sdt+sd;sd2t(lx) = 0;sd2t = sd2t+sd2;% maximum number of extrema and zero-crossings in residualner = lx;nzr = lx;r = x;imf = [];k = 1;% iterations counter for extraction of 1 modenbit=0;% total iterations counterNbIt=0;while ner > 2          % current mode  m = r;    % mode at previous iteration  mp = m;    sx = sd+1;    % tests if enough extrema to proceed  test = 0;    [indmin,indmax,indzer] = extr(m);  lm=length(indmin);  lM=length(indmax);  nem=lm + lM;  nzm=length(indzer);    j=1;    % sifting loop  while ( mean(sx > sd) > tol | any(sx > sd2) | (abs(nzm-nem)>1)) & (test == 0) & nbit<MAXITERATIONS        if(nbit>MAXITERATIONS/5 & mod(nbit,floor(MAXITERATIONS/10))==0)      disp(['mode ',int2str(k),' nombre d iterations : ',int2str(nbit)])      disp(['stop parameter mean value : ',num2str(s)])    end        % boundary conditions for interpolations :             if indmax(1) < indmin(1)      if m(1) > m(indmin(1))        lmax = fliplr(indmax(2:min(end,NBSYM+1)));        lmin = fliplr(indmin(1:min(end,NBSYM)));        lsym = indmax(1);      else        lmax = fliplr(indmax(1:min(end,NBSYM)));        lmin = [fliplr(indmin(1:min(end,NBSYM-1))),1];        lsym = 1;      end    else      if m(1) < m(indmax(1))        lmax = fliplr(indmax(1:min(end,NBSYM)));        lmin = fliplr(indmin(2:min(end,NBSYM+1)));        lsym = indmin(1);      else        lmax = [fliplr(indmax(1:min(end,NBSYM-1))),1];        lmin = fliplr(indmin(1:min(end,NBSYM)));        lsym = 1;      end    end        if indmax(end) < indmin(end)      if m(end) < m(indmax(end))        rmax = fliplr(indmax(max(end-NBSYM+1,1):end));        rmin = fliplr(indmin(max(end-NBSYM,1):end-1));        rsym = indmin(end);      else        rmax = [lx,fliplr(indmax(max(end-NBSYM+2,1):end))];        rmin = fliplr(indmin(max(end-NBSYM+1,1):end));        rsym = lx;      end    else      if m(end) > m(indmin(end))        rmax = fliplr(indmax(max(end-NBSYM,1):end-1));        rmin = fliplr(indmin(max(end-NBSYM+1,1):end));        rsym = indmax(end);      else        rmax = fliplr(indmax(max(end-NBSYM+1,1):end));        rmin = [lx,fliplr(indmin(max(end-NBSYM+2,1):end))];        rsym = lx;      end    end        tlmin = 2*t(lsym)-t(lmin);    tlmax = 2*t(lsym)-t(lmax);    trmin = 2*t(rsym)-t(rmin);    trmax = 2*t(rsym)-t(rmax);        % in case symmetrized parts do not extend enough    if tlmin(1) > t(1) | tlmax(1) > t(1)      if lsym == indmax(1)        lmax = fliplr(indmax(1:min(end,NBSYM)));      else        lmin = fliplr(indmin(1:min(end,NBSYM)));      end      if lsym == 1        error('bug')      end      lsym = 1;      tlmin = 2*t(lsym)-t(lmin);      tlmax = 2*t(lsym)-t(lmax);    end            if trmin(end) < t(lx) | trmax(end) < t(lx)      if rsym == indmax(end)        rmax = fliplr(indmax(max(end-NBSYM+1,1):end));      else        rmin = fliplr(indmin(max(end-NBSYM+1,1):end));      end      if rsym == lx        error('bug')      end      rsym = lx;      trmin = 2*t(rsym)-t(rmin);      trmax = 2*t(rsym)-t(rmax);    end                  mlmax =m(lmax);     mlmin =m(lmin);    mrmax =m(rmax);     mrmin =m(rmin);            % definition of envelopes from interpolation            envmax = interp1([tlmax t(indmax) trmax],[mlmax m(indmax) mrmax],t,'spline');    envmin = interp1([tlmin t(indmin) trmin],[mlmin m(indmin) mrmin],t,'spline');    envmoy = (envmax + envmin)/2;    m = m - envmoy;         [indmin,indmax,indzer] = extr(m);    lm=length(indmin);    lM=length(indmax);    nem = lm + lM;    nzm = length(indzer);    % evaluation of mean zero    sx=2*(abs(envmoy))./(abs(envmax-envmin));    s = mean(sx);        % display             if tst      subplot(4,1,1)      plot(t,mp);hold on;      plot(t,envmax,'--k');plot(t,envmin,'--k');plot(t,envmoy,'r');      title(['IMF ',int2str(k),';   iteration ',int2str(nbit),' before sifting']);      set(gca,'XTick',[])      hold  off      subplot(4,1,2)      plot(t,sx)      hold on      plot(t,sdt,'--r')      plot(t,sd2t,':k')      title('stop parameter')      set(gca,'XTick',[])      hold off      subplot(4,1,3)      plot(t,m)      title(['IMF ',int2str(k),';   iteration ',int2str(nbit),' after sifting']);      set(gca,'XTick',[])      subplot(4,1,4);      plot(t,r-m)      title('residue');      disp(['stop parameter mean value : ',num2str(s)])      if tst == 2        pause(0.01)      else        pause      end          end     % end loop : stops if not enough extrema    if nem < 3      test = 1;    end    mp = m;    nbit=nbit+1;    NbIt=NbIt+1;    if(nbit==(MAXITERATIONS-1))      warning(['forced stop of sifting : too many iterations... mode ',int2str(k),'. stop parameter mean value : ',num2str(s)])    end    end  imf(k,:) = m;  if tst    disp(['mode ',int2str(k),' enregistre'])  end  nbits(k) = nbit;  k = k+1;  r = r - m;  [indmin,indmax,indzer] = extr(r);  ner = length(indmin) + length(indmax);  nzr = length(indzer);  nbit=1;  if (max(r) - min(r)) < (1e-10)*(max(x) - min(x))    if ner > 2      warning('forced stop of EMD : too small amplitude')    else      disp('forced stop of EMD : too small amplitude')    end    break  end  endimf(k,:) = r;ort = io(x,imf);if tst  closeend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -