当前位置:文档之家› LMD经验模态分解matlab程序要点

LMD经验模态分解matlab程序要点

else debs = []; fins = [];
end end if length(debs) > 0
if fins(end) == m if length(debs) > 1 debs = debs(1:(end-1)); fins = fins(1:(end-1));
else debs = []; fins = [];
end %----------zhaochun.m
function [pf,a,si]=zhaochun(a,h,wucha1)
chun_num=0;
while 1
chun_num=chun_num+1
t=1:length(h); h_pos=position(h);% 极值点位置序列 tpoint=t(h_pos);% 极值点时间值
%此处端点处的均值和包络都是 端点和极值点之间的均值和包络值 (如果端点视作极值点, 这样处理是不合理的,端点都不是极值点,这样处理是正确的)
lmi_point=mi(1);% 左端点的均值
rmi_point=mi(length(mi));% 右端点的均值 lai_point=ai(1);% 左端点的包络 rai_point=ai(length(ai));% 右端点的包络
hpoint=h(h_pos);% 极值点幅度值 hpoint=bianjie(h,hpoint,1);% 端点处理后的极值点,多出了
2 个极值点
[mi,ai]=find_miai(hpoint);% 找出极值点之间的均值函数和包络函数 mi_point=junzhi(mi);% 所有极值点处的均值序列(幅值) -纵坐标(点序列) ai_point=junzhi(ai);% 所有极值点处的包络序列(幅值) -纵坐标(点序列)
包络值(带端
%
tpoint_d=link(t(1),t(length(t)),tpoint);
mi_fun=chadian1(tpoint_d,mi,mi_point_d);% 包含端点和极值点和普通点的 的均值序列
均值序列 -平缓前
ai_fun=chadian1(tpoint_d,ai,ai_point_d);% 包含端点和极值点和普通点的 包络序列 %以上是完整的未处理的均值函数 mi_fun 和包络函数 ai_fun
此处没有提供测试代码,如需要可以点这里: 点我
源代码如下:
%原始 lmd 算法,效果很不好,不知道程序哪里写错 function[PF,A,SI]=lmd(m) c=m; k=0 wucha1=0.001; n_l=nengliang(m); while 1
k=k+1; a=1; h=c; [pf,a,si]=zhaochun(a,h,wucha1); c=c-pf; PF(k,:)=pf; A(k,:)=a; SI(k,:)=si; c_pos=pos(c); n_c=nengliang(c); n_pf=nengliang(pf); if length(c_pos)<3 || n_c<n_l/100 || length(pos(pf))<length(c_pos) || n_pf<n_c
PF(k+1,:)=c; break end end
function pos=pos(y) %功能:找序列极值点位置坐标 %y: 输入序列 %pos:极值点的序列位置坐标 m = length(y); d = diff(y);
n = length(d); d1 = d(1:n-1);
d2 = d(2:n); indmin = find(d1.*d2<0 & d1<0)+1; indmax = find(d1.*d2<0 & d1>0)+1;
%
mi_point_d=link(lmi_point,rmi_point,mi_point);% 连接端点均值及所有极值点处的 端点的均值序列)(点序列)
均值 (带
ai_point_d=link(lai_point,rai_point,ai_point);% 连接端点包络及所有极值点出的 点的包络序列)(点序列)
end end end lc = length(debs); if lc > 0 for k = 1:lc
if d(debs(k)-1) > 0 if d(fins(k)) < 0 imax = [imax round((fins(k)+debs(k))/2)]; end
else if d(fins(k)) > 0 imin = [imin round((fins(k)+debs(k))/2)]; end
包络序列 -平滑前的
%找出第一平滑的滑动跨度 kmax=max(diff(tpoint_d));% 找出时间跨度最大的 相邻几点 间的 距离 kmax1=uint16(kmax/3); kmax1=double(kmax1); jiou=uint8(rem(kmax1,2));f length(imax) > 0 indmax = sort([indmax imax]);
end
if length(imin) > 0 indmin = sort([indmin imin]);
end
end
minmax=cat(2,indmin,indmax);
pos=sort(minmax);
if any(d==0)
imax = []; imin = [];
bad = (d==0); dd = diff([0 bad 0]); debs = find(dd == 1); fins = find(dd == -1); if debs(1) == 1
if length(debs) > 1 debs = debs(2:end); fins = fins(2:end);
LMD经验模态分解 matlab 程序——原味的
曾经也用滑动平均写过 LMD ,其实滑动平均的 EMD 才是原汁原味的居于均值分解。 分享给有需要的人, 程序写的不好, 只是希望提供一种思路。 如果谁写了更完美 LMD 程序, 别忘了发我一份,快毕业了,一直没有把 LMD 写完美,对于我来说始终是个遗憾。来分完 美的 LMD 让我也品尝下,我也无憾了 ~ 代码下载地址: /source/3102096
相关主题