weiyuperfect 发表于 2008-9-11 21:18

求助关于emd程序里的boundary_conditions函数

emd程序当中有这个函数boundary_conditions:
% 处理边界条件(镜像法)
function = boundary_conditions(indmin,indmax,t,x,z,nbsym)
% 实数情况下,x = z
lx = length(x);
% 判断极值点个数
if (length(indmin) + length(indmax) < 3)
error('not enough extrema')
end
% 插值的边界条件
if indmax(1) < indmin(1) % 第一个极值点是极大值
if x(1) > x(indmin(1)) % 以第一个极大值为对称中心
    lmax = fliplr(indmax(2:min(end,nbsym+1)));
    lmin = fliplr(indmin(1:min(end,nbsym)));
    lsym = indmax(1);
else % 如果第一个采样值小于第一个极小值,则将认为该值是一个极小值,以该点为对称中心
    lmax = fliplr(indmax(1:min(end,nbsym)));
    lmin = ;
    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 = ;
    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 = ;
    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 = ;
    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);
   
% 如果对称的部分没有足够的极值点
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 = ;
tmax = ;
zmin = ;
zmax = ;
end
请问这里的处理边界条件是什么意思呢?怎么处理边界条件呢?目的是为了做什么呢?还有这里的nbsym的值多少呢?代表什么?求高手给俺指点一下,非常感谢!

吃书的老虎 发表于 2008-9-12 10:44

处理边界条件:一般是指端点你是当作极大值还是极小值处理,你的依据是什么。其实在EMD中边端处理包括了三样条自身的边端处理和EMD的端点处理。
怎么处理边界条件呢?:目前国内有几种,比较好的我觉得是法国的RILLING写的。
目的是为了做什么呢?:是抑制边端震荡(由三样条插值引起的)从二个边端延伸到信号中间,“污染”信号频率成分。
nbsym:可能是用来在极端的情况下限制极值点的。

sssbbbhhh1 发表于 2008-10-19 16:03

nbsym限制什么啊??不要乱讲

nbsym的真正用途是端点延拓的个数,这是因为不同的方法需要端点延拓的个数不同,有两边各一个和各2个之分

大鹏之举 发表于 2009-4-28 18:12

回复 楼主 weiyuperfect 的帖子

有哪位仁兄可以不吝赐教呀,指点一下他是怎么具体镜像的?先行谢过!

chao0922 发表于 2009-5-5 23:31

用一组短序列带进入函数计算下就OK了!
效果也一般,分解实际信号时,采样长度要够,但是分解的层数会变大,虚假分量变多。
可能是正交性造成的,所以目前来说,这方法有点悲观,能用用,但是严格成文的话,最好和小波比较!

cboboc 发表于 2010-5-11 16:56

本帖最后由 wdhd 于 2016-9-21 10:57 编辑

原帖由 weiyuperfect 于 2008-9-11 21:18 发表
emd程序当中有这个函数boundary_conditions:
% 处理边界条件(镜像法)
function = boundary_conditions(indmin,indmax,t,x,z,nbsym)
% 实数情况下,x = z
lx = length(x);
% 判断极值点 ...

请教各位,在这个emd程序中, 以左延拓先极大后极小为例: tlmin = 2*t(lsym)-t(lmin);timin代表的是什么时间呢?t(lsym)代表的是对称轴所在的时间,lmin代表的是经过镜像以后的对称轴左边的极小值点的位置,t(lmin)不就是应该表示镜像以后所得到的在对称轴左边的极小值所在的时间吗 ?按这个公式来计算
tlmin = 2*t(lsym)-t(lmin);tlmin代表的是什么时间呢?请教大家!!!
页: [1]
查看完整版本: 求助关于emd程序里的boundary_conditions函数