“类EMD”分解7合1画图工具(python)

最后更新于:2024-10-26 20:43:55

这是在python环境下进行EMD,EEMD,CEEMD,CEEMDAN,ICEEMDAN,EWT,VMD这7种模态分解方法的合集。

可以快速实现模态分解、分解图绘制、分解及频谱图绘制

该程序是MATLAB实现类EMD分解7合1画图工具的姊妹篇,两者实现的功能大体一致

代码提供了不同模态分解方法的演示案例。

同学们需要做的基本只需要替换掉需要分解的数据即可,非常简单易用。

致力于实现优质、易用的程序,帮助研究人员快速实现目的

一、代码运行环境

已测试python3.9,理论上其他python3.X可以使用,python2.X不能使用(试用版代码需要使用python3.11

依赖包包括:PyEMD、numpy、Matplotlib、ewtpy

在运行程序前,请确保在当前python环境下安装了上述包,命令行的安装指令为:

pip install EMD-signal
pip install numpy
pip install Matplotlib
pip install ewtpy

二、程序介绍

程序文件
1.demoEMD.py

用于测试”类EMD”分解功能的脚本文件,可以直接运行,其中调用了pEMDs和pEMDsandFFT。其中演示了使用EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN、EWT和VMD等7种”类EMD”方法对输入信号进行分解,并绘制分解图(包括二维和三维)、重构误差图和分解结果及其频谱图。

运行该文件,将绘制以下图片(以EMD分解为例,实际每种分解方法都会绘制图片):

EMD分解图,绘制各个IMF分量

EMD分解及对应频谱图

EMD分解重构误差

另外在命令行窗口将会打印各种算法的运行时间:

2.funEMDs.py(试用版代码中为funEMDs.pyd)

集合了kEMDs、pEMDs、pEMDsandFFT等方法,具体实现PyEMDs函数调用实现分解以及画图等功能。

这几种方法介绍如下:

kEMDs:整合版”类EMD”分解函数,调用该函数会执行分解,不画图。该文件为函数文件,可以调用,不可以直接运行。该函数文件在pEMDs和pEMDsandFFT文件中调用。这个文件中实现了7种”类EMD”信号分解方法(EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN、EWT、VMD)的封装,属于偏底层的函数。

pEMDs整合版”类EMD”分解函数,调用该函数将会分解并画图(模态分解图,无频谱),会绘制重构误差图。该文件为函数文件,可以调用,不能直接运行。

pEMDsandFFT具体包含的方法有:绘制信号模态分解与各IMF分量频谱对照图,也会绘制重构误差图。

def kEMDs(data, FsOrT, methodSel, options=None):
    """
    使用选定的信号分解方法对数据进行分解。
    
    参数:
    - data: 要分解的一维数据。
    - FsOrT: 采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
    - methodSel: 选择的分解方法,可选值为'EMD','EEMD','CEEMD','CEEMDAN','ICEEMDAN','EWT','VMD'。
    - options: 一个包含分解方法特定选项的字典。
                - 'MaxNumIMFs':最大的IMF数量,在EMD和EWT中可选设置,这个数量中包含趋势项
                - 'Nstd': 附加噪声标准差与数据标准差之比,默认为0.2。
                - 'NE': 对信号的平均次数,默认为100。
                - 'MaxIter': 最大迭代次数,默认为1000。
                - 'MaxNumIMFs': 最大的IMF数量,在EMD和EWT中可选设置,默认为None。
                - 'alpha': 惩罚因子,在VMD中设置,默认值为2000。
                - 'K': 指定分解模态数,仅在VMD中可设置。
                - 'tol': 收敛容差,在VMD中设置,是优化的停止准则之一,可以取1e-6~5e-6。
    返回值:
    - imf: 分解后的本征模态函数(IMF),统一为n*m格式,其中n为模态数,m为数据点数。例如 imf(1,:)即IMF1,imf(end,:)即为残差。
      注意,调用该函数得到的imf,其排列均是从高频向低频排列,这也是为了方便大家研究使用而保持了统一
    - elapsedTime: 分解过程的运行时间。
    - reconError: 重构误差。
    """
def pEMDs(data, FsOrT, methodSel, options=None):
    """
    整合版"类EMD"分解函数,调用该函数将会分解并画图(模态分解图,无频谱),会绘制重构误差图。
    
    参数:
    - data: 待分解的一维数据。
    - FsOrT: 采样频率或采样时间向量。如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与data相同长度的一维向量。如果未知采样频率,可设置为1。
    - methodSel: 选择分解方法,可选值为'EMD','EEMD','CEEMD','CEEMDAN','ICEEMDAN','EWT','VMD'。
    - options: 一个包含其他可设置参数的字典。对于不同分解方法,需要设置的参数有所不同。
      - 'Nstd': 附加噪声标准差与数据标准差之比,默认为0.2。
      - 'NE': 对信号的平均次数,默认为100。
      - 'MaxIter': 最大迭代次数,默认为1000。
      - 'MaxNumIMFs': 最大的IMF数量,在EMD和EWT中可选设置,默认为None。
      - 'alpha': 惩罚因子,在VMD中设置,默认值为2000。
      - 'K': 指定分解模态数,仅在VMD中可设置。
      - 'tol': 收敛容差,在VMD中设置,是优化的停止准则之一,可以取1e-6~5e-6。
    
    返回值:
    - imf: 内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如imf[0,:]即IMF1,imf[-1,:]即为残差。注意,调用该函数得到的imf,其排列均是从高频向低频排列,这也是为了方便大家研究使用而保持了统一。
    - elapsedTime: 程序运行时间,单位为秒。
    - reconError: 重构误差。
    """
def pEMDsandFFT(data, FsOrT, methodSel, options=None):
    """
    整合版"类EMD"分解函数,调用该函数将会分解并画图(模态分解图与各IMF分量频谱对照图),会绘制重构误差图。
    
    参数:
    - data: 待分解的一维数据。
    - FsOrT: 采样频率或采样时间向量。如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与data相同长度的一维向量。如果未知采样频率,可设置为1。
    - methodSel: 选择分解方法,可选值为'EMD','EEMD','CEEMD','CEEMDAN','ICEEMDAN','EWT','VMD'。
    - options: 一个包含其他可设置参数的字典。对于不同分解方法,需要设置的参数有所不同。
      - 'Nstd': 附加噪声标准差与数据标准差之比,默认为0.2。
      - 'NE': 对信号的平均次数,默认为100。
      - 'MaxIter': 最大迭代次数,默认为1000。
      - 'MaxNumIMFs': 最大的IMF数量,在EMD和EWT中可选设置,默认为None。
      - 'alpha': 惩罚因子,在VMD中设置,默认值为2000。
      - 'K': 指定分解模态数,仅在VMD中可设置。
      - 'tol': 收敛容差,在VMD中设置,是优化的停止准则之一,可以取1e-6~5e-6。
    
    返回值:
    - imf: 内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如imf[0,:]即IMF1,imf[-1,:]即为残差。注意,调用该函数得到的imf,其排列均是从高频向低频排列,这也是为了方便大家研究使用而保持了统一。
    - elapsedTime: 程序运行时间,单位为秒。
    - reconError: 重构误差。
    """

三、快速开始

0.安装相关包

在命令行执行以下指令,安装对应的工具包。

pip install EMD-signal
pip install numpy
pip install Matplotlib
pip install ewtpy

1.运行测试脚本

先在python的编辑器(例如vscode)里打开下载好的文件夹,然后运行demoEMDs.py程序,程序运行完毕后如果没报错,且正常画出分解图像,则说明运行环境正常,程序正确。

2.修改仿真数据/导入数据

复制一个demoEMDs.py的文件副本,在这个副本里做如下修改:

(1)第一种情况,你可能想要对你自己要研究的仿真数据进行模态分解测试,此时你需要对 demoEMDs.py 脚本文件中的第1小节内容进行修改替换即可。需要注意的是,请最好保持变量名的一致,即将待分解信号命名为data,采样频率或者时间轴命名为FsOrT。此时数据替换完成。

(2)第二种情况,你可能是想对一段真实采集的数据进行模态分解,此时需要根据你的文件类型的不同(excel,txt,csv等),将数据导入python的方法有所不同。导入完成后请将这个待分解信号命名为data

3.保留你需要的分解方法,并设置参数

demoEMDs.py中演示了七种方法的分解案例,你可以删掉不需要的分解方法,只保留你需要的部分即可。而相关参数设置,大家可以参照案例中的写法设置。

上述替换过程大家有不清楚的,请参考视频。

4.运行程序

此时运行程序即可。

四、关于完整版与公开版代码

功能完整版公开版
绘制类EMD分解图、绘制类EMD分解图及其频谱图、重构误差图
软件全部源码(函数py文件)×
可导出分解结果imf、重构误差值×
绘图无水印×
可分析数据长度无限制1000个点以内

五、获取公开版程序(需使用电脑浏览器打开)

类EMD分解7合1公开版python代码

试用版代码需要使用python3.11

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

获取通道一(淘宝):点击此处获取完整版程序

获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需91.5元)。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 91.5元 才能查看此处内容!立即支付

七、完整版代码重要更新

20240729 完成初版代码

八、常见问题

问题1:VMD中参数K和分解出来的数量是什么关系?

回答1:K的值等于IMF数量加1,也就是如果设置K=4,则会分解出3个IMF分量和1个趋势项res。

问题2:VMD中K的数值应该怎样选取?

回答2:对于K的取值,可以通过一些评价指标来进行评估,综合研判取值。比如使用中心频率判断、使用相关系数判断、使用峭度值判断等,不过没有放之四海而皆准的方法。在使用VMD算法进行信号分解时,需要综合考虑信号的特性、应用需求和实际效果等因素,来确定k的取值,最简单的方法就是参考研究领域相关论文的常用方法。

问题3:除了VMD,其他分解方法可以设置分解得到的imf的数量吗?

在网站现有的“类EMD”分解方法中,只有VMD分解是可以指定imf数的;EMD和EWT可以设置分解数量上限,比如上限设置为5,分解出来的结果可能是5个分量,或者小于5个;其他的分解方法的分解数量均是自适应的,无法指定。

问题4:参数NE、Nstd、MaxIter该怎么设置?

NE: 噪声系数的数量。这是一个整数,代表生成噪声实例的次数。增加NE可以改善结果的一致性,但会增加计算时间。一般来说,NE的设置可以在50到100之间,具体可以根据你的数据和计算能力进行调整。

Nstd: 噪声标准差。这是一个浮点数,它定义了添加到信号中的噪声的标准偏差。通常,Nstd的值设置在0.1到0.2之间,它会影响到信号分解的精度。设置过高可能会引入太多噪声,过低则可能对噪声的效果不够。

MaxIter: 最大迭代次数。这是在执行经验模式分解过程中,每个模式(IMF)最大允许的迭代次数。如果迭代次数过少,可能无法得到一个好的IMF,如果过多,可能会导致计算时间过长。一般情况下,MaxIter的值可以设置在100到1000之间,具体取决于你的数据的复杂性和计算能力。

问题5:为什么使用python和MATLAB做出的分解结果不相同?

虽然EMD分解的原理是相对明确的,但是在具体的编程实现的过程中还涉及很多具体计算过程,比如包络的求取、停止准则的选定等等,其中参数或者计算方式的变化都会影响到最终结果,MATLAB和python的EMD实现是两个不同的库,在这些细节之处难免存在差异(即使都是用在MATLAB上的官方库和第三方库之间都会有差异),所以使用python和MATLAB进行EMD分解得到的结果不同是正常现象。

在试用版代码中可以使用但是看不到源码,在完整版代码中可以看到全部源码。

问题6:提示No module named ‘PyEMD’,即使安装EMD-signal包后,from pyemd import EMD依旧失败

解决方法:

1.首先在终端运行:

pip uninstall PyEMD
pip uninstall EMD-signal

2.然后运行:
pip install EMD-signal

即可解决。

问题7,报错提示np.find_common_type was removed in the NumPy 2.0 release. 如下图

解决方法:

在109行的EMD处右键,点击Go to Definition

在跳转打开的EMD.py文件中,找到第768行,将该行注释掉,并在下行输入:

dtype = np.promote_types(x.dtype, y.dtype)

修改后如下图:

此时再运行demoEMDs.py就不会报错了。