声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2288|回复: 10

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

[复制链接]
发表于 2011-11-16 17:20 | 显示全部楼层 |阅读模式

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

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

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

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

这是分解出来的信号(第一行为源信号,以下为分解信号)
imfs.jpg
这是源信号的功率谱图
power_spectrum_ori.jpg
这是分解出来的第一个IMF频谱图
power_spectrum_2imf.jpg

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

 楼主| 发表于 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,
            [spmax, spmin, flag]=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 [spmax, spmin, flag]= 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;

 楼主| 发表于 2011-11-16 21:37 | 显示全部楼层
希望高手指点一下
 楼主| 发表于 2011-11-17 09:11 | 显示全部楼层
做HHT的高手们,帮我指点一下吧
 楼主| 发表于 2011-11-20 20:18 | 显示全部楼层
试了EEMD,并且把NE设置到50,结果还是差不多,不知道大虾们是怎么处理的?
发表于 2011-11-21 10:15 | 显示全部楼层
回复 5 # huazi071783 的帖子

我也遇到同样的问题,请问您解决了没?在仿真过程中我尝试了不同信号,发现频率分量小于等于3个的时候完全分解出来了,但大于3个就立刻出现了频率混叠现象了。麻烦高手指点~~~
发表于 2011-11-23 10:57 | 显示全部楼层
本帖最后由 zhangshun5233 于 2011-11-23 10:58 编辑

我今天也发现了类似的问题,就是EMD的停止准则的问题:默认的停止准则并不能对所有的问题都有较好的效果;
要根据具体的问题,设置相应的停止条件,也就是说,使得分解的imf个数由具体问题确定。
但是,我还不知道怎么设置;继续讨论~
 楼主| 发表于 2011-11-23 12:28 | 显示全部楼层
回复 7 # zhangshun5233 的帖子

有时看文献看到人家处理的结果很好,也不知道他们是怎么解决这问题的
发表于 2011-11-23 21:59 | 显示全部楼层
本帖最后由 zhangshun5233 于 2011-11-23 22:01 编辑

回复 8 # huazi071783 的帖子

你分解的结果有几个imf呢?
你是想控制分解得到的imf的个数不?
 楼主| 发表于 2011-11-24 09:01 | 显示全部楼层
回复 9 # zhangshun5233 的帖子

我的有9个,是直接用人家的程序
发表于 2013-10-31 15:32 | 显示全部楼层
好东西啊
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-9 00:32 , Processed in 0.081390 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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