当前位置:网站首页>MATLAB 的ICEEMDAN分解代码实现
MATLAB 的ICEEMDAN分解代码实现
2022-08-04 05:34:00 【机器猫001】
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: [email protected]
%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;
上述代码可以直接运行,实现信号分解。
边栏推荐
猜你喜欢
随机推荐
冰歇webshell初探
DropBlock: 卷积层的正则化方法及复现代码
关于网络安全行业你知道多少?
Shell基础
win10下mediasoup搭建过程中的一些坑记录
复杂格式的json转递
golang rtsp拉流测试
用chrome dev tools 强制js注入
桌面右键的NVIDIA去除与恢复
Prematurely reached end of stream
av_read_frame 阻塞,基于回调的解决办法
狗都能看懂的变化检测网络Siam-NestedUNet讲解——解决工业检测的痛点
数据库:整理四个实用的SQLServer脚本函数
ZYNQ之FPGA LED 灯闪烁实验
SegNet——论文笔记
【HIT-SC-LAB1】哈工大2022软件构造 实验1
QT 出现多冲定义问题
CMDB 腾讯云部分实现
调用时序错误导致webrtc无法建立链接
SENet详解及Keras复现代码