EEMD算法原理与python实现

目录

    • EMD算法的不足
    • EEMD算法的基本原理
    • EEMD和EMD性能对比
    • python实现EEMD案例

本教程为脑机学习者Rose原创(转载请联系作者授权)发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195
EEMD算法原理与python实现_第1张图片

EMD算法的不足

EMD算法能将原始信号不断进行分解,获取符合一定条件下的IMF分量。这些 IMF 分量之间的频率往往不同,这就为其在谐波检测方向的使用提供了一种思路。EMD 算法以其正交性、收敛性等特点被广泛用于信号处理等领域,但并不像小波分析或者神经网络那样,有固定的数学模型,因此它的一些重要性质仍还没有通过缜密的数学方法证明出。而且对模态分量 IMF 的定义也尚未统一,仅能从信号的零点与极值点的联系与信号的局部特征等综合描述。EMD 从理论到实际运用仍有很长的一段路要走。

EMD 具体的不足体现在以下几个方面:
IMF 分解时存在着模态混叠现象,也就是说一个IMF中会包含不同时间尺度的特征成分。一方面是由于信号本身的原因,另一方面是EMD算法本身的缺陷。
在分解出IMF的过程中需要迭代很多次,而停止迭代的条件缺乏一个标准,所以不同的停止迭代的条件得到的IMFs也是不同的。

为了解决EMD中存在的模态混叠等问题,Huang通过了一种噪声辅助信号处理(NADA),将信号中加入了噪声进行辅助分析。在EMD 方法中,得到合理IMF 的能力取决于信号极值点的分布情况,如果信号极值点分布不均匀,会出现模态混叠的情况。为此,Huang将白噪声加入待分解信号,利用白噪声频谱的均匀分布,当信号加在遍布整个时频空间分布一致的白噪声背景上时,不同时间尺度的信号会自动分布到合适的参考尺度上,并且由于零均值噪声的特性,经过多次平均后,噪声将相互抵消,集成均值的结果就可作为最终结果。

为抑制各 IMF 分量之间出现混频,Norden Huang在 EMD分解中,运用添加均值为零的高斯白噪声进行辅助分析,即EEMD算法。

EEMD算法的基本原理

EEMD步骤

EEMD方法实质上是对EMD算法的一种改进,主要是根据白噪声均值为零的特性,在信号中对此加入白噪声,仍然用EMD进行分解,对分解的结果进行平均处理,平均处理的次数越多噪声给分解结果带来的影响就越小。设信号为 x ( t ) x(t) x(t),具体的分解步骤如下:
步骤1:
x ( t ) x(t) x(t)设定平均处理次数为 M M M,初始 i = 1 , 2 , ⋯   , M i=1,2,\cdots,M i=1,2,,M
步骤2:
x ( t ) x(t) x(t)添加具有一定幅值的随机白噪声 n i ( t ) n_{i}(t) ni(t),组成新的一系列信号:
x i ( t ) = x ( t ) + n i ( t ) i = 1 , 2 , ⋯   , M x_{i}(t)=x(t)+n_{i}(t) i=1,2,\cdots,M xi(t)=x(t)+ni(t)i=1,2,,M

步骤3:
将新的序列号 x i ( t ) x_{i}(t) xi(t)进行EMD分解。
x i ( t ) = ∑ n = 1 n c i , n ( t ) + r i , n ( t ) x_{i}(t)=\sum_{n=1}^{n}c_{i,n}(t)+r_{i,n}(t) xi(t)=n=1nci,n(t)+ri,n(t)
n n n为EMD分解IMF的数量, c i , n ( t ) c_{i,n}(t) ci,n(t)是IMFs, r i , n ( t ) r_{i,n}(t) ri,n(t)是残余分量。

步骤4:
重复2步骤、3步骤M次,每次添加不同幅值的白噪声,获得一系列IMFs。通过IMFs平均值,求得EEMD的IMF分量 c n ( t ) c_{n}(t) cn(t).

[ { c 1 , n ( t ) } , { c 2 , n ( t ) } , ⋯   , { c M , n ( t ) } ] , n = 1 , 2 , ⋯   , N [\{c_{1,n}(t)\},\{c_{2,n}(t)\},\cdots,\{c_{M,n}(t)\}] ,n=1,2,\cdots,N [{c1,n(t)},{c2,n(t)},,{cM,n(t)}],n=1,2,,N

c n ( t ) = 1 M ∑ i = 1 M c i , n ( t ) , i = 1 , 2 , ⋯   , M ; n = 1 , 2 , ⋯   , N c_{n}(t)=\frac{1}{M}\sum_{i=1}{M}c_{i,n}(t) ,i=1,2,\cdots,M;n=1,2,\cdots,N cn(t)=M1i=1Mci,n(t),i=1,2,,M;n=1,2,,N

EEMD和EMD性能对比

EMD算法过程中出现模态混叠的两种现象:
1)不同的时间尺度成分出现在同一个IMF分量当中。
2)相同的尺度分布在不同的IMF分量当中。

此现象会导致时频分布错误,使IMF分量失去真实的物理意义。EEMD分解算法基于白噪声频谱均衡的分布特点来均衡噪声,使得频率的分布趋于均匀。添加的白噪声不同信号的幅值分布点带来的模态混叠效应。

python实现EEMD案例

# 导入工具包
import numpy as np
from PyEMD import EEMD, EMD, Visualisation
import pylab as plt

定义Signal函数,产生信号,并对信号进行EEMD提取特征,最后绘制。

说明,这里是为了演示方便,下面在一个函数中进行所有操作的写法并不推荐

def Signal():
    global E_imfNo
    E_imfNo = np.zeros(50, dtype=np.int)

    # EEMD options
    max_imf = -1

    """
    信号参数:
    N:采样频率500Hz
    tMin:采样开始时间
    tMax:采样结束时间 2*np.pi
    """
    N = 500
    tMin, tMax = 0, 2 * np.pi
    T = np.linspace(tMin, tMax, N)
    # 信号S:是多个信号叠加信号
    S = 3 * np.sin(4 * T) + 4 * np.cos(9 * T) + np.sin(8.11 * T + 1.2)

    # EEMD计算
    eemd = EEMD()
    eemd.trials = 50
    eemd.noise_seed(12345)

    E_IMFs = eemd.eemd(S, T, max_imf)
    imfNo = E_IMFs.shape[0]


    # Plot results in a grid
    c = np.floor(np.sqrt(imfNo + 1))
    r = np.ceil((imfNo + 1) / c)

    plt.ioff()
    plt.subplot(r, c, 1)
    plt.plot(T, S, 'r')
    plt.xlim((tMin, tMax))
    plt.title("Original signal")

    for num in range(imfNo):
        plt.subplot(r, c, num + 2)
        plt.plot(T, E_IMFs[num], 'g')
        plt.xlim((tMin, tMax))
        plt.title("Imf " + str(num + 1))

    plt.show()
if __name__ == "__main__":
    Signal()

EEMD算法原理与python实现_第2张图片

参考
基于稳态视觉诱发电位的脑-机接口系统研究
EEMD算法原理与Python实现
脑机学习者Rose笔记分享,QQ交流群:903290195
更多分享,请关注公众号
EEMD算法原理与python实现_第3张图片

你可能感兴趣的:(#,脑电信号处理,脑机接口社区)