声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 15289|回复: 102

[HHT] 关于EMD的困惑

[复制链接]
发表于 2007-3-13 20:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
用EMD方法来解决自己的研究问题已经有一段时间了,并且取得了不错的结果.但最近在"动力论坛"看了一篇关于EMD方法的长达2年多争论的贴子,感觉越来越不好.且不说他们观点的正确与否,试想如果自己的论文在送外盲审时恰好遇到对EMD持不同观点的人(他可能会认为EMD因为不正交,本质上就是错误的),后果是多么严重.所以现在真不知道怎么办了.
毕竟自己不是搞信号的,现在用EMD方法确实能解决我的问题,由于没有理论的支持,也不能说这种方法是正确的呀. 真希望EMD只是因为理论不足而引起大家的讨论,而不是本质上是错误的.
且不管其它,有一个问题在我看了那个长贴之后,一直很困惑:  如果说EMD方法是错误的,那为什么在国际上没有人发表论文指出呢?为什么huang还能获奖,还能在很多高水平的杂志上发表很多论文一直至今呢?.   但如果说EMD就是正确的,只是理论不足,那为什么我们所查的文献大部分都是华人或中国人发表的,而外国人很少呢(有的第一作者是,而后面会找到Huang的名字),这个方法从96年见文章,到98年成型再到现在有近十年了,难道就没有引起其它国家的科研人员的高度重视,而只是我们?
关于这点困惑也请已经深入研究EMD,和正在研究及想进行研究的同志们帮忙想一下.谢谢
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-3-13 20:27 | 显示全部楼层
补充一点:我所看到的争论,感觉双方也是华人(大陆的及台湾省),虽然里面有英语的提问及回,但从文风上看应该也是华人.如果有人知道国外哪有这个的关于EMD争论的论坛,请给个链接.
发表于 2007-3-13 20:59 | 显示全部楼层
原帖由 qinle 于 2007-3-13 20:22 发表
用EMD方法来解决自己的研究问题已经有一段时间了,并且取得了不错的结果.但最近在"动力论坛"看了一篇关于EMD方法的长达2年多争论的贴子,感觉越来越不好.且不说他们观点的正确与否,试想如果自己的论文在 ...



那个经典帖子我去年至今也在不断关注中,也觉得很多问题,不过应用中它确实带给我们惊喜,如果你不是搞它的理论,只要方法可行、有用,那就可以了。至于理论问题,由于EMD是操作型、算法型的,所以很难对其进行建模,更不用说其他分析了。我觉得里面的数学基础要等牛人出现才能解决的了,但在被证实它是错误之前,我依然相信它是正确的,呵呵


国外也不少学者在搞的,例如P. Flandrin团队、J.C. Nunes团队等,不过的确国内的人对其关注多一点

[ 本帖最后由 eight 于 2007-3-13 21:16 编辑 ]

评分

1

查看全部评分

发表于 2007-3-13 21:47 | 显示全部楼层
鉴于这几天的情况看,大家对于EMD的问题比较多,也比较集中。我准备把这几天大家的问题,和目前讨论出来的答案汇总一下,做一个总帖。希望有兴趣的会员帮助和支持,使得这个帖子能够回答一些普遍的问题。
发表于 2007-3-13 21:50 | 显示全部楼层
原帖由 zhangnan3509 于 2007-3-13 21:47 发表
鉴于这几天的情况看,大家对于EMD的问题比较多,也比较集中。我准备把这几天大家的问题,和目前讨论出来的答案汇总一下,做一个总帖。希望有兴趣的会员帮助和支持,使得这个帖子能够回答一些普遍的问题。



版主你先总结一下吧,然后给大家看看,有问题再仔细讨论一下

ps:为何这几天突然像雨后春笋般涌现出这么多搞EMD的?满版都是EMD或者HHT,以前都不会这样的?难道是版主你引来的?:lol
发表于 2007-3-13 21:56 | 显示全部楼层
哈哈 我是见习的!实习期过了 没准就被解除职务了! 我确实在huang变换,但是这些同仁决不是我找来的。可能是我们对EMD更加敏感,所以帖子一直沉不下去。所以才会有外面的游客注册或者是其他做HHT的朋友喜欢过来看看。
发表于 2007-3-13 22:01 | 显示全部楼层
原帖由 zhangnan3509 于 2007-3-13 21:56 发表
哈哈 我是见习的!实习期过了 没准就被解除职务了! 我确实在huang变换,但是这些同仁决不是我找来的。可能是我们对EMD更加敏感,所以帖子一直沉不下去。所以才会有外面的游客注册或者是其他做HHT的朋友喜欢过来 ...



见习期满后一般不会被解除的,况且一个月后自动转正的,呵呵。版主你表现这么积极,现在还准备整理帖子,怎会被解雇?谁解雇你我第一个站出来反对,哈哈:lol
发表于 2007-3-13 22:03 | 显示全部楼层
不过开诚布公的说,我也被EMD困扰着一直不知道怎么办,看了看
这个帖子 http://forum.vibunion.com/thread-32525-1-1.html 多少有了点启发。
但是依然没有头绪,前几天我的指导老师要求重新修改EMD程序,也没说修改方向。但是我觉得我手上的这个程序已经很经典了。大家可以看看,帮我参谋一下。
function imf = emd(x,t,stop);

% default for stopping
defstop = [0.05,0.5,0.05];

if(nargin==1)
  t = 1:length(x);
  stop = defstop;

end

if(nargin==2)
  stop = defstop;

end



S = size(x);
if ((S(1) > 1) & (S(2) > 1)) | (length(S) > 2)
  error('x must have only one row or one column')
end

if S(1) > 1
  x = x';
end

S = size(t);
if ((S(1) > 1) & (S(2) > 1)) | (length(S) > 2)
  error('t must have only one row or one column')
end

if S(1) > 1
  t = t';
end

if (length(t)~=length(x))
  error('x and t must have the same length')
end

S = 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')
end

if S(1) > 1
  stop = stop';
  S = size(stop);
end

if S(2) < 3
  stop(3)=defstop(3);
end

if S(2) < 2
  stop(2)=defstop(2);
end

sd = stop(1);
sd2 = stop(2);
tol = stop(3);


% maximum number of iterations
MAXITERATIONS=2000;

% maximum number of symmetrized points for interpolations
NBSYM = 2;

lx = length(x);

sdt(lx) = 0;
sdt = sdt+sd;
sd2t(lx) = 0;
sd2t = sd2t+sd2;

% maximum number of extrema and zero-crossings in residual
ner = lx;
nzr = lx;

r = x;
imf = [];
k = 1;

% iterations counter for extraction of 1 mode
nbit=0;

% total iterations counter
NbIt=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;
   
   

    % evaluation of mean zero
     sx=2*(abs(envmoy))./(abs(envmax-envmin));
    s = mean(sx);
    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;
  
  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
  
end

imf(k,:) = r;

看看哪位有什么好的建议? 我洗耳恭听!:handshake

评分

1

查看全部评分

发表于 2007-3-13 22:59 | 显示全部楼层
原帖由 zhangnan3509 于 2007-3-13 22:03 发表
不过开诚布公的说,我也被EMD困扰着一直不知道怎么办,看了看
这个帖子 http://forum.vibunion.com/forum/vi ... &extra=page%3D4 多少有了点启发。
但是依然没有头绪,前几天我的指导老 ...



这个就是flandrin的程序吧。的确不好改,那个停止条件个人认为已经很好的了。前不久看见Huang把原来的SD修改了,把求和号放到分子和分母上,即先分别对分子分母求和,然后再相除。这个改进比原来的SD要好,不过与flandrin相比如何就不得以知了。
发表于 2007-3-13 23:05 | 显示全部楼层
今天太晚了,我明天看看能不能在停止条件上尝试一下。:victory:
发表于 2007-3-13 23:06 | 显示全部楼层
忘了说了 这个程序完全可以拿来用,就是从rilling的程序里改的。大家可以拿去看看效果,那些地方能改进,希望顶一下这张帖子。
发表于 2007-3-13 23:12 | 显示全部楼层
原帖由 zhangnan3509 于 2007-3-13 23:06 发表
忘了说了 这个程序完全可以拿来用,就是从rilling的程序里改的。大家可以拿去看看效果,那些地方能改进,希望顶一下这张帖子。



你贴的程序有改动吗?粗略看了一下好像没有发现
发表于 2007-3-14 08:36 | 显示全部楼层
以EMD_local为蓝本,做了一些修改。但是主体没有变。试试你所说的停止条件。
发表于 2007-3-14 09:44 | 显示全部楼层
zhangnan3509 :
   不知道这句里面: lmax = fliplr(indmax(2:min(end,NBSYM+1)));
 end代表什么意思?
发表于 2007-3-14 10:19 | 显示全部楼层
原帖由 xxf 于 2007-3-14 09:44 发表
zhangnan3509 :
   不知道这句里面: lmax = fliplr(indmax(2:min(end,NBSYM+1)));
 end代表什么意思?



关键是fliplr命令,这个你自己动手help一下,试一下就可以了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 02:23 , Processed in 0.065344 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表