EMD分解
emd分解是一个实验需要用到的技术,先记下来,以后复习。
经验模态分解技术-EMD-李新亮_哔哩哔哩_bilibili
首先来说EMD方法是分解波形的,一个复杂波形可能是由简单波形加减得到的,也有可能波形是随时间变换的。这时可以尝试对波形分解,然后来看趋势项和波动项。
1)根据原始信号上下极值点,分别画出上、下包络线。
上、下包络线
2)求上、下包络线的均值,画出均值包络线。
均值包络线
3)原始信号减均值包络线,得到中间信号。
原始信号减均值包络线
4)判断该中间信号是否满足IMF的两个条件,如果满足,该信号就是一个IMF分量;如果不是,以该信号为基础,重新做1)~4)的分析。IMF分量的获取通常需要若干次的迭代。
不满足约束2,需要继续迭代
使用上述方法得到第一个IMF后,用原始信号减IMF1,作为新的原始信号,再通过1)~4)的分析,可以得到IMF2,以此类推,完成EMD分解。
迭代分解结果
上述例子中的图来自http://perso.ens-lyon.fr/patrick.flandrin/emd.ppt
简单python代码:
import numpy as np
from pyemd import EMD, Visualisation,EEMD
import pandas as pd
#构建信号
time=np.arange(start=0,stop=1.01,step=0.01)
signal=signal = np.cos(11*2*np.pi*time*time)+6*time*time
# 提取imfs和剩余
emd = EMD()
emd.emd(signal,time)
imfs, res = emd.get_imfs_and_residue()
vis = Visualisation()
vis.plot_imfs(imfs=imfs, residue=res, t=time, include_residue=True)
# 绘制并显示所有提供的IMF的瞬时频率
vis.plot_instant_freq(time, imfs=imfs)
vis.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lKcib72p-1678452110595)(D:/01Data/typora%E5%9B%BE%E7%89%87/%E8%AE%B2%E8%A7%A3EMD%E5%88%86%E8%A7%A3/emdvmd_1_0.png)]
可能存在的问题?
1.TypeError: ‘AxesSubplot’ object is not iterable
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[11], line 10
7 imfs, res = emd.get_imfs_and_residue()
9 vis = Visualisation()
---> 10 vis.plot_imfs(imfs=imfs, residue=res, t=time, include_residue=True)
11 # 绘制并显示所有提供的IMF的瞬时频率
12 vis.plot_instant_freq(time, imfs=imfs)
File D:\Anaconda3\lib\site-packages\pyemd\visualisation.py:62, in Visualisation.plot_imfs(self, imfs, residue, t, include_residue)
59 fig, axes = plt.subplots(num_rows, 1, figsize=(self.PLOT_WIDTH, num_rows * self.PLOT_HEIGHT_PER_IMF),dpi=300)
61 if num_rows == 1:
---> 62 axes = list(axes)
64 axes[0].set_title("Time series")
66 for num, imf in enumerate(imfs):
TypeError: 'AxesSubplot' object is not iterable
此时查看imf,发现信号未分解,图像没法画,建议修改信号,使它可以分解:
#不可分解的信号
signal = np.sin(2 * np.pi * time)+6*time*time
#可以分解的信号
signal = np.cos(11*2*np.pi*time*time)+6*time*time
2.pyemd导包的问题
可能需要修改源代码的大小写。
EMD实例
可以分解的信号
signal = np.cos(112np.pitimetime)+6timetime
##### 2.pyemd导包的问题
可能需要修改源代码的大小写。
## EMD实例
参考论文:基于时间序列 EEMD 重构的滑坡位移 PSO-SVR 预 测方法—以三峡库区滑坡为例