天天看點

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

來幫忙填坑了。

今天接着之前講過的EEMD和CEEMD,來介紹一下“類EMD”分解方法的第三篇。

1. CEEMDAN(自适應噪聲完備集合經驗模态分解)的概念

CEEMDAN[1](Complete Ensemble Empirical Mode Decomposition with Adaptive Noise)的中文名稱是自适應噪聲完備集合經驗模态分解,要注意這個方法并不是在CEEMD方法上改進而來的,而是從EMD的基礎上加以改進,同時借用了EEMD方法中加入高斯噪聲和通過多次疊加并平均以抵消噪聲的思想。

在試圖了解CEEMDAN算法流程之前,強烈建議先搞清楚EEMD算法的流程,然後對比一下EEMD和CEEMDAN的算法流程。請仔細對照下邊兩張流程圖:

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

EEMD分解方法流程圖

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

CEEMDAN方法流程圖

流程圖展示地很清楚了,簡單地描述EEMD與CEEMDAN的差別大概是:

EEMD方法是将添加白噪聲後的M個信号直接做EMD分解,然後相對應的IMF間直接求均值;

CEEMDAN方法是每求完一階IMF分量,又重新給殘值加入白噪聲(或白噪聲的IMF分量)并求此時的IMF分量均值,并逐次疊代。

點明幾個需要注意的地方:

1.如果最終rk也算一個IMF分量的話,上圖總共分解出了K+1個IMF分量;

2.圖中Ek​(∗)為利用EMD算法産生的第k階IMF分量,是以每次疊代添加都是最初始的那些白噪聲的IMF分量(第一次疊代添加的是原始白噪聲)。

3.上述流程圖的理論依據是[1],加入白噪聲部分的方法可能會與其他論文乃至代碼不同(這些方法中第一次疊代添加的是白噪聲的第1階分量,依次類推),不過鑒于論文[1]是方法提出者所寫,故采用。

CEEMDAN作為EEMD方法的改進型,它的優勢主要展現在以下幾個方面[1]:

1.完備性,即把分解後的各個分量相加能夠獲得原信号的性質。CEEMDAN在較小的平均次數下就可以有很好的完備性;而對于EEMD方法,較小的平均次數會導緻較差的完備性,也即CEEMD那篇文章裡提到的重構誤差會很大。

2.更快的計算速度,正是由于上一條,相較于EEMD該方法不需要太多的平均次數,可以有效提升程式運算速度。

3.更好的模态分解結果,EEMD分解可能會出現多個幅值很小的低頻IMF分量,這些分量對于信号分析意義不大,CEEMDAN方法可以減少這些分量數目。

2. CEEMDAN的程式設計實作

該方法的代碼在網上是可以找到的[2],不過鑒于專欄前期将“類EMD”方法的代碼做了統一格式的封裝,提升了調用格式的延續性和代碼易用性,實作便捷畫圖,是以這次也對CEEMDAN的代碼做了類似處理。封裝後的函數有兩個。

測試信号同樣使用前兩篇文章中的正弦信号與間斷性高頻脈沖合成的信号:

%% 1.生成仿真信号
fs = 400;  %采樣頻率
t = 0:1/fs:0.75; %時間軸
x = sin(2*pi*4*t); %低頻正弦信号
y = 0.5*sin(2*pi*120*t); %高頻正弦信号
for i = 1:length(t) %将高頻信号處理成間斷性
    if mod(t(i),0.25)>0.11&&mod(t(i),0.25)<0.12
    else
        y(i) = 0;
    end
end
sig = x+y; %信号疊加
figure('color','white')
plot(t,sig,'k') %繪制原始信号
           
類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

混合信号

(一)時域分解圖

function imf = pCEEMDAN(data,FsOrT,Nstd,NE,MaxIter)
% 畫信号CEEMDAN分解圖
% 輸入:
% data為待分解信号
% FsOrT為采樣頻率或采樣時間向量,如果為采樣頻率,該變量輸入單個值;如果為時間向量,該變量為與y相同長度的一維向量。如果未知采樣頻率,可設定為1
% Nstd為附加噪聲标準差與Y标準差之比
% NE為對信号的平均次數
% MaxIter:最大篩選疊代次數
% 輸出:
% imf為經CEEMDAN分解後的各imf分量值
% 例1:(FsOrT為采樣頻率)
% fs = 100;
% t = 1/fs:1/fs:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDAN(data,fs,0.2,100);
% 例2:(FsOrT為時間向量,需要注意此時FsOrT的長度要與y相同)
% t = 0:0.01:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDAN(data,t,0.2,100);
           

畫出的圖是這樣的:

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

(二)時域分解圖及對應頻譜圖

function imf = pCEEMDANandFFT(y,FsOrT,Nstd,NE,MaxIter)
% 畫信号CEEMDAN分解與各IMF分量頻譜對照圖
% 輸入:
% y為待分解信号
% FsOrT為采樣頻率或采樣時間向量,如果為采樣頻率,該變量輸入單個值;如果為時間向量,該變量為與y相同長度的一維向量
% Nstd為附加噪聲标準差與Y标準差之比
% NE為對信号的平均次數
% MaxIter:最大篩選疊代次數
% 輸出:
% imf為經CEEMDAN分解後的各imf分量值
% 例1:(FsOrT為采樣頻率)
% fs = 100;
% t = 1/fs:1/fs:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDANandFFT(y,fs,0.2,100);
% 例2:(FsOrT為時間向量,需要注意此時FsOrT的長度要與y相同)
% t = 0:0.01:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDANandFFT(y,t,0.2,100);
           

畫出的圖是這樣的:

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

上邊的測試代碼和封裝函數,包括工具箱都可以在公衆号(括号的城堡)中擷取,EMD、EEMD、CEEMD以及HHT相關的程式也有,程式設計不易,感謝支援~關于EMD、EEMD和HHT的相關介紹可以看這裡:

Mr.括号:這篇文章能讓你明白經驗模态分解(EMD)——EMD在MATLAB中的實作方法

Mr.括号:希爾伯特譜、邊際譜、包絡譜、瞬時頻率/幅值/相位——Hilbert分析衍生方法及MATLAB實作

Mr.括号:類EMD的“信号分解方法”及MATLAB實作(第一篇)——EEMD

Mr.括号:類EMD的“信号分解方法”及MATLAB實作(第二篇)——CEEMD

3. 更多

後續還會逐漸補充VMD以及小波分解、小波包分解、SWT、EWT等等“信号分解方法”,把這一系列做的盡量全面一些。有其他想讓部落客補充的也可以在評論區留言,合适的話會一起加入該系列豪華大餐哦~

類EMD的“信号分解方法”及MATLAB實作(第三篇)——CEEMDAN

參考

  1. ^ab Mar´ıa E. Torres ★, Marcelo A. Colominas ★, Gasto´n Schlotthauer ★, et al. A complete ensemble empirical mode decomposition with adaptive noise[C]// IEEE International Conference on Acoustics. IEEE, 2011.
  2. ^http://bioingenieria.edu.ar/grupos/ldnlys/metorres/re_inter.htm

繼續閱讀