类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

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?