cleverblue 发表于 2008-11-26 12:33

关于用正弦插值法解决emd的端点拓延问题和端点效应问题

要解决emd的各种问题,第一个是解决端点拓延问题,如果有端点拓延,免不了会出现误差,而且对未知的信号不能用理论来解释。我的方法是先计算出信号的各个极值点,然后将前后两个端点也作为极值,最后用两个端点间插值的办法使信号平滑,解决插值的问题就是要抛弃三点或更多点插值在emd中的应用,必须使用两点插值的方法。这个方法可以选择正弦插值或者其他的两点插值法解决。

吃书的老虎 发表于 2008-11-26 15:18

如果你仅仅就是用端点来作为极值点话,在求包络线时,在同一个点有极大值包络线和极小值包络线,如果是左端点,那么你是极大值还是极小值,如果是极大值,那么端点对应的极小值包络线怎么求?

cleverblue 发表于 2008-11-26 17:04

用这个方法是不用求包络,可以直接用其他的方法求的中值的顶点就可以直接插值拟合了

吃书的老虎 发表于 2008-11-27 12:33

呵呵,你知道有什么样的方法吗?

cleverblue 发表于 2008-11-27 21:05

= extr(x);
indser = ;% 合并极值
indser = sort(indser);   % 排序(从小到大)
% 把端点作为极值处理
if indser(1) > 1
indser = ;
end
if indser(end) < Len
indser = ;
end
在用移动平均或者其他的方法求中直和地址就可以,详细的可以参看相关的论文,有这种算法

cleverblue 发表于 2008-12-2 17:20

这是用正弦插值的一个例子,程序还可以改进,把精度提得更高,希望这个程序是抛砖引玉,给大家提供更多的帮助和想法,完善算法。呵呵

clc
clear
close all
for i=1:80
   x(i) = sin(pi*i*0.08);
   v(i) = pi*i*0.08;
end
hold on
plot(x)
Len=length(x);
= extr(x);
indser = ;% 合并极值
indser = sort(indser);   % 排序(从小到大)
% 把端点作为极值处理
if indser(1) > 1
indser = ;
end
if indser(end) < Len
indser = ;
end
a=x(indser);
b=v(indser);
plot(indser,a,'r')
x1 = x;

y=a;
x=indser;
len = length(x);
k = 1;
% 对左边端点的处理
m = x(2)-x(1);
ya(1) = asin(y(1));
ya(2) = asin(y(2));
h = (ya(2)-ya(1))/m;
delta = ya(1);
for i = 0:m
z(k) = sin(delta);
delta = delta + h;
k = k + 1;
end
k = k - 1;
% 对中间的点处理
for i = 3:len-1
    m =x(i)-x(i-1);
    h = (y(i-1)-y(i))/2;
    delta = 4/(m);
    for i = 0:delta:4
      z(k) = h*sin(pi/4*i+pi/2);
      k = k+1;
    end
    k = k - 1;
end
% 对右边端点的处理
m = x(end)-x(end-1);
ya(1) = asin(y(end-1));
ya(2) = asin(y(end));
h = (ya(2)-ya(1))/m;
delta = ya(1);
for i = 0:m
z(k) = sin(delta);
delta = delta + h;
k = k + 1;
end
% -----------------
plot(z,'g')
hold off

rzhj1989 发表于 2013-5-9 09:50

学习一下,非常感谢
页: [1]
查看完整版本: 关于用正弦插值法解决emd的端点拓延问题和端点效应问题