信號處理 - 經驗模態分解 【1】


EMD,經驗模態分解,是一種信號分解的技術;

它提出了一個概念叫 基本模態分量 IMF,

EMD 用於處理非平穩信號,可用於任意數據,基於數據本身進行分解;

EMD 把一個信號分解成 多個 IMF,每個 IMF 具有線性和非線性的特點,還有一個 信號殘余分量,常常代表信號的直流分量或者信號的趨勢;

EMD 分解得到的 IMF,頻率逐漸降低,尺度各不相同;

EMD 分解得到的前幾個模態分量,通常集中了原始信號中最顯著、最重要的信息; 

 

EMD 分解容易造成 模態混合,表現為下列現象之一:

1. 在同一個 IMF 中,尺度分布范圍很寬卻又各不相同的信號;

2. 在不同 IMF 中,存在尺度相近的信號;

模態混合使得 IMF 失去單一特征尺度,形成尺度混雜的震盪,失去原有的物理意義

 

EEMD,集合經驗模態分解,解決了 EMD 模態混合的現象

 

使用方法 

 

安裝:pip install EMD-signal

 

文檔:https://pyemd.readthedocs.io/en/latest/

 

Python EMD 用法

##### 基本用法
import numpy as np
from PyEMD import EMD
import pylab as plt

s = np.random.random(100)
emd = EMD()
IMFs = emd.emd(s)


##### 示例
# Define signal
t = np.linspace(0, 1, 200)
s = np.cos(11*2*np.pi*t*t) + 6*t*t

# Execute EMD on signal
IMF = EMD().emd(s,t)
N = IMF.shape[0]+1

# Plot results
plt.subplot(N,1,1)
plt.plot(t, s, 'r')
plt.title("Input signal: $S(t)=cos(22\pi t^2) + 6t^2$")
plt.xlabel("Time [s]")

for n, imf in enumerate(IMF):
    plt.subplot(N,1,n+2)
    plt.plot(t, imf, 'g')
    plt.title("IMF "+str(n+1))
    plt.xlabel("Time [s]")

plt.tight_layout()
plt.savefig('simple_example')
plt.show()

輸出

 

Python EEMD 用法

def eemd(self, S, T=None, max_imf=-1)

S:一維信號

T:時間,相當於 x,如果沒有 時間,就用 None

max_imf:分解成多少個 基本模態分量,注意 還有一個 殘余分量,也就是 max_imf = 2 的話,有生成 3 個 imf

 

示例

from PyEMD import EEMD
import numpy as np
import pylab as plt


def main():
    # Define signal
    t = np.linspace(0, 1, 200)

    sin = lambda x,p: np.sin(2*np.pi*x*t+p)
    S = 3*sin(18,0.2)*(t-0.2)**2
    S += 5*sin(11,2.7)
    S += 3*sin(14,1.6)
    S += 1*np.sin(4*2*np.pi*(t-0.8)**2)
    S += t**2.1 -t

    # Assign EEMD to `eemd` variable
    eemd = EEMD()

    # Say we want detect extrema using parabolic method
    # emd = eemd.EMD
    # emd.extrema_detection="parabol"
    # eemd.trials = 50
    # eemd.noise_seed(12345)

    # Execute EEMD on S
    eIMFs = eemd.eemd(S, t, -1)
    nIMFs = eIMFs.shape[0]

    # Plot results
    plt.figure(figsize=(12,9))
    plt.subplot(nIMFs+1, 1, 1)
    plt.plot(t, S, 'r')

    for n in range(nIMFs):
        plt.subplot(nIMFs+1, 1, n+2)
        plt.plot(t, eIMFs[n], 'g')
        plt.ylabel("eIMF %i" %(n+1))
        plt.locator_params(axis='y', nbins=5)

    plt.xlabel("Time [s]")
    plt.tight_layout()
    plt.savefig('eemd_example', dpi=120)
    plt.show()


if __name__ == '__main__':
    main() 

注意

1. 使用時 數據 是 浮點數;

2. eemd 必須 使用  if __name__ == '__main__' 運行,不知道為什么

 

總結

在實際應用中,EMD 可能與其他方法進行融合,比如 先進行 去燥,再 EMD 分解,或者 先 小波分解降噪,再 EMD 分解

 

 

 

參考資料:

https://www.cnblogs.com/RoseVorchid/p/12030980.html  EEMD算法python實現,原理講得不咋地

http://www.360doc.com/content/19/0806/12/41357686_853284987.shtml#  EEMD 原理

https://www.cnblogs.com/mikawong/p/7682467.html  記錄了 PyEMD 的一些資源鏈接

 

《Adaboost_SVM集成模型的滾動軸承早期故障診斷》  電子書


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM