http://hexun.com/bigbomb > 复制 > 收藏 | 移动个人门户 和讯博客 | 和讯首页一起走过的日子
美好个人门户博客相册音乐视频网摘博揽邮局朋友圈好友留言板进入我的家主人:bigbomb825826
[发送私信] [加为好友] [关注]
快速链接
[和讯博客]
[发表文章]
[进入管理]
搜索
分类
起始
友情链接
EMD算法代码(基于次端点镜像法) [原创 2007-06-21 18:55:14]
function imf = TryEmd(ip)
%--------------------------------------------------------------------------
% Designer:万学功
% Released Time:2007-6-21
% Email:bigbomb825826@yahoo.com
% Department:江苏大学机械工程学院测控技术研究所
%--------------------------------------------------------------------------
%----函数说明(152):
% 输入ip--待分解数据序列,一维列向量;
% 输出imf--分解后得到的IMF分量,二维数组表示;
%--------------------------------------------------------------------------
%----调用函数:
% Enovelope--次端点镜像法求解上、下包络线;(39)
% MaxMin--求局部极值点及其位置;(24)
% MaxMax--求数组极大值;(6)
% ZeroNum--求过零点数目;(17)
%--------------------------------------------------------------------------
%----参数设置:
PRE_yuzhi=0.005; %--偏差阈值;
NUM1=5; %--分解得到IMF分量的最多数目;
NUM2=800; %--提取IMF分量的最多筛分次数;
%--------------------------------------------------------------------------
flag=0;
I=0;
num1=0;
num2=0;
N=length(ip);
x=1:N;
[max,max_No,min,min_No]=MaxMin(ip);
while(max_No(1)~=0 && min_No(1)~=0)
if(num1>=NUM1) break; end
while(1)
num2=num2+1;
[yy1,yy2]=enovelope(x,max,max_No,min,min_No);
mean=(yy1+yy2)/2;
h1=ip-mean;
[max,max_No,min,min_No]=MaxMin(h1);
if(max_No(1)==0 || min_No(1)==0)
flag=1;
break;
end
[yy1,yy2]=enovelope(x,max,max_No,min,min_No);
mean=(yy1+yy2)/2;
hmax=MaxMax(mean);
N1=ZeroNum(h1);
tiaojian1=hmax-PRE_yuzhi;
tiaojian2=abs(length(max_No)+length(min_No)-N1);
if((tiaojian1<0 && tiaojian2<=1) || num2<=NUM2)
I=I+1;
imf(I,:)=h1;
break;
else
ip1=h1;
[max,max_No,min,min_No]=MaxMin(ip1);
end
end
if(flag==1)
flag=0;
break;
else
ip=ip-imf(I,:);
num1=I;
[max,max_No,min,min_No]=MaxMin(ip);
end
end
imf(I+1,:)=ip;
%---------------------------------调用函数---------------------------------
%--------------------------------------------------------------------------
function [y_up,y_low]= Enovelope(x,max,max_No,min,min_No)
%--次端点镜像延拓法获得的上下包络线;
%--注:输入参数是由MaMin函数获得的极值点;
l=length(x);
l1=length(max);
N1=max_No(1)-1;
N2=length(x)-max_No(end);
l2=length(min);
N3=min_No(1)-1;
N4=length(x)-min_No(end);
max1_No(1)=1;
for i=2:(l1+1) max1_No(i)=max_No(i-1)+N1; end
max1_No(l1+2)=l+N1+N2;
max1(1)=max(1);
for i=2:(l1+1) max1(i)=max(i-1); end
max1(l1+2)=max(end);
min1_No(1)=1;
for i=2:(l2+1) min1_No(i)=min_No(i-1)+N3; end
min1_No(l2+2)=l+N3+N4;
min1(1)=min(1);
for i=2:(l2+1) min1(i)=min(i-1); end
min1(l2+2)=min(end);
x1=1:(l+N1+N2);
cs1 = spline(max1_No,max1);
y1=ppval(cs1,x1);
for i=1:l y_up(i)=y1(i+N1); end
x2=1:(l+N3+N4);
cs2 = spline(min1_No,min1);
y2=ppval(cs2,x2);
for i=1:l y_low(i)=y2(i+N3); end
%--------------------------------------------------------------------------
function e1 = MaxMax(y)
e1=abs(y(1));
for i=2:length(y)
if(abs(y(i))>e1) e1=abs(y(i)); end
end
%--------------------------------------------------------------------------
function [max,max_No,min,min_No]=MaxMin(ip)
%--MaxMin函数
%--求局部极值点及其位置
max=0;
max_No=0;
min=0;
min_No=0;
N=length(ip);
j1=1;
j2=1;
for i=2:(N-1)
if(ip(i)>ip(i-1)&&ip(i)>ip(i+1))
max(j1)=ip(i);
max_No(j1)=i;
j1=j1+1;
elseif(ip(i)<ip(i-1)&&ip(i)<ip(i+1))
min(j2)=ip(i);
min_No(j2)=i;
j2=j2+1;
end
end
%--------------------------------------------------------------------------
function N1=ZeroNum(ip)
%--ZeroNum函数
%--求过零点个数
N=length(ip);
N1=0;
for i=1:(N-1)
if(ip(i)==0)
N1=N1+1;
elseif(ip(i)*ip(i+1)<0)
N1=N1+1;
end
end
if(ip(N)==0)
N1=N1+1;
end
标签: 学术区
票数:0我顶
[手机订阅] [收藏到我的网摘]
[推荐] | [评论] | [举报] | [打印]
本文章被推荐到了0个圈子
点击数: 215 评论数: 3
本文章引用通告地址(TrackBack Ping URL)为:
http://post.blog.hexun.com/bigbomb/trackback.aspx?articleid=10204785&key=633180489143200000
本文章尚未被引用。
上一篇: 多线程技术
博客链条秀 想在这里投放广告?点击查看详情
更多...
舒淇和钟欣桐的两种不同命运 秦海璐浓妆遭老外暧昧窥胸宝盈鸿利基金拆分申购 机构最新股票池大曝光
最新读者留下足迹请登录
[登录][注册]bobkin
bobking2[发送私信] Re: EMD算法代码(基于次端点镜像法) [2008-3-26 11:22:53]
万学功,你好,你的算法还没有解决端点效应。存在严重的端点效应。
你有如何改进的算法吗?
[引用] [支持] [反对] [删除] [加入黑名单]
四毛(未注册) Re: EMD算法代码(基于次端点镜像法) [2007-12-4 20:53:12]
我运行了你的程序,分解出来的好像不对啊
请问while(max_No(1)~=0 && min_No(1)~=0)是什么意思啊
[引用] [支持] [反对] [删除] [不允许匿名评论]
阿蛮(未注册) Re: EMD算法代码(基于次端点镜像法) [2007-7-5 15:36:41]
太感谢了!!!请问楼主这段EMD是不是用的matlab语言?用fortran的话改动大吗?
[引用] [支持] [反对] [删除] [不允许匿名评论]
发表评论
大 名: [登录] [注册成为和讯用户]
(不填写则显示为匿名者)
网 址:
(您的网址,可以不填)
标 题:
内 容:
字数上限为2000字
请根据下图中的字符输入验证码:
0
点这里显示验证码。
(您的评论将有可能审核后才能发表)和讯个人门户 v1.0 | 和讯部落 | 客服中心
评论1