訊號處理 -經驗模態分解 【2】
阿新 • • 發佈:2020-07-13
演算法實現起來比較簡單,參考 資料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的物理含義