声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3096|回复: 7

[综合] EMD分解疑惑,请各位大侠帮忙啊!

[复制链接]
发表于 2012-4-29 20:55 | 显示全部楼层 |阅读模式

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

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

x
我自己用正弦信号,试了一段包络的程序,感觉上包络线不对吧,请各位帮忙啊!
程序如下:
clear;
clc
fs=512;N=256
t=0:1/fs:(N-1)/fs;t=t';
f1=5;f2=100;
x=sin(2*pi*f2*t)
n=length(x);
s=x;
t=0:length(s)-1;
s1=s;
sd=1;
if(sd>0.3)
    jd=find(diff(sign(diff(s1)))==-2)+1;  %找h1极大值的位置
    jx=find(diff(sign(diff(s1)))==2)+1; %找h1极小值的位置
    ah=length(jd);
    al=length(jx);
    jdz(ah)=0;
    for i=1:ah
        bh=jd(i);
        jdz(i)=s1(bh);
    end                     %找出h1极大值对应函数值
    jxz(al)=0;
    for i=1:al
        bl=jx(i);
        jxz(i)=s1(bl);
    end                     %找出h1极小值对应函数值
    jsbl=spline(jd,jdz,t);  %极大值拟和的上包络
    jxbl=spline(jx,jxz,t)  %极小值拟和的下包络
    m1=(jsbl+jxbl)/2;       %上下包络均值
    m1=m1';
    h1=s1-m1;
    sd=sum(((s1-h1)./h1).^2);
end

subplot(511)
plot(t,x)
subplot(512)
plot(t,x)
axis([0 300 -1 -0.5])
hold on;
subplot(513)
plot(t,jxbl)
axis([0 300 -1 -0.5])
subplot(514)
plot(t,x)
axis([0 300 0.5 1])
subplot(515)
plot(t,jsbl)
%title('采用EMD中的包络方法');
结果如下:
结果.png

上包络线是不是不对啊?

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

 楼主| 发表于 2012-4-29 20:56 | 显示全部楼层
请各位大侠指点啊,还有就是为什么要求上下包络均值啊!
发表于 2012-4-30 10:58 | 显示全部楼层
EMD是针对调频调幅信号,至少是调频信号吧,你的那个正弦信号本身就是单一频率的信号,好像不用分解了吧
呵呵,我瞎说的不知道对不
发表于 2012-4-30 11:02 | 显示全部楼层
本帖最后由 syxqq123 于 2012-4-30 11:03 编辑

EMD将信号分解成N个本征模函数,正弦信号已经符合本征模函数的条件了:极值点和过零点数目相等或至多差一点;在任意点,由局部极大点和极小点构成的两条包络线平均值为0
 楼主| 发表于 2012-4-30 11:06 | 显示全部楼层
那调幅也是可以的吧,这个信号的上下包络值应该是对称的吧,怎么会有这么大的差别呢?
发表于 2012-5-1 08:18 | 显示全部楼层
你这个上下包络计算得是对的吧,上包络接近1,下包络接近-1,符合正弦曲线的包络
发表于 2015-1-14 12:55 | 显示全部楼层
sd=sum(((s1-h1)./h1).^2);这语句是不是有错误。关于SD,我见有sd = sum((x1-x2).^2)/sum(x1.^2);
发表于 2019-2-22 21:05 | 显示全部楼层
本帖最后由 mxlzhenzhu 于 2019-2-22 21:11 编辑

下面这两句代码,你写的很有水平哈:

jd=find(diff(sign(diff(s1)))==-2)+1;  %找h1极大值的位置
jx=find(diff(sign(diff(s1)))==2)+1; %找h1极小值的位置

%%===========Test code===============
fs=1000;dt=1/fs;t=[0:dt:10].';
y=cos(pi*t);
jd=find(diff(sign(diff(y)))==-2)+1;  %找h1极大值的位置
jx=find(diff(sign(diff(y)))==2)+1; %找h1极小值的位置
plot(t(jd),y(jd),'o')
hold on
plot(t,y)
plot(t(jx),y(jx),'*')



您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-24 20:58 , Processed in 0.083521 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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