• 大小: 20KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-14
  • 语言: Matlab
  • 标签: EMD  

资源简介

经验模态分解EMD(不带边界延拓的),根据法国学者的镜像延拓经验模态分解修改而来。

资源截图

代码片段和文件信息

%2007新出来的包含复数的emd函数(端点视作极值点)
function [imfortnbits] = emd3(varargin)
[xtsdsd2tolMODE_COMPLEXndirsdisplay_siftingsdtsd2trimfknbitNbItMAXITERATIONSFIXEFIXE_HMAXMODESINTERPmask] = init(varargin{:});
if display_sifting
  fig_h = figure;
end


% 主循环 : 至少要求存在3个极值点,如果采用mask信号,不进入主循环
while ~stop_EMD(rMODE_COMPLEXndirs) && (k < MAXMODES+1 || MAXMODES == 0) && ~any(mask)

  % 当前模式
  m = r;

  % 前一次迭代的模式
  mp = m;

  % 计算均值和停止条件
  if FIXE % 如果设定了迭代次数
    [stop_siftmoyenne] = stop_sifting_fixe(tmINTERPMODE_COMPLEXndirs);
  elseif FIXE_H % 如果设定了迭代次数,且保留停止条件|#zeros-#extrema|<=1
    stop_count = 0;
    [stop_siftmoyenne] = stop_sifting_fixe_h(tmINTERPstop_countFIXE_HMODE_COMPLEXndirs);
  else % 采用默认停止条件
    [stop_siftmoyenne] = stop_sifting(mtsdsd2tolINTERPMODE_COMPLEXndirs);
  end

  % 当前模式幅度过小,机器精度就可能引起虚假极值点的出现
  if (max(abs(m))) < (1e-10)*(max(abs(x))) % IMF的最大值小于信号最大值的1e-10
    if ~stop_sift % 如果筛过程没有停止
      warning(‘emd:warning‘‘forced stop of EMD : too small amplitude‘)
    else
      disp(‘forced stop of EMD : too small amplitude‘)
    end
    break
  end


  % 筛循环
  while ~stop_sift && nbit
    if(~MODE_COMPLEX && nbit>MAXITERATIONS/5 && mod(nbitfloor(MAXITERATIONS/10))==0 && ~FIXE && nbit > 100)
      disp([‘mode ‘int2str(k)‘ iteration ‘int2str(nbit)])
      if exist(‘s‘‘var‘)%查找是否存在变量s(var是指查找变量)
        disp([‘stop parameter mean value : ‘num2str(s)])
      end
      [imiM] = extr(m);
      disp([int2str(sum(m(im) > 0))‘ minima > 0; ‘int2str(sum(m(iM) < 0))‘ maxima < 0.‘])
    end

    % 筛过程
    m = m - moyenne;

    % 计算均值和停止条件
    if FIXE
      [stop_siftmoyenne] = stop_sifting_fixe(tmINTERPMODE_COMPLEXndirs);
    elseif FIXE_H
      [stop_siftmoyennestop_count] = stop_sifting_fixe_h(tmINTERPstop_countFIXE_HMODE_COMPLEXndirs);
    else
      [stop_siftmoyennes] = stop_sifting(mtsdsd2tolINTERPMODE_COMPLEXndirs);
    end

    % 演示过程
    if display_sifting && ~MODE_COMPLEX
      NBSYM = 2;
      [indminindmax] = extr(mp);
      [tmintmaxmminmmax] = boundary_conditions(indminindmaxtmpmpNBSYM);
      envminp = interp1(tminmmintINTERP);
      envmaxp = interp1(tmaxmmaxtINTERP);
      envmoyp = (envminp+envmaxp)/2;
      if FIXE || FIXE_H
        display_emd_fixe(tmmprenvminpenvmaxpenvmoypnbitkdisplay_sifting)
      else
        sxp = 2*(abs(envmoyp))./(abs(envmaxp-envminp));
        sp = mean(sxp);
        display_emd(tmmprenvminpenvmaxpenvmoypsspsxpsdtsd2tnbitkdisplay_siftingstop_sift)
      end
    end

    mp = m;
    nbit = nbit+1; % 单轮迭代计数
    NbIt = NbIt+1; % 总体迭代计数

    if (nbit==(MAXITERATIONS-1) && ~FIXE && nbit > 100)
      if exist(‘s‘‘var‘)
        warning(‘emd:warning‘[‘forced stop of sifting : too many iterations... mode ‘int2str(k)‘. stop parameter mean value : ‘num2str(s)])
      else
        warning(‘emd:warning‘[‘f

评论

共有 条评论