CEEMDAN 分解python代码
时间: 2023-11-12 17:58:12 浏览: 283
CEEMDAN是一种信号分解方法,它可以将非线性和非平稳信号分解成若干个固有模态函数(IMF)的叠加。下面是CEEMDAN的Python实现代码:
```python
import numpy as np
from scipy.interpolate import UnivariateSpline
def emd(x):
x = x.astype(np.float64)
t = np.arange(len(x))
imf = np.zeros((len(x), 2))
while True:
if np.max(np.abs(x)) < 1e-10:
break
h = x
sd = np.inf
while sd > 0.1:
spl = UnivariateSpline(t, h)
h1 = h - spl(t)
spl = UnivariateSpline(t, h1)
h2 = h1 - spl(t)
sd = np.sqrt(np.mean(h2 ** 2))
h = h1 - h2
imf[:, 0] += h
imf[:, 1] += x - h
x = imf[:, 1]
return imf
def ceemdan(x, n_imfs):
x = x.astype(np.float64)
imfs = np.zeros((len(x), n_imfs))
for i in range(n_imfs):
imf = emd(x)
imfs[:, i] = imf[:, 0]
x -= imf[:, 0]
imfs[:, -1] += x
return imfs
```
其中,`emd`函数实现了一次EMD分解,`ceemdan`函数实现了多次EMD分解,得到多个IMF。具体实现过程如下:
1. 首先将输入信号`x`转换为浮点数类型,并生成时间序列`t`。
2. 进入循环,如果信号的最大值小于1e-10,则跳出循环。
3. 将当前信号`x`赋值给变量`h`,并初始化标准差`sd`为正无穷。
4. 进入内层循环,使用样条插值方法拟合信号`h`,得到拟合曲线`spl(t)`。
5. 计算残差信号`h1=h-spl(t)`,再次使用样条插值方法拟合`h1`,得到拟合曲线`spl(t)`。
6. 计算残差信号`h2=h1-spl(t)`的标准差`sd`,如果`sd>0.1`,则将`h=h1-h2`,继续进行内层循环;否则跳出内层循环。
7. 将分解得到的IMF分别存储在二维数组`imf`的第一列中,将剩余信号存储在第二列中。
8. 将剩余信号作为新的输入信号,继续进行EMD分解,直到剩余信号的最大值小于1e-10或者达到最大迭代次数。
9. `ceemdan`函数调用多次`emd`函数,得到多个IMF,最后一个IMF加上剩余信号作为最后一个分量。
阅读全文