matlab中使用VMD(變分模態分解)

原文鏈接:http://tecdat.cn/?p=12486


撥號音信號的變模分解

創建一個以4 kHz採樣的信號,類似於撥打數字電話的所有鍵。將信號另存爲MATLAB®時間數據。

fs = 4e3;
t = 0:1/fs:0.5-1/fs;

繪製時間表的變分模態分解。

多分量信號的VMD

生成由頻率爲2 Hz,10 Hz和30 Hz的三個正弦波組成的多分量信號。正弦波以1 kHz採樣2秒。將信號嵌入方差爲0.01²的高斯白噪聲中。

計算噪聲信號的IMF,並在3-D圖中可視化它們。

plot3(p,q,imf)
grid on
xlabel('Time Values')
ylabel('Mode Number')
zlabel('Mode Amplitude')

使用計算出的IMF繪製多分量信號的希爾伯特頻譜。將頻率範圍限制爲[0,40] Hz。

分段信號的VMD

生成一個由二次趨勢,線性調頻信號和餘弦組成的分段複合信號,在t  = 0.5時,兩個恆定頻率之間會發生急劇過渡  。

 

x(t)= 6t2 + cos(4πt+10πt2)+ {cos(60πt),cos(100πt-10π),t≤0.5,t> 0.5。

 

信號以1 kHz採樣1秒。繪製每個單獨的分量和複合信號。


plot(t,6*t.^2)
xlabel('Time (s)')
ylabel('Quadratic trend')

nexttile(5,[1 2])
plot(t,x)
xlabel('Time (s)')
ylabel('Signal')

執行變分模態分解以計算四個本徵模式函數。信號的四個不同分量得以恢復。

通過添加模式函數和殘差來重構信號。繪製並比較原始信號和重構信號。

plot(t,x,':','LineWidth',2)
xlabel('Time (s)')
ylabel('Signal')
hold off
legend('Reconstructed signal','Original signal', ...
       'Location','northwest')

計算原始信號與重構信號之間的差異的範數。

使用VMD從ECG信號中去除噪聲

在此示例中標記的信號來自MIT-BIH心律失常數據庫  [3]  (信號處理工具箱)。數據庫中的信號以360 Hz採樣。

加載與記錄200相對應的MIT數據庫信號並繪製該信號。

plot(tm,ecgsig)
ylabel('Time (s)')
xlabel('Signal')

ECG信號包含由心跳的節奏和振盪的低頻模式驅動的尖峯。ECG的不同輻條會產生重要的高次諧波。

計算開窗信號的九種固有模式函數,可視化IMF。

第一種模式包含最多的噪聲,第二種模式以心跳的頻率振盪。通過將除第一個和最後一個VMD模式之外的所有模式相加,構造一個乾淨的ECG信號,從而丟棄低頻基線振盪和大部分高頻噪聲。

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