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


算法實現起來比較簡單,參考 資料1,這里不再贅述;

 

特點

傅里葉變換 的 基波 為 正弦波,如果原始信號波形很復雜,信號分解 計算量會很大,用 無窮多的 正弦波 才能 逼近 這個 波形;

小波變換 的 基波 為 某些固定波形,不同的 基波 對信號處理影響很大,一旦選定,無法更換,即使小波基在全局最佳,在某些局部卻不一定;

經驗模態分解的特點在於 自適應 的基函數(基波),使得它 可以處理 任意 信號;

 

應用

經驗模態分解 認為 任何 一個復雜信號 都可以分解成若干個 基本模態分量 imf;

這些基本模態分量相加 也可以 大致 重構 原始信號;

 

去燥 與 重構

我們把 imf 進行 頻譜分析后,頻率最高的就是 噪聲,把 這個 imf 以外的 imf 相加,就可以達到去燥效果;

import numpy as np
import matplotlib.pylab as plt
from PyEMD.EEMD import EEMD
from scipy.fft import fft


if __name__ == '__main__':
    t = np.linspace(0, 100, num=100)
    S = 3*np.sin(2*np.pi*10*t)      # 10HZ
    S += 5*np.sin(2*np.pi*4*t)      # 4HZ
    S += np.random.randn(100, )     # 白噪聲

    eemd = EEMD()
    imfs = eemd.eemd(S, T=t, max_imf=-1)
    print(imfs.shape)

    rows = 2 * imfs.shape[0] + 1

    ### 信號重構
    plt.subplot(311); plt.title('original')
    plt.plot(S)
    plt.subplot(312); plt.title('sum all imfs')
    sum_imf0 = np.sum(imfs, axis=0)
    plt.plot(sum_imf0)
    plt.subplot(313); plt.title('sum no noise imfs')
    sum_imf1 = np.sum(imfs[1:, :], axis=0)
    plt.plot(sum_imf1)
    plt.show()

可以看到 第 2 個圖 和 原始信號 基本一致;

第 3 個圖 明顯 光滑了,去燥的結果;

 

特征提取

這些 imf 具有不同的特征尺度,比 原始信號更有規律性;

我們可以對 這些 imf 進行特征提取,如 幅值、頻譜分析、樣本熵計算 等;

 

接上面的代碼,進行頻譜分析;

    plt.subplot(rows, 1, 1)
    plt.plot(S)

    for i in range(imfs.shape[0]):
        plt.subplot(rows, 1, i*2+2)
        plt.plot(imfs[i])                   # imf 分量
        y_fft = np.abs(fft(imfs[i]))        # 傅里葉變換進行頻譜分析
        plt.subplot(rows, 1, i * 2 + 3)
        plt.plot(y_fft, 'r')

    plt.show()

 

輸出:第一個圖是原始信號,后面 的 依次為  imf 分量 和 這個 imf 對應的 頻譜(紅色)

第一個 imf 分量 就是 白噪聲,高頻;

第二個 imf 分量 為 10HZ 的正弦波,頻譜圖 在 10HZ 處 凸起;

第三個 imf 分量 為 4HZ 的正弦波; 

 

殘差的應用

 

 

 

 

 

參考資料:

https://zhuanlan.zhihu.com/p/40005057  這篇文章能讓你明白經驗模態分解(EMD)——基礎理論篇

https://zhuanlan.zhihu.com/p/44833026  這篇文章能讓你明白經驗模態分解(EMD)——IMF的物理含義


免責聲明!

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



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