CEEMDAN 算法的公式和代码
时间: 2024-05-12 21:19:37 浏览: 199
CEEMDAN算法公式:
输入:信号x(t)
输出:分解模式IMF1(t), IMF2(t), …, IMFn(t)
1. 对信号x(t)进行预处理,包括去趋势和归一化处理。
2. 初始化EEMD参数,包括噪声扰动标准差r,分解层数L,EEMD迭代次数K,判断停止迭代的阈值T。
3. 对信号x(t)进行K次EEMD,得到K个噪声扰动模式IMFk(t),k=1,2,…,K。
4. 对K个噪声扰动模式进行平均,得到平均噪声扰动模式IMFm(t)。
5. 对平均噪声扰动模式进行CEEMD处理,得到分解模式IMF1(t)。
6. 对IMF1(t)进行判断,如果IMF1(t)满足停止迭代的阈值T,则输出IMF1(t),否则将IMF1(t)作为新的信号x(t),返回步骤2,直到分解出所有的IMF。
CEEMDAN算法代码:
以下是基于Python实现的CEEMDAN算法代码:
```
import numpy as np
import math
# EMD函数
def emd(x):
t = np.arange(len(x))
if sum(abs(np.diff(x))) == 0:
return x
else:
while True:
h = x
sd = 1
while sd > 0.3:
s = h
for i in range(1, 5):
d = np.diff(s)
d = np.append(d, d[-1])
maxid = np.argmax(abs(d))
s = (s[:maxid] + s[maxid+1:])/2
h = h - s
sd = np.std(h)/np.std(x)
if len(h) < 3:
break
else:
x = x - h
if sum(abs(np.diff(x))) == 0:
break
return x
# CEEMDAN函数
def ceemdan(x, r, L, K, T):
x = (x - np.mean(x))/np.std(x) # 去趋势和归一化处理
imfs = []
for i in range(K):
# EEMD
x1 = x + r*np.random.randn(len(x))
imfs_k = []
for j in range(L):
h = x1
while True:
s = emd(h)
if len(s) == 1:
break
else:
h = h - s
if j >= L-1:
imfs_k.append(h)
# 平均噪声扰动模式
imfs_km = np.mean(imfs_k, axis=0)
# CEEMD
imfs_k1 = emd(imfs_km)
imfs.append(imfs_k1)
x = x - imfs_k1
# 输出分解模式
imfs_all = []
for imf in imfs:
while True:
if sum(abs(np.diff(imf))) == 0:
break
else:
imf = ceemdan(imf, r, L, K, T)
imfs_all.append(imf)
x = x - imf
if sum(abs(np.diff(x))) == 0:
break
if len(x) > 0:
imfs_all.append(x)
return imfs_all
```
代码中的输入参数包括:
- x:待分解的信号。
- r:噪声扰动标准差。
- L:EEMD分解层数。
- K:EEMD迭代次数。
- T:判断停止迭代的阈值。
输出为分解模式IMF1(t), IMF2(t), …, IMFn(t)。
阅读全文