首页/文章/ 详情

信号处理基础之噪声与降噪(四) | 进击的EMD族降噪及python代码实现

5月前浏览2651

接上期信号处理基础之噪声与降噪(三) | EMD降噪与VMD降噪及python代码实现本期为大家介绍EEMD、CEEMD、CEEMDAN和ICEEMDAN降噪,并给出python代码。后续将会介绍小波族的降噪应用,敬请关注。由于作者水平有限,文章的原理介绍与python代码难免有误,欢迎交流讨论!

目录

1 EEMD降噪

1.1 EEMD的基本过程

1.2 EEMD降噪的实现过程

1.3 EEMD降噪的python实现

2 CEEMD降噪

2.1 CEEMD的基本过程

2.2 CEEMD降噪的实现过程

2.3 CEEMD降噪的python实现

3 CEEMDAN降噪

3.1 CEEMDAN的基本过程

3.2 CEEMDAN降噪的实现过程

3.3 CEEMDAN降噪的python实现

4 ICEEMDAN降噪

4.1 ICEEMDAN的基本过程

4.2 ICEEMDAN降噪的实现过程

4.3 ICEEMDAN降噪的python实现

5 算法测试

5.1 测试用例

5.2 降噪结果

5.3 降噪指标

6 参考文献

1 EEMD降噪

1.1 EEMD的基本过程

集 合经验模态分解(Ensemble Empirical Mode Decomposition,EEMD)是为了应对EMD分解时产生的模态混叠现象提出的。其本质是一种叠加高斯白噪声的多次经验模式分解,利用了高斯白噪声具有频率均匀分布的统计特性,通过每次加入同等幅值的不同白噪声来改变信号的极值点特性,之后对多次EMD得到的相应IMF进行总体平均来抵消加入的白噪声,从而有效抑制模态混叠的产生。

EEMD的基本过程:

(1)在原始信号    中加入第i个高斯白噪声    ,形成新的信号:
   
(2)对得到的含噪信号进行EMD分解,得到第i次添加白噪声的    :
   
(3)重复步骤(1)和(2),直至到达设置的添加白噪声的次数M,每次分解得到的IMF集 合可表示为:
   
(4)根据不相关序列的统计平均值为零的原理,计算IMF集 合均值,得到EEMD之后的IMF分量:
   
1.2 EEMD降噪的实现过程

(1)EEMD分解:得到各模态分量IMF;

(2)IMFs筛选:筛选包含有用信息的IMFs,本文采用相关系数法进行筛选;

(3)信号重构:将筛选的IMFs叠加,获得降噪后的信号。

1.3 EEMD降噪的python实现

注:第三方工具包PyEMD自带EEMD分解,本部分在此基础上进行
    from PyEMD import EEMDimport numpy as npdef 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 CEEMD降噪

    2.1 CEEMD的基本过程

    互补集 合经验模态分解(Complementary Ensemble Empirical Mode Decomposition, CEEMD)是为了应对EEMD在添加高斯白噪声后存在部分噪声残留而提出的一种改进的信号分解方法。其基本原理是将一对互为相反数的白噪声作为辅助噪声加入原始信号中,从而消除EEMD方法分解后重构信号中的残余辅助高斯白噪声。此外,CEEMD分解时所需的迭代次数更少。

    CEEMD的基本过程:
    (1)在原始信号    中加入第i个高斯白噪声    ,形成新的信号:
       
    (2)对得到的含噪信号    和    进行EMD分解,得到第i次添加白噪声的    :
       
       
    (3)重复步骤(1)和(2),直至到达设置的添加白噪声的次数M,每次分解得到的IMF集 合可表示为:
       
       
    (4)根据不相关序列的统计平均值为零的原理,计算IMF集 合均值,得到EEMD之后的IMF分量:
       

    2.2 CEEMD降噪的实现过程

    (1)CEEMD分解:得到各模态分量IMF;
    (2)IMFs筛选:筛选包含有用信息的IMFs,本文采用相关系数法进行筛选;
    (3)信号重构:将筛选的IMFs叠加,获得降噪后的信号。

    2.3 CEEMD降噪的python实现

    注:第三方工具包PyEMD未给出CEEMD分解,本部分在EEMD基础上编写CEEMD类进行使用
      from PyEMD import CEEMDimport numpy as npdef 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 CEEMDAN降噪

      3.1 CEEMDAN的基本过程
      自适应噪声完备集 合经验模式分解(Complete Ensemble Empirical Mode Decomposition with Adaptive Noise, CEEMDAN)在EMD算法的基础上进行改进,通过在每个阶段添加自适应高斯白噪声实现重构误差的限制,并且克服了EMD算法存在的模态混叠现象。需要注意的是CEEMDAN并不是对CEEMD的改进,两者的实现过程完全不同。
      引入算子    ,CEEMDAN的实现过程如下:
      (1)在原始信号    中加入第i个引入自适应系数的高斯白噪声    ,形成新的信号:
         
      (2)对得到的含噪信号    进行EMD分解,得到第i次添加白噪声的    ,添加M次白噪声,重复进行EMD,对M次EMD分解产生的IMF分量进行加权,得到一阶模态分量:
         
      (3)计算残余信号:
         
      (4)向残余信号    中加入M次高斯噪声分量    并进行M次EMD分解,得到二阶模态分量:
         
      (5)重复步骤(3)和(4),分解出各阶模态分量,当残余信号满足EMD分解终止条件时,结束分解,原始信号可表示为:
         
      3.2 CEEMDAN降噪的实现过程
      (1)CEEMDAN分解:得到各模态分量IMF;
      (2)IMFs筛选:筛选包含有用信息的IMFs,本文采用相关系数法进行筛选;
      (3)信号重构:将筛选的IMFs叠加,获得降噪后的信号。

      3.3 CEEMDAN降噪的python实现

      注:第三方工具包PyEMD给出了CEEMDAN分解,本部分在此基础上进行使用
        from PyEMD import CEEMDANimport numpy as npdef 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 ICEEMDAN降噪

        4.1 ICEEMDAN的基本过程

        CEEMDAN通过添加自适应高斯白噪声的方式降低了噪声的影响,但各分量中仍有部分噪声,且各分量中存在伪模式。为了解决这个问题,改进的自适应噪声完备集 合经验模态分解(Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise, ICEEMDAN)被提出。
        引入算子    ,ICEEMDAN过程可表示如下:
        (1)在原始信号    中加入第i个引入高斯白噪声    ,形成新的信号:
           
        (2)计算第一次分解的残差信号:
           
        (3)计算第一阶模态分量:
           
        (4)将第二余量信号估计为一系列    的均值,得到二阶模态分量:
           
        (5)重复步骤(4),分解出各阶模态分量,当残余信号满足EMD分解终止条件时,结束分解,原始信号可表示为:
           

        4.2 ICEEMDAN降噪的实现过程

        (1)ICEEMDAN分解:得到各模态分量IMF;
        (2)IMFs筛选:筛选包含有用信息的IMFs,本文采用相关系数法进行筛选;
        (3)信号重构:将筛选的IMFs叠加,获得降噪后的信号。

        4.3 ICEEMDAN降噪的python实现

        注:第三方工具包PyEMD未给出ICEEMDAN分解,本部分在matlab代码[文献5]基础上重写ICEEMDAN类进行使用
          from PyEMD import ICEEMDANimport numpy as npdef 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 算法测试

          5.1 测试用例

          注[1]:用例中的CEEMD和ICEEMDAN在PyEMD中未给出,相关代码为笔者根据EEMD算法和matlab的ICEEMDAN算法进行编写,暂不公开
          注[2]:用例中denoised_evaluate()函数见”信号处理基础之噪声与降噪(二) | 时域降噪方法(平滑降噪、SVD降噪)python代码实现
            # 创建一个信号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 降噪指标

            6 参考文献

            [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

            编辑:陈凯歌

            校核:李正平、张泽明、张勇、王畅、赵栓栓董浩杰

            该文资料仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除。

            来源:故障诊断与python学习
            振动电力MATLABpythonUM控制
            著作权归作者所有,欢迎分享,未经许可,不得转载
            首次发布时间:2023-12-12
            最近编辑:5月前
            故障诊断与python学习
            硕士 签名征集中
            获赞 42粉丝 36文章 92课程 0
            点赞
            收藏
            未登录
            还没有评论

            课程
            培训
            服务
            行家

            VIP会员 学习 福利任务 兑换礼品
            下载APP
            联系我们
            帮助与反馈