matlab中emd未定义,EMD的Matlab程序

emd.m文件

function imf = emd(x)

% Empiricial Mode Decomposition (Hilbert-Huang Transform)

% EMD分解或HHT变换

% 返回值为cell类型,依次为一次IMF、二次IMF、...、最后残差

x   = transpose(x(:));            %将x转置为行矩阵

imf = [];

while ~ismonotonic(x)            %当x(残余函数)不是单调函数时,分解终止条件

x1 = x;

sd = Inf;

while (sd > 0.1) || ~isimf(x1)    %当标准偏差系数sd大于0.1或X1不是固有模态函数时,

分量终止条件(类柯西收敛准则:当sd介于0.2—0.3之

间时,筛选过程停止)

s1 = getspline(x1);        % 极大值点样条曲线

s2 = -getspline(-x1);       % 极小值点样条曲线

x2 = x1-(s1+s2)/2;        %h(t)=x(t)-m(t)其中m(t)为包络线的平均值

sd = sum((x1-x2).^2)/sum(x1.^2);  %筛选停止准则

x1 = x2;  %x2即h(t)

end

imf{end+1} = x1;                  %n=n+1   Cn=h(t),得imf分量

x = x-x1;                         %r=x(t)-Cn

end

imf{end+1} = x;

% 是否单调

function u = ismonotonic(x)            %判断单调性函数

u1 = length(findpeaks(x))*length(findpeaks(-x));

if u1 > 0

u = 0;                           %u = 0表示x不是单调函数

else

u = 1;                           %u =1表示x是单调函数

end

% 是否IMF分量

function u = isimf(x)                  %判断是否为固有模态函数

N  = length(x);

u1 = sum(x(1:N-1).*x(2:N) < 0);         % 过零点的个数

u2 = length(findpeaks(x))+length(findpeaks(-x));    % 极值点的个数

if abs(u1-u2) > 1   %imf条件:(1)过零点数量与极值点数量必须相等或最多相差不能多于

一个。

(2)极大值、极小值包络均值为零u(t)+m(t)=0

u = 0;                   %u=0表示x不是固有模态函数

else

u = 1;                   %u=1表示x是固有模态函数

end

% 据极大值点构造样条曲线

function s = getspline(x)       %三次样条函数拟合成数据包络线

N = length(x);

p = findpeaks(x);

s = spline([0 p N+1],[0 x(p) 0],1:N);  %yy=spline[X,Y,xx]用三次样条的方法得到yy

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值