function[r,NmaxX,NminX,Nzer,up_envelop,mean_envelop,down_envelop] = emd_trans(x)
% 对x进行ems变换
lenx = length(x);
NmaxX = 1;
NminX = 1;
Nzer = 1;
maxX = zeros();
CmaxX = zeros();
minX = zeros();
CminX = zeros();
zerX = zeros();
for i = 2:lenx-1
%上包络
if ((x(i-1)<x(i))&&(x(i)>x(i+1))) %找出局部最大值
maxX(NmaxX) = x(i); %保存插值的纵坐标
CmaxX(NmaxX) = i; %保存插值的横坐标
NmaxX = NmaxX+1;
end
%下包络
if ((x(i)<x(i-1))&&(x(i)<x(i+1))) %找出局部最小值
minX(NminX) = x(i); %保存插值纵坐标
CminX(NminX) = i; %保存插值横坐标
NminX = NminX+1;
end
%零值
if ((x(i)==0)||((x(i)>0)&&(x(i-1)<0))||((x(i)<0)&&(x(i-1)>0))) %找到与X轴交差点
zerX(Nzer) = x(i);
Nzer = Nzer+1;
end
end
Crange = 1:lenx; %插值范围
up_envelop = interp1(CmaxX,maxX,Crange,'spline');
down_envelop = interp1(CminX,minX,Crange,'spline');
% 'nearest' - nearest neighbor interpolation
% 'linear' - linear interpolation
% 'spline' - piecewise cubic spline interpolation (SPLINE)
% 'pchip' - shape-preserving piecewise cubic interpolation
% 'cubic' - same as 'pchip'
% 'v5cubic' - the cubic interpolation from MATLAB 5, which does not
% extrapolate and uses 'spline' if X is not equally
% spaced.
mean_envelop = (up_envelop+down_envelop)./2;
r = x-transpose(mean_envelop);
评论0