MATLAB 的ICEEMDAN分解代码实现

0、前言

        本文讲解ICEEMDAN分解方法,并分享代码。

1、ICEEMDAN实现

         下面为主函数部分:


ecg=data;%data为待分解的一个信号数据,请替换为自己数据就行
%% 参数设置
Nstd = 0.2;
NR = 1;
MaxIter = 5000;
%% ICEEMDAN
[modes]=iceemdan(ecg,Nstd,NR,MaxIter,1);%iceemdan
modes=modes';
t=1:length(ecg);
[a b]=size(modes);
figure;
subplot(a+1,1,1);
plot(t,ecg);% the ECG signal is in the first row of the subplot
ylabel('original')
set(gca,'xtick',[])
title('ICEEMDAN')
axis tight;

for i=2:a
    subplot(a+1,1,i);
    plot(t,modes(i-1,:));
    ylabel (['IMF ' num2str(i-1)]);
    set(gca,'xtick',[])
    xlim([1 length(ecg)])
end

subplot(a+1,1,a+1)
plot(t,modes(a,:))
ylabel(['IMF ' num2str(a)])
xlim([1 length(ecg)])
xlabel('样本点')

 子函数iceemdan的代码:

function [modes]=iceemdan(x,Nstd,NR,MaxIter,SNRFlag)
% The current is an improved version, introduced in:

%[1] Colominas MA, Schlotthauer G, Torres ME. "Improve complete ensemble EMD: A suitable tool for biomedical signal processing" 
%       Biomedical Signal Processing and Control vol. 14 pp. 19-29 (2014)

%The CEEMDAN algorithm was first introduced at ICASSP 2011, Prague, Czech Republic

%The authors will be thankful if the users of this code reference the work
%where the algorithm was first presented:

%[2] Torres ME, Colominas MA, Schlotthauer G, Flandrin P. "A Complete Ensemble Empirical Mode Decomposition with Adaptive Noise"
%       Proc. 36th Int. Conf. on Acoustics, Speech and Signa Processing ICASSP 2011 (May 22-27, Prague, Czech Republic)

%Author: Marcelo A. Colominas
%contact: macolominas@bioingenieria.edu.ar
%Last version: 25 feb 2015
desvio_x=std(x);
x=x/desvio_x;
[a,b]=size(x);
temp=zeros(b,1);
 modes=zeros(b,1);
 aux=zeros(a,b);
for i=1:NR
    white_noise{i}=randn(size(x));%creates the noise realizations
end;

for i=1:NR
    modes_white_noise{i}=emd(white_noise{i},'display',0);%calculates the modes of white gaussian noise
end;
% save interval modes_white_noise
for i=1:NR %calculates the first mode
    xi=x+Nstd*modes_white_noise{i}(:,1)'/std(modes_white_noise{i}(:,1));
    [temp, o, it]=emd(xi,'MaxNumIMF',1,'SiftMaxIterations',MaxIter,'display',0);
    aux=aux+(xi-temp')/NR;% nnnnnnnnnnnnnnnnJub局部包络
end;

modes= (x-aux)'; %saves the first mode
medias = aux; %  r1
k=1;
aux=zeros(a,b);
es_imf = min(size(emd(medias(1,:),'SiftMaxIterations',MaxIter,'display',0)));

while es_imf>1 %calculates the rest of the modes
    for i=1:NR
        tamanio=size(modes_white_noise{i});
        if tamanio(2)>=k+1
            noise=modes_white_noise{i}(:,k+1);
            if SNRFlag == 2
                noise=noise/std(noise); %adjust the std of the noise
            end;
            noise=Nstd*noise;
            try
                [temp,o,it]=emd(medias(1,:)+std(medias(1,:))*noise','MaxNumIMF',1,'SiftMaxIterations',MaxIter,'display',0);
            catch    
                temp=emd(medias(1,:)+std(medias(1,:))*noise','MaxNumIMF',1,'SiftMaxIterations',MaxIter,'display',0);
            end;
        else
            try
                [temp, o, it]=emd(medias(1,:),'MaxNumIMF',1,'SiftMaxIterations',MaxIter,'display',0);
            catch
                temp=emd(medias(1,:),'MaxNumIMF',1,'SiftMaxIterations',MaxIter,'display',0);
            end;
        end;
        aux=aux+(medias(1,:)+std(medias(1,:))*noise'-temp')/NR;% r2 r3 r...
    end;
    modes=[modes (medias(1,:)-aux)'];
    medias = aux;
    aux=zeros(size(x));
    k=k+1;
    es_imf = min(size(emd(medias(1,:),'SiftMaxIterations',MaxIter,'display',0)));
end;
modes = [modes (medias(1,:))'];
modes=modes*desvio_x;

        上述代码可以直接运行,实现信号分解。

  • 19
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 40
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值