实验数据
Ts = 0.1;
t=-5:Ts:95;
f = cos(pi*t/25)+0.6*cos(2*pi*t/25)+0.5*sin(pi*t/100);
调用matlab,emd(f)函数解算的imf波形,本征模态函数不存在端点发散问题。数据质量好
自个写emd过程matlab代码
第一步求出原始波形的上下包络线
第二波求上下包络线平均
第三步原始信号-上下包络线平均得到第一IMF(本征模态函数)
实验结论,matlab的EMD函数解决了EMD端点效应,具体解决方法未知。
%%%%MATLAB的EMD函数算出的第一本征模态函数和按照自个理解算出的第一本征模态函数对比%%%%%
clear;
Ts = 0.1;
t=5:Ts:95;
f = cos(pi*t/25)+0.6*cos(2*pi*t/25)+0.5*sin(pi*t/100);%端点问题,18版MATLAB已经解决
% y1 = wgn(1,length(f),1);
% y=f+0.02*y1;
t=1:1:length(f);
[imf1,residual1]=emd(f);
b=zeros(length(f),1); %EMD
imf_len1=size(imf1);%EMD
figure(2);
for i=1:1:imf_len1(2)
b=b+imf1(1:end,i);
subplot(4,1,i);
plot(imf1(1:end,i));
end
b=b+residual1;
%%%%%%%%三次样条极大值点%%%%%%%
[pks,locs]=findpeaks(f);
xi=1:1:length(f);
y1=spline(locs,pks,xi);
%%%%%%%三次样条极小值点%%%%%%%
[pks,locs]=findpeaks(-f);
y2=spline(locs,-pks,xi);
c=(y1+y2)/2;
imf=f-c;
figure(1);plot(t,f,'r',t,y1,'k',t,y2,'b',t,c,'g'),title('原始信号');legend('原始','上包络','下包络','平均');
figure(3);plot(t,imf1(1:end,1),'g',t,imf,'r');legend('matlab调用emd函数第一本征imf','按照emd原理算出本征imf(原始-(上下包络平均))');
%%%%%%%%%%%%结论,MATLAB自带的EMD 解决了端点问题,自己写的EMD计算结果存在端点发散问题%%%%%%%%%%%
figure(4);plot(f);