关于用正弦插值法解决emd的端点拓延问题和端点效应问题
要解决emd的各种问题,第一个是解决端点拓延问题,如果有端点拓延,免不了会出现误差,而且对未知的信号不能用理论来解释。我的方法是先计算出信号的各个极值点,然后将前后两个端点也作为极值,最后用两个端点间插值的办法使信号平滑,解决插值的问题就是要抛弃三点或更多点插值在emd中的应用,必须使用两点插值的方法。这个方法可以选择正弦插值或者其他的两点插值法解决。 如果你仅仅就是用端点来作为极值点话,在求包络线时,在同一个点有极大值包络线和极小值包络线,如果是左端点,那么你是极大值还是极小值,如果是极大值,那么端点对应的极小值包络线怎么求? 用这个方法是不用求包络,可以直接用其他的方法求的中值的顶点就可以直接插值拟合了 呵呵,你知道有什么样的方法吗? = extr(x);indser = ;% 合并极值
indser = sort(indser); % 排序(从小到大)
% 把端点作为极值处理
if indser(1) > 1
indser = ;
end
if indser(end) < Len
indser = ;
end
在用移动平均或者其他的方法求中直和地址就可以,详细的可以参看相关的论文,有这种算法 这是用正弦插值的一个例子,程序还可以改进,把精度提得更高,希望这个程序是抛砖引玉,给大家提供更多的帮助和想法,完善算法。呵呵
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 学习一下,非常感谢
页:
[1]