其中ξ(t)就是原始信号,IMFi就是K个固有模态函数。rK就是原始信号减完IMF后剩下的余项。
下面是求解EMD算法的Matlab源程序,特此声明,本程序为我本人在网上找到的,除了注释外,其他版权皆归属原作者,由于不清楚原作者是谁,未能标出,如果侵犯权利,请联系我删除源码。
%非主函数,被调用
function n = findpeaks(x)%用于寻找极值点,该函数只会求极大值
% Find peaks.
% n = findpeaks(x)
n = find(diff(diff(x)>0)<0);%一阶导数大于0二阶导数小于0的点
u = find(x(n+1)>x(n));
n(u) = n(u) + 1;
end
%非主函数,被调用<br>%判断x是否单调,返回0代表不是单调,返回1代表是单调
function u = ismonotonic(x)
u1 = length(findpeaks(x))*length(findpeaks(-x));%如果最大/最小值有一个为0即可判断程序满足退出条件了
if u1 > 0
u = 0;
else
u = 1;
end
end
%非主函数,被调用。判断当前x是不是真IMF
function u = isimf(x)
N = length(x);
u1 = sum(x(1:N-1).*x(2:N) < 0);%求x与y=0轴交点的个数
u2 = length(findpeaks(x))+length(findpeaks(-x));%求极值点个数
if abs(u1-u2) > 1
u = 0;
else
u = 1;
end
end
%非主函数,被调用,作用是获得x的包络线
function s = getspline(x)
N = length(x);
p = findpeaks(x);
s = spline([0 p N+1],[0 x(p) 0],1:N);
end
%主函数
function imf = emd(x)
% Empiricial Mode Decomposition (Hilbert-Huang Transform)
% imf = emd(x)
% Func : findpeaks
x = transpose(x(:));
imf = [];
while ~ismonotonic(x)
x1 = x;
sd = Inf;
while (sd > 0.1) || ~isimf(x1)
s1 = getspline(x1);
s2 = -getspline(-x1);
x2 = x1-(s1+s2)/2;
sd = sum((x1-x2).^2)/sum(x1.^2);
x1 = x2;
end
imf(end+1,:) = x1;
x = x-x1;
end
imf(end+1,:) = x;
end
Section IV Hilbert算法的介绍
在上一章中,我们介绍了EMD算法,在这一部分中,我会介绍Hilbert算法,这一节有些许数学趣味,对数学趣味不感兴趣的直接跳到应用部分。