接上期信号处理基础之噪声与降噪(三) | EMD降噪与VMD降噪及python代码实现,本期为大家介绍EEMD、CEEMD、CEEMDAN和ICEEMDAN降噪,并给出python代码。后续将会介绍小波族的降噪应用,敬请关注。由于作者水平有限,文章的原理介绍与python代码难免有误,欢迎交流讨论!
1 EEMD降噪
1.1 EEMD的基本过程
1.2 EEMD降噪的实现过程
1.3 EEMD降噪的python实现
2.1 CEEMD的基本过程
2.2 CEEMD降噪的实现过程
2.3 CEEMD降噪的python实现
3.1 CEEMDAN的基本过程
3.2 CEEMDAN降噪的实现过程
3.3 CEEMDAN降噪的python实现
4.1 ICEEMDAN的基本过程
4.2 ICEEMDAN降噪的实现过程
4.3 ICEEMDAN降噪的python实现
5.1 测试用例
5.2 降噪结果
5.3 降噪指标
1.1 EEMD的基本过程
集 合经验模态分解(Ensemble Empirical Mode Decomposition,EEMD)是为了应对EMD分解时产生的模态混叠现象提出的。其本质是一种叠加高斯白噪声的多次经验模式分解,利用了高斯白噪声具有频率均匀分布的统计特性,通过每次加入同等幅值的不同白噪声来改变信号的极值点特性,之后对多次EMD得到的相应IMF进行总体平均来抵消加入的白噪声,从而有效抑制模态混叠的产生。
EEMD的基本过程:
(1)EEMD分解:得到各模态分量IMF;
(2)IMFs筛选:筛选包含有用信息的IMFs,本文采用相关系数法进行筛选;
(3)信号重构:将筛选的IMFs叠加,获得降噪后的信号。
1.3 EEMD降噪的python实现
from PyEMD import EEMD
import numpy as np
def denoised_with_EEMD(data):
imf_select = []
order_select = []
# EEMD分解
eemd = EEMD()
eemd.trials = 100 # 设置EEMD的迭代次数
imfs = eemd.eemd(data)
for i in range(len(imfs)-1):
if np.corrcoef(data, imfs[i])[0, 1] >= 0.3:
imf_select.append(imfs[i])
order_select.append(i+1)
else:
continue
signal_denoised = np.sum(imf_select[:len(imf_select)], axis=0)
return imf_select, order_select, signal_denoised
2.1 CEEMD的基本过程
互补集 合经验模态分解(Complementary Ensemble Empirical Mode Decomposition, CEEMD)是为了应对EEMD在添加高斯白噪声后存在部分噪声残留而提出的一种改进的信号分解方法。其基本原理是将一对互为相反数的白噪声作为辅助噪声加入原始信号中,从而消除EEMD方法分解后重构信号中的残余辅助高斯白噪声。此外,CEEMD分解时所需的迭代次数更少。
2.2 CEEMD降噪的实现过程
2.3 CEEMD降噪的python实现
from PyEMD import CEEMD
import numpy as np
def denoised_with_CEEMD(data):
imf_select = []
order_select = []
# CEEMD分解
ceemd = CEEMD()
ceemd.trials = 100 # 设置EEMD的迭代次数
imfs = ceemd.ceemd(data)
for i in range(len(imfs)-1):
if np.corrcoef(data, imfs[i])[0, 1] >= 0.3:
imf_select.append(imfs[i])
order_select.append(i+1)
else:
continue
signal_denoised = np.sum(imf_select[:len(imf_select)], axis=0)
return imf_select, order_select, signal_denoised
3.3 CEEMDAN降噪的python实现
from PyEMD import CEEMDAN
import numpy as np
def denoised_with_CEEMDAN(data):
imf_select = []
order_select = []
# CEEMDAN分解
ceemdan = CEEMDAN()
imfs = ceemdan(data)
for i in range(len(imfs)-1):
if np.corrcoef(data, imfs[i])[0, 1] >= 0.4:
imf_select.append(imfs[i])
order_select.append(i+1)
else:
continue
signal_denoised = np.sum(imf_select[:len(imf_select)], axis=0)
return imf_select, order_select, signal_denoised
4.1 ICEEMDAN的基本过程
4.2 ICEEMDAN降噪的实现过程
4.3 ICEEMDAN降噪的python实现
from PyEMD import ICEEMDAN
import numpy as np
def denoised_with_ICEEMDAN(data):
imf_select = []
order_select = []
# ICEEMDAN分解
iceemdan = ICEEMDAN()
imfs = iceemdan.iceemdan(data, 0.2, 50, 100, 2)
for i in range(len(imfs)):
if np.corrcoef(data, imfs[i])[0, 1] >= 0.4:
imf_select.append(imfs[i])
order_select.append(i+1)
else:
continue
signal_denoised = np.sum(imf_select[:len(imf_select)], axis=0)
return imf_select, order_select, signal_denoised
5.1 测试用例
# 创建一个信号
n = 500 # 生成500个点的信号
t = np.linspace(0, 30*np.pi, n, endpoint=False)
s = np.cos(0.1*np.pi*t) + np.sin(0.3*np.pi*t) + np.cos(0.5*np.pi*t) + np.sin(0.7*np.pi*t) # 原始信号
r = 0.5 * np.random.randn(n)
y = s + r # 加噪声
imf_select_emd, order_select_emd, signal_denoised_emd = denoised_with_EMD(y)
imf_select_eemd, order_select_eemd, signal_denoised_eemd = denoised_with_EEMD(y)
imf_select_ceemd, order_select_ceemd, signal_denoised_ceemd = denoised_with_CEEMD(y)
imf_select_ceemdan, order_select_ceemdan, signal_denoised_ceemdan = denoised_with_CEEMDAN(y)
imf_select_iceemdan, order_select_iceemdan, signal_denoised_iceemdan = denoised_with_ICEEMDAN(y)
value_emd = denoise_evaluate(s, r, signal_denoised_emd)
value_eemd = denoise_evaluate(s, r, signal_denoised_eemd)
value_ceemd = denoise_evaluate(s, r, signal_denoised_ceemd)
value_ceemdan = denoise_evaluate(s, r, signal_denoised_ceemdan)
value_iceemdan = denoise_evaluate(s, r, signal_denoised_iceemdan)
print(value_emd)
print(value_eemd)
print(value_ceemd)
print(value_ceemdan)
print(value_iceemdan)
fig = plt.figure(figsize=(16, 12))
plt.subplots_adjust(hspace=0.5)
plt.subplots_adjust(left=0.05, right=0.98, top=0.95, bottom=0.05)
font = {'family': 'Times New Roman', 'size': 16, 'weight': 'normal',}
matplotlib.rc('font', **font)
plt.subplot(7, 1, 1)
plt.plot(t, s, linewidth=1.5, color='b')
plt.title('pure signal', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 2)
plt.plot(t, y, linewidth=1.5, color='b')
plt.title('noised signal', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 3)
plt.plot(t, signal_denoised_emd, linewidth=1.5, color='b')
plt.title('EMD', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 4)
plt.plot(t, signal_denoised_eemd, linewidth=1.5, color='b')
plt.title('EEMD', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 5)
plt.plot(t, signal_denoised_ceemd, linewidth=1.5, color='b')
plt.title('CEEMD', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 6)
plt.plot(t, signal_denoised_ceemdan, linewidth=1.5, color='b')
plt.title('CEEMDAN', fontname='Times New Roman', fontsize=16)
plt.subplot(7, 1, 7)
plt.plot(t, signal_denoised_iceemdan, linewidth=1.5, color='b')
plt.title('ICEEMDAN', fontname='Times New Roman', fontsize=16)
# plt.savefig(r'E:\003-信号处理\005-降噪\VMD_denoise.svg')
plt.show()
5.2 降噪结果
5.3 降噪指标
[1]https://blog.csdn.net/weixin_45317919/article/details/109850346
[2]汪一飞. 基于全矢CEEMD的滚动轴承故障诊断研究[D].郑州大学,2019.
[3]杨德州,刘嘉明,宋汶秦,等. 基于改进型自适应白噪声完备集成经验模态分解的工业用户负荷预测方法[J]. 电力系统保护与控制,2022,50(4):36-43. DOI:10.19783/j.cnki.pspc.210665.
[4]吕凤霞,缪益,别锋锋,等. ICEEMDAN和GS-SVM算法在滚动轴承声发射故障诊断中的应用研究[J]. 噪声与振动控制,2022,42(6):92-97,129. DOI:10.3969/j.issn.1006-1355.2022.06.016.
[5]http://bioingenieria.edu.ar/grupos/ldnlys/metorres/re_inter.htm#Codigos
编辑:陈凯歌
校核:李正平、张泽明、张勇、王畅、赵栓栓、董浩杰
该文资料仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除。