這篇文章能讓你明白經驗模態分解(EMD)——EMD在MATLAB中的實現方法

很多同學留言要EMD的代碼,這篇文章就寫一下吧。

一、使用MATLAB自帶函數

如果你的MATLAB版本是2018a及更新版本,那麼是可以直接調用emd函數的。

以下代碼在MATLAB2019a中編寫,未在其他版本中測試。

load('sinusoidalSignalExampleData.mat','X','fs')  %載入數據
t = (0:length(X)-1)/fs;
plot(t,X)                       %繪製原始信號圖
xlabel('Time(s)') 
emd(X,'Interpolation','pchip')  %emd分解

得到原始信號圖如下圖,它是由不同的振幅和頻率的正弦信號疊加得到的。

原始信號

得到的EMD分解圖爲:

EMD分解結果

從title中可以看到,一種有9個IMF分量,而圖中只顯示了其中的IMF1~IMF3,如果要顯示其他分量,在圖片的空白處點擊右鍵:

然後選擇“IMF Selector”,打開如下界面:

從IMF Selector中可以選擇在圖片中顯示的IMF分量、原始信號和殘差值。

使用新版MATLAB的簡單emd的使用方法就是這樣,如果想要進一步使用emd的分解結果,可以查看MATLAB的官方文檔:Empirical mode decomposition - MATLAB emd - MathWorks 中國

具體的內容這裏不展開講了,提示兩個地方:

  1. emd函數的返回值主要包括imf,residual,info這三個,imf即各模態分量值;residual爲殘差值;info中包括了該次分解的一些信息,比如imf數量、各分量的過零點數、各分量的極值數等,這些信息可能在有些應用中有着重要的作用。
  2. 通過“名稱-屬性”設置emd分解屬性。比如上個例子中的'Interpolation','pchip',代表使用pchip的插值方法。除了設置插值方法,還可以設置篩選迭代的最大次數、IMF數量的最大值、殘差值中極值的最大數量等等參數。這部分屬於更高階的設置,同學們可以根據需要進行選擇。

二、使用EMD工具箱

有一個常用的EMD工具箱,由G-Rilling提供,在MATLAB2017及以下的版本中可以使用。當然在新版本的MATLAB中同樣可以安裝使用。

該工具箱與MATLAB自帶的emd函數相比,可以說各有千秋。在我們最常用的emd分解上來說,該工具箱不像自帶函數那樣有豐富的設置。其典型調用形式如下:

imf = emd(varargin)

相比新版MATLAB自帶函數來講,似乎有些簡陋,只能返回各分量的分解結果,無法自動畫圖。不過沒關係,沒有槍沒有炮我們自己造。

fs = 100;  %採樣頻率
t = 0:1/fs:10;
x = sin(20*pi*t);
y = 2*sin(1*pi*t);
sig = x+y;
PlotEMDandFFT(sig,fs)

其中PlotEMDandFFT是由筆者編寫的函數,輸入原始信號和採樣頻率,可以得到下圖:

EMD分解結果及各分量對應的頻譜

使用這個函數可以得到各IMF分量圖和對應的頻譜圖。由於加入了頻譜,從某中程度上來看這個圖比MATLAB自帶函數畫圖還要更好用一些。

要如何安裝這個工具箱呢,正常的方法是把工具箱添加到MATLAB的路徑中,不過有很多同學跟我說沒用過MATLAB,不知道怎樣添加路徑。於是博主把常用的三個跟EMD相關的工具箱(EMD/package_emd/TFTB)打包在一起,寫了個便捷安裝函數,可以實現一鍵安裝。

便捷安裝EMD工具箱

三、如何獲得工具箱和代碼

如果你的MATLAB版本不是2018或者2019,那麼可以使用第二種方法實現emd的功能。

如果想要獲取工具箱和PlotEMDandFF函數等代碼,關注我的公衆號“括號的城堡”,微信號爲“khscience”,回覆“EMD”就能拿到啦,公衆號裏可能還會有更多有趣的東西分享。

 

歡迎持續關注我的專欄與信號處理有關的那些東東

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章