1. 程式人生 > 實用技巧 >訊號處理 -經驗模態分解 【2】

訊號處理 -經驗模態分解 【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的物理含義