huazi071783 发表于 2011-11-16 17:20

EMD分解信号没有分解出来,频谱图几乎和源信号一样

本帖最后由 huazi071783 于 2011-11-16 21:25 编辑

本人对一简支梁振动的加速度信号用EMD分解,想得到每阶模态的振动时间序列分量(测得的振动信号为各阶模态的叠加),然后再对分解出来的信号作分析。但是我对分解出来的信号作功率谱图,显示频段还是和源信号差不多,这是为什呢?我的想法是每个IMF应该只有一个频段才对啊。请指点!谢谢

这是分解出来的信号(第一行为源信号,以下为分解信号)

这是源信号的功率谱图

这是分解出来的第一个IMF频谱图

huazi071783 发表于 2011-11-16 21:23

本帖最后由 huazi071783 于 2011-11-16 21:28 编辑

这是我的EMD代码
clear all;clc
acce0_2=load('fi0137.txt');
Y=acce_2(:,3);

% NOTE:
%       Nstd: ratio of the standard deviation of the added noise and that
%       of Y;(加性噪声的标准差与Y的比)
%       NE: Ensemble number for the EEMD
%       It should be noted that when Nstd is set to zero and NE is set to 1, the
%       program degenerates to a EMD program.(如果Nstd=0,NE=1,该函数退化成普通的EMD函数)
%      
Nstd=0;NE=1;
allmode=eemd(Y,Nstd,NE);

figure(1)
subplot(4,1,1)
plot(allmode(:,1))
axis([ 0 2500 -0.2 0.2])
subplot(4,1,2)
plot(allmode(:,3))
subplot(4,1,3)
plot(allmode(:,4))
subplot(4,1,4)
plot(allmode(:,5))

%——————function eemd.m
function allmode=eemd(Y,Nstd,NE)
xsize=length(Y);
dd=1:1:xsize;
Ystd=std(Y);                     %计算Y的标准差
Y=Y/Ystd;
TNM=fix(log2(xsize))-1;            %初始化用于存储原始信号和IMF及趋势项分量的矩阵
TNM2=TNM+2;
for kk=1:1:TNM2,
    for ii=1:1:xsize,
      allmode(ii,kk)=0.0;
    end
end
% 初始化输入信号,可以加加性噪声,当Nstd=0时,不加加性噪声,原始信号
%直接参与EMD分解
for iii=1:1:NE,
    for i=1:xsize,
      temp=randn(1,1)*Nstd;
      X1(i)=Y(i)+temp;
    end
%mode矩阵初始化为原始数据
    for jj=1:1:xsize,
      mode(jj,1) = Y(jj);
    end   
    xorigin = X1;
    xend = xorigin;   
    nmode = 1;
    while nmode <= TNM,
      xstart = xend;
      iter = 1;   
      while iter<=10,
            =extrema(xstart);
            upper= spline(spmax(:,1),spmax(:,2),dd);
            lower= spline(spmin(:,1),spmin(:,2),dd);
            mean_ul = (upper + lower)/2;
            xstart = xstart - mean_ul;
            iter = iter +1;
      end
      xend = xend - xstart;   
         nmode=nmode+1;
      for jj=1:1:xsize,
            mode(jj,nmode) = xstart(jj);
      end
    end
    for jj=1:1:xsize,
      mode(jj,nmode+1)=xend(jj);
    end
    allmode=allmode+mode;   
end
allmode=allmode/NE;
allmode=allmode*Ystd;

%-------——————function extrema.m
function = extrema(in_data)
flag=1;
dsize=length(in_data);
spmax(1,1) = 1;
spmax(1,2) = in_data(1);
jj=2;
kk=2;
while jj<dsize,
    if ( in_data(jj-1)<=in_data(jj) & in_data(jj)>=in_data(jj+1) )
      spmax(kk,1) = jj;
      spmax(kk,2) = in_data (jj);
      kk = kk+1;
    end
    jj=jj+1;
end
spmax(kk,1)=dsize;
spmax(kk,2)=in_data(dsize);
if kk>=4
    slope1=(spmax(2,2)-spmax(3,2))/(spmax(2,1)-spmax(3,1));
    tmp1=slope1*(spmax(1,1)-spmax(2,1))+spmax(2,2);
    if tmp1>spmax(1,2)
      spmax(1,2)=tmp1;
    end
    slope2=(spmax(kk-1,2)-spmax(kk-2,2))/(spmax(kk-1,1)-spmax(kk-2,1));
    tmp2=slope2*(spmax(kk,1)-spmax(kk-1,1))+spmax(kk-1,2);
    if tmp2>spmax(kk,2)
      spmax(kk,2)=tmp2;
    end
else
    flag=-1;
end

msize=size(in_data);
dsize=max(msize);
xsize=dsize/3;
xsize2=2*xsize;
spmin(1,1) = 1;
spmin(1,2) = in_data(1);
jj=2;
kk=2;
while jj<dsize,
    if ( in_data(jj-1)>=in_data(jj) & in_data(jj)<=in_data(jj+1))
      spmin(kk,1) = jj;
      spmin(kk,2) = in_data (jj);
      kk = kk+1;
    end
    jj=jj+1;
end
spmin(kk,1)=dsize;
spmin(kk,2)=in_data(dsize);
if kk>=4
    slope1=(spmin(2,2)-spmin(3,2))/(spmin(2,1)-spmin(3,1));
    tmp1=slope1*(spmin(1,1)-spmin(2,1))+spmin(2,2);
    if tmp1<spmin(1,2)
      spmin(1,2)=tmp1;
    end
    slope2=(spmin(kk-1,2)-spmin(kk-2,2))/(spmin(kk-1,1)-spmin(kk-2,1));
    tmp2=slope2*(spmin(kk,1)-spmin(kk-1,1))+spmin(kk-1,2);
    if tmp2<spmin(kk,2)
      spmin(kk,2)=tmp2;
    end
else
    flag=-1;
end
flag=1;

huazi071783 发表于 2011-11-16 21:37

希望高手指点一下

huazi071783 发表于 2011-11-17 09:11

做HHT的高手们,帮我指点一下吧

huazi071783 发表于 2011-11-20 20:18

试了EEMD,并且把NE设置到50,结果还是差不多,不知道大虾们是怎么处理的?

小刺猬和小老鼠 发表于 2011-11-21 10:15

回复 5 # huazi071783 的帖子

我也遇到同样的问题,请问您解决了没?在仿真过程中我尝试了不同信号,发现频率分量小于等于3个的时候完全分解出来了,但大于3个就立刻出现了频率混叠现象了。麻烦高手指点~~~

zhangshun5233 发表于 2011-11-23 10:57

本帖最后由 zhangshun5233 于 2011-11-23 10:58 编辑

我今天也发现了类似的问题,就是EMD的停止准则的问题:默认的停止准则并不能对所有的问题都有较好的效果;
要根据具体的问题,设置相应的停止条件,也就是说,使得分解的imf个数由具体问题确定。
但是,我还不知道怎么设置;继续讨论~

huazi071783 发表于 2011-11-23 12:28

回复 7 # zhangshun5233 的帖子

有时看文献看到人家处理的结果很好,也不知道他们是怎么解决这问题的

zhangshun5233 发表于 2011-11-23 21:59

本帖最后由 zhangshun5233 于 2011-11-23 22:01 编辑

回复 8 # huazi071783 的帖子

你分解的结果有几个imf呢?
你是想控制分解得到的imf的个数不?

huazi071783 发表于 2011-11-24 09:01

回复 9 # zhangshun5233 的帖子

我的有9个,是直接用人家的程序

仓坞仓坞 发表于 2013-10-31 15:32

好东西啊
页: [1]
查看完整版本: EMD分解信号没有分解出来,频谱图几乎和源信号一样