PyEMD
链接
- 在线文档:https://pyemd.readthedocs.org
- 问题追踪:https://github.com/laszukdawid/pyemd/issues
- 源代码仓库:https://github.com/laszukdawid/pyemd
简介
经验模态分解(EMD)的Python实现。该软件包包含多种EMD变体,并计划在未来提供更多。
EMD变体
- 集成EMD(EEMD)
- "完全集成EMD"(CEEMDAN)
- 原始EMD的不同设置和配置
- 图像分解(EMD2D和BEMD)(实验性,不提供支持)
- 即时编译EMD(JitEMD)
PyEMD允许您使用不同的样条曲线进行包络线插值,以及不同的停止准则和极值插值方法。
可用的样条曲线
- 自然三次样条(默认)
- 点wise三次样条
- 埃尔米特三次样条
- Akima样条
- PChip样条
- 线性样条
可用的停止准则
- 柯西收敛准则(默认)
- 固定迭代次数
- 连续原型IMF的数量
极值检测
- 离散极值(默认)
- 抛物线插值
安装
PyPi(推荐)
安装软件包最快的方法是通过pip
。
$ pip install EMD-signal
这样您就可以安装PyEMD在PyPi上托管的最新稳定版本
从源代码安装
如果您只想使用EMD及其变体,通过pip
安装PyEMD是最好的方法。
但是,如果您想要PyEMD的最新版本,或者出于某种原因想要下载代码并自己构建软件包,也可以这样做。
源代码是公开的,托管在GitHub上。
要下载代码,您可以进入源代码页面并点击Code -> Download ZIP
,或使用git命令行
$ git clone https://github.com/laszukdawid/PyEMD
从源代码安装软件包使用以下命令行:
$ python3 -m pip install .
在进入由git
创建的PyEMD目录后执行此命令。
从源代码安装PyEMD的更快方法是在同一命令中使用pip
和git
:
$ python3 -m pip install git+https://github.com/laszukdawid/PyEMD.git
注意,这将在当前环境中安装它。如果您在处理多个项目,或与他人共享资源,我们建议使用虚拟环境。
如果您想使安装可编辑,请使用pip的-e
标志
示例
更详细的示例包含在文档中或 PyEMD/examples目录中。
EMD
在大多数情况下,默认设置就足够了。只需导入EMD
并将您的信号传递给实例或emd()
方法。
from PyEMD import EMD
import numpy as np
s = np.random.random(100)
emd = EMD()
IMFs = emd(s)
下图是使用以下输入生成的: $S(t) = cos(22 \pi t^2) + 6t^2$
EEMD
使用集成EMD(EEMD)最简单的方法是导入EEMD
并将您的信号传递给实例或eemd()
方法。
Windows:请不要跳过if __name__ == "__main__"
部分。
from PyEMD import EEMD
import numpy as np
if __name__ == "__main__":
s = np.random.random(100)
eemd = EEMD()
eIMFs = eemd(s)
CEEMDAN
与前面的方法一样,使用CEEMDAN
也有一种简单的方法。
Windows:请不要跳过if __name__ == "__main__"
部分。
from PyEMD import CEEMDAN
import numpy as np
if __name__ == "__main__":
s = np.random.random(100)
ceemdan = CEEMDAN()
cIMFs = ceemdan(s)
可视化
该软件包包含一个简单的可视化辅助工具,可以帮助您,例如,处理时间序列和瞬时频率。
import numpy as np
from PyEMD import EMD, Visualisation
t = np.arange(0, 3, 0.01)
S = np.sin(13*t + 0.2*t**1.4) - np.cos(3*t)
# 提取内在模态函数(IMF)和残余
# 对于EMD
emd = EMD()
emd.emd(S)
imfs, res = emd.get_imfs_and_residue()
# 一般情况:
#components = EEMD()(S)
#imfs, res = components[:-1], components[-1]
vis = Visualisation()
vis.plot_imfs(imfs=imfs, residue=res, t=t, include_residue=True)
vis.plot_instant_freq(t, imfs=imfs)
vis.show()
实验性功能
JitEMD
即时(JIT)编译的EMD是EMD的一个版本,它在处理非常大的信号或多次重复使用同一实例时表现出色。强烈建议在使用Jupyter笔记本进行实验时使用它,特别是在修改输入而不是方法本身时。
JIT的问题在于编译发生在第一次执行时,这可能会耗费大量时间。对于小型信号或只执行一次分解,额外的编译时间将明显大于分解时间,从而降低性能。
更多信息请参阅文档或示例了解如何使用代码。 这是实验性的,因为它的价值仍有待商榷,而且作者(我)并不精通JIT优化,所以可能会出现错误。
欢迎任何反馈。如果有兴趣,我很乐意改进。请提交问题单提出问题和建议。
要在PyEMD中启用JIT,请使用jit
选项安装,即
$ pip install EMD-signal[jit]
EMD2D/BEMD
遗憾的是,这是实验性的,我们不能保证输出是有意义的。
最简单的用法是将图像作为单色numpy 2D数组传递。与其他模块一样,可以使用实例的默认设置,或者更明确地使用emd2d()
方法。
from PyEMD.EMD2d import EMD2D #, BEMD
import numpy as np
x, y = np.arange(128), np.arange(128).reshape((-1,1))
img = np.sin(0.1*x)*np.cos(0.2*y)
emd2d = EMD2D() # BEMD()也可以
IMFs_2D = emd2d(img)
常见问题
为什么EEMD/CEEMDAN这么慢?
不幸的是,这是它们的本质。它们每次都执行多次EMD,每次都稍微修改版本。添加的噪声可能会导致许多极值的产生,这将降低自然三次样条的性能。关于如何解决这个问题的一些技巧,请参阅文档中的加速技巧。
联系方式
如果你有任何问题、请求或只是想打个招呼,请随时联系我。 知道我帮助了某人或使他们的工作变得更容易总是很高兴的。 对项目做出贡献也是可以接受的,并且非常欢迎。
引用
如果你发现这个包很有用,并想在你的工作中引用它, 请使用以下结构:
@misc{pyemd,
author = {Laszuk, Dawid},
title = {Python implementation of Empirical Mode Decomposition algorithm},
year = {2017},
publisher = {GitHub},
journal = {GitHub Repository},
howpublished = {\url{https://github.com/laszukdawid/PyEMD}},
doi = {10.5281/zenodo.5459184}
}