很多同學留言要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 中國
具體的內容這裏不展開講了,提示兩個地方:
- emd函數的返回值主要包括imf,residual,info這三個,imf即各模態分量值;residual爲殘差值;info中包括了該次分解的一些信息,比如imf數量、各分量的過零點數、各分量的極值數等,這些信息可能在有些應用中有着重要的作用。
- 通過“名稱-屬性”設置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”就能拿到啦,公衆號裏可能還會有更多有趣的東西分享。
歡迎持續關注我的專欄與信號處理有關的那些東東