类EMD的“信号分解方法”及MATLAB实现(第五篇)——ICEEMDAN

2024-01-19 03:59

本文主要是介绍类EMD的“信号分解方法”及MATLAB实现(第五篇)——ICEEMDAN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

继续完善“类EMD”方法系列,本篇是继EEMD、CEEMD、CEEMDAN、VMD后的第5篇,想要看前几种方法的点击链接可以跳转。

ICEEMDAN(Improved complete ensemble EMD)是2014年被提出的[1],它是对CEEMDAN方法的改进算法。方法名字随着方法更新越来越长,颇有手机命名的风范。

1. ICEEMDAN(改进的自适应噪声完备集合经验模态分解)的概念

据算法提出者Colominas的说法,ICEEMDAN的主要目的是解决CEEMDAN中残留噪声和伪模态的问题。

虽然只多了一个字母“I”,但是两个方法的思路却颇不相同。

有时候看起来复杂的算式是为了简洁,这里我们按照原文[1]中的思路引入两个算子:

(1)算子 E_{j}(\cdot ) ,代表求一个信号EMD分解的第j个IMF分量。

(2)算子 M(\cdot ) ,代表求信号的局部均值。这里的局部均值是什么含义呢,在讲EMD分解的时候我们提到过,我们在EMD分解的过程中是不断地(1)求信号的上下包络线均值→(2)原始信号减掉均值包络线→(3)反复迭代直至信号满足两个约束条件,此时就得到了一个IMF分量,而局部均值指的就是“原始信号减去此IMF得到的部分”。

 

搞明白这两个算子之后,那就把原文章里的流程图贴上来了:

针对上图再补充两点说明:

(1)上图中的 w^{(i)}[n] 指的是加入的第i组高斯白噪声,所以在每轮求IMF过程中,所加入的噪声信号都是原始噪声信号的IMF分量。

(2)上图中的 \varepsilon _{j} 指的是加入噪声分量时所乘的系数,该系数代表的是加速噪声的信噪比与该噪声分量标准差之比。换句话说,  代表的是第i组高斯白噪声的第k个分量,乘以添加噪声相对于原信号的信噪比,再除以这组高斯白噪声的标准差。其中添加噪声相对于原信号的信噪比将是ICEEMDAN程序的入口参数之一,另外还有一个入口参数就是总共添加的白噪声组数。

相对于CEEMDAN方法以及之间介绍的几种算法,ICEEMDAN的主要优势在于更少的伪模态。论文中举了一个例子作为对比:

从左到右分别是EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN,可以看出ICEEMDAN方法确实减少了很多不必要的分量。

2. ICEEMDAN的编程实现

下面我们自己编程实现并验证一下。

该方法的原始代码网上可以找到[2],不过鉴于专栏前期将“类EMD”方法的代码做了统一格式的封装,提升了调用格式的延续性和代码易用性,实现便捷画图,所以这次也对ICEEMDAN的代码做了类似处理。封装后的函数有两个。

测试信号同样使用前两篇文章中的正弦信号与间断性高频脉冲合成的信号: 

%% 1.生成仿真信号
fs = 400;  %采样频率
t = 0:1/fs:0.75; %时间轴
x = sin(2*pi*4*t); %低频正弦信号
y = 0.5*sin(2*pi*120*t); %高频正弦信号
for i = 1:length(t) %将高频信号处理成间断性if mod(t(i),0.25)>0.11&&mod(t(i),0.25)<0.12elsey(i) = 0;end
end
sig = x+y; %信号叠加
figure('color','white')
plot(t,sig,'k') %绘制原始信号

待分析的信号

(一)时域分解图

画ICEEMDAN分解图的函数介绍如下:

function imf = pICEEMDAN(data,FsOrT,Nstd,NE,MaxIter)
% 画信号ICEEMDAN分解图
% 输入:
% data为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% MaxIter:最大迭代次数
% 输出:
% imf为经ICEEMDAN分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pICEEMDAN(data,fs,0.2,100);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pICEEMDAN(data,t,0.2,100);

应用上边的函数,画出的图是这样的:

ICEEMDAN分解结果

对比一下,下图是之前介绍CEEMDAN文章中使用同样的测试信号得到的分解图:

CEEMDAN分解结果

可见使用ICEEMDAN方法确实很大程度上减少了伪模态。

(二)时域分解图及对应频谱图

画ICEEMDAN分解图及对应频谱图的函数介绍如下:

function imf = pICEEMDANandFFT(y,FsOrT,Nstd,NE,MaxIter)
% 画信号ICEEMDAN分解与各IMF分量频谱对照图
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% MaxIter:最大迭代次数
% 输出:
% imf为经ICEEMDAN分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pICEEMDANandFFT(y,fs,0.2,100);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pICEEMDANandFFT(y,t,0.2,100);

画出的图是这样的:

上边的测试代码和封装函数,包括工具箱都可以在下述连接获取:

ICEEMDAN画图工具(公开版) | 工具箱文档

EMD、EEMD、CEEMD、CEEMDAN、VMD以及HHT相关的程序也有,编程不易,感谢支持~关于EMD、EEMD、CEEMD、VMD和HHT的相关介绍可以看这里:

Mr.看海:这篇文章能让你明白经验模态分解(EMD)——EMD在MATLAB中的实现方法

Mr.看海:希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD

Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD

Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN

Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第四篇)——VMD

参考

  1. ^abColominas M A , Schlotthauer G , Torres M E . Improved complete ensemble EMD: A suitable tool for biomedical signal processing[J]. Biomedical Signal Processing & Control, 2014, 14(nov.):19-29.
  2. ^http://bioingenieria.edu.ar/grupos/ldnlys/metorres/re_inter.htm

这篇关于类EMD的“信号分解方法”及MATLAB实现(第五篇)——ICEEMDAN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621195

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q