EMD端点效应MATLAB代码注释(G. Rilling版本)

以下是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
% gabriel.rilling@ens-lyon.fr
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

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值