经验模态分解(Empirical Mode Decomposition,缩写EMD)是由黄锷(N. E. Huang)在美国国家宇航局与其他人于1998年创造性地提出的一种新型自适应信号时频处理方法,特别适用于非线性非平稳信号的分析处理。
EMD 方法在理论上可以应用于任何类型的信号的分解, 因而在处理非平稳及非线性数据上,具有非常明显的优势,适合于分析非线性、非平稳信号序列,具有很高的信噪比。所以,EMD方法一经提出就在不同的工程领域得到了迅速有效的应用,例如用在海洋、大气、天体观测资料与地震记录分析、机械故障诊断、密频动力系统的阻尼识别以及大型土木工程结构的模态参数识别方面。
如下图所示,最前面的黑线就是所有正弦波叠加的综合,在处理一些非线性变化的时间序列的时候经常需要把这些信号剥离出来,让这些信号更加明显,才能更好地看透这些信号的本质。
EMD的基本思想是将一个频率不规则的波化为多个单一频率的波+残波的形式。
需要PyEMD这个库(github网址),可直接用pip命令/conda命令下载
conda install PyEMD
pip install EMD-signal
或者在github网址上下载代码再python setup.py install
from PyEMD import EMD,EEMD
from PyEMD.visualisation import Visualisation
import numpy as np
t = np.arange(0, 3, 0.01)
S = np.sin(13*t + 0.2*t**1.4) - np.cos(3*t)
emd = EMD()
emd.emd(S)
imfs, res = emd.get_imfs_and_residue()
#用该库自带的可视化函数可视化
vis = Visualisation()
#绘制 IMF
vis.plot_imfs(imfs=imfs, residue=res, t=t, include_residue=True)
#绘制瞬时频率
vis.plot_instant_freq(t, imfs=imfs)
vis.show()
结果如下图所示,应用EMD方法把原始信号分解出三个IMF,原始型号包含了一个0.5s的高频信号,一个2s的低频率信号,最后是一个随时间降低的趋势。
在使用这个库的时候在import这一步遇到了这样一个问题,分享一下我的解决方法
ModuleNotFoundError: No module named ‘PyEMD’
我尝试了网上翻到的一些方法,包括github上写的下载安装包再python setup.py install ,或者用pip install EMD-signal,都没有成功解决这个问题。
于是我翻了一下代码,其实是安装以后这个库的名字变成了pyemd(小写)而不是PyEMD这样的格式了,编译器识别不出来就报错了。
所以我简单粗暴地把文件夹的名字改了然后就成功了,我的库是存放在这个文件下可供参考:C:\Users\administrator\Anaconda3\Lib\site-packages
下图中阴影的那个文件名是正确的写法,但是我一开始pip install以后给装成了下面那个小写的。折腾了好久,害。
最后祝大家科研顺利,搬砖愉快!