以下是G. Rilling版本的EMD代码中,抑制端点效应的镜像延拓MATLAB代码注释。
镜像延拓左端延拓的情况下:
(1)第一个极值是极大值,并且第一个采样值大于第一个极小值,则以第一个极大值点为对称中心。
(2)第一个极值是极大值,而第一个采样值小于第一个极小值,则认为第一个采样点为极小值点,以该点为对称中心。
(3)第一个极值是极小值,并且第一个采样值小于第一个极大值,则以第一个极小值点为对称中心。
(4)第一个极值是极小值,且第一个采样值大于第一个极大值,则认为第一个采样点为极大值点,以该点为对称中心。
右端延拓的情况下:
(1)最后一个极值是极小值,并且最后一个采样值小于最后一个极大值,则以最后一个极小值点为对称中心。
(2)最后一个极值是极小值,且最后一个采样值大于最后一个极大值,则认为最后一个采样点为极大值点,以该点为对称中心。
(3)最后一个极值是极大值,并且最后一个采样值大于最后一个极小值,则以最后一个极大值点为对称中心。
(4)最后一个极值是极大值,而最后一个采样值小于最后一个极小值,则认为最后一个采样点为极小值点,以该点为对称中心。
%BOUNDARY_CONDITIONS_EMD extends an extrema set to limit edge effects on the interpolations
%延拓极值点
%
% [TMIN,TMAX,ZMIN,ZMAX] = BOUNDARY_CONDITIONS_EMD(INDMIN,INDMAX,T,X,Z,NBSYM)
%
% inputs:
% - INDMIN, INDMAX: indices of minima and maxima in the real signal X
% 信号的极大极小值点的角标
% - T: sampling times 采样时间
% - X: real signal in which INDMIN and INDMAX are the indices of extrema
% 实际信号
% - Z: signal which values are interpolated in the final envelope
% 最后包络中需要插值的数据
% - NBSYM: number of points added to each end两端需要延拓的极值点数
%
% outputs:
% - TMIN, TMAX: extended sampling times 延拓出来的采样点数
% - ZMIN, ZMAX: extended "extrema" set 延拓出来的极值点集
%
% use:
% - for a real signal X:
% [TMIN,TMAX,ZMIN,ZMAX] = BOUNDARY_CONDITIONS_EMD(INDMIN,INDMAX,T,X,X,NBSYM)
% - for a complex signal Z and a direction PHI:
% X = exp(-i*PHI)*Z;
% [TMIN,TMAX,ZMIN,ZMAX] = BOUNDARY_CONDITIONS_EMD(INDMIN,INDMAX,T,X,Z,NBSYM)
%
% rem: it has to be noted that this function was originally written for the
% classical EMD and adapted to the bivariate case without a proper study of its
% effects. The edge effects problem for the bivariate EMD has not been studied yet.
%需要注意的是,这个函数最初是为经典EMD编写的,并在没有适当研究其影响的情况下适应了
%二元情况。双变量EMD的边缘效应问题尚未得到研究。
% See also
% extr
%
% G. Rilling, last modification 3.2007
% [email protected]
function [tmin,tmax,zmin,zmax] = boundary_conditions_emd(indmin,indmax,t,x,z,nbsym)
lx = length(x);
if (length(indmin) + length(indmax) < 3)
error('not enough extrema')
end %若原始序列极值点小于三个则报错
% boundary conditions for interpolations :
if indmax(1) < indmin(1)%若第一个极值点是极大值
if x(1) > x(indmin(1))%若x(1)大于第一个极小值,则镜面在第一个极大值点处
lmax = fliplr(indmax(2:min(end,nbsym+1)));%极大值点
lmin = fliplr(indmin(1:min(end,nbsym)));%极小值点
lsym = indmax(1);
else %若x(1)小于第一个极小值,则镜面在第一个极小值点处
lmax = fliplr(indmax(1:min(end,nbsym)));
lmin = [fliplr(indmin(1:min(end,nbsym-1))),1];
lsym = 1;
end
else
if x(1) < x(indmax(1)) %第一个极值是极小值,并且第一个采样值小于第一个极大值,则认为第一个采样点为对称中心。
lmax = fliplr(indmax(1:min(end,nbsym)));
lmin = fliplr(indmin(2:min(end,nbsym+1)));
lsym = indmin(1);
else %第一个极值是极小值,且第一个采样值大于第一个极大值,则以第一个极小值点为对称中心。
lmax = [fliplr(indmax(1:min(end,nbsym-1))),1];
lmin = fliplr(indmin(1:min(end,nbsym)));
lsym = 1;
end
end
if indmax(end) < indmin(end)%最后一个极值是极小值,并且最后一个采样值小于最后一个极大值,则以最后一个极小值点为对称中心。
if x(end) < x(indmax(end))
rmax = fliplr(indmax(max(end-nbsym+1,1):end));
rmin = fliplr(indmin(max(end-nbsym,1):end-1));
rsym = indmin(end);
else %最后一个极值是极小值,且最后一个采样值大于最后一个极大值,则认为最后一个采样点为极大值点,以该点为对称中心。
rmax = [lx,fliplr(indmax(max(end-nbsym+2,1):end))];
rmin = fliplr(indmin(max(end-nbsym+1,1):end));
rsym = lx;
end
else
if x(end) > x(indmin(end))%最后一个极值是极大值,并且最后一个采样值大于最后一个极小值,则以最后一个极大值点为对称中心。
rmax = fliplr(indmax(max(end-nbsym,1):end-1));
rmin = fliplr(indmin(max(end-nbsym+1,1):end));
rsym = indmax(end);
else %最后一个极值是极大值,而最后一个采样值小于最后一个极小值,则认为最后一个采样点为极小值点,以该点为对称中心。
rmax = fliplr(indmax(max(end-nbsym+1,1):end));
rmin = [lx,fliplr(indmin(max(end-nbsym+2,1):end))];
rsym = lx;
end
end
tlmin = 2*t(lsym)-t(lmin);
tlmax = 2*t(lsym)-t(lmax);
trmin = 2*t(rsym)-t(rmin);
trmax = 2*t(rsym)-t(rmax);
% in case symmetrized parts do not extend enough以防对称部分延拓的不够
if tlmin(1) > t(1) || tlmax(1) > t(1)
if lsym == indmax(1)
lmax = fliplr(indmax(1:min(end,nbsym)));
else
lmin = fliplr(indmin(1:min(end,nbsym)));
end
if lsym == 1
error('bug')
end
lsym = 1;
tlmin = 2*t(lsym)-t(lmin);
tlmax = 2*t(lsym)-t(lmax);
end
if trmin(end) < t(lx) || trmax(end) < t(lx)
if rsym == indmax(end)
rmax = fliplr(indmax(max(end-nbsym+1,1):end));
else
rmin = fliplr(indmin(max(end-nbsym+1,1):end));
end
if rsym == lx
error('bug')
end
rsym = lx;
trmin = 2*t(rsym)-t(rmin);
trmax = 2*t(rsym)-t(rmax);
end
zlmax =z(lmax);
zlmin =z(lmin);
zrmax =z(rmax);
zrmin =z(rmin);
tmin = [tlmin t(indmin) trmin];
tmax = [tlmax t(indmax) trmax];
zmin = [zlmin z(indmin) zrmin];
zmax = [zlmax z(indmax) zrmax];
end