上篇博文已經(jīng)講述了VMD的分解機(jī)制,關(guān)于其中的參數(shù),特別是分解層數(shù)如何確定的問題,這篇文章給出一個(gè)解決方法:最優(yōu)變分模態(tài)分解(OVMD),利用中心頻率法確定分解層數(shù)K,利用殘差指數(shù)指標(biāo)確定更新步長tau。
關(guān)于利用中心頻率法確定分解層數(shù)的文章,無論國內(nèi)還是國外都有較多的講述。這里直接上代碼。
tic
clc
clear all
load('IMF1_1.mat')
x=IMF1_1;
t=1:length(IMF1_1);
%--------- some sample parameters forVMD:對(duì)于VMD樣品參數(shù)進(jìn)行設(shè)置---------------
alpha = 2000; % moderate bandwidth constraint:適度的帶寬約束/懲罰因子
tau = 0.0244; % noise-tolerance (no strict fidelity enforcement):噪聲容限(沒有嚴(yán)格的保真度執(zhí)行)
K = 7; % modes:分解的模態(tài)數(shù)
DC = 0; % no DC part imposed:無直流部分
init = 1; % initialize omegas uniformly :omegas的均勻初始化
tol = 1e-7 ;
%--------------- Run actual VMD code:數(shù)據(jù)進(jìn)行vmd分解---------------------------
[u, u_hat, omega] = VMD(x, alpha, tau, K, DC, init, tol);
figure;
imfn=u;
n=size(imfn,1); %size(X,1),返回矩陣X的行數(shù);size(X,2),返回矩陣X的列數(shù);N=size(X,2),就是把矩陣X的列數(shù)賦值給N
for n1=1:n
subplot(n,1,n1);
plot(t,u(n1,:));%輸出IMF分量,a(:,n)則表示矩陣a的第n列元素,u(n1,:)表示矩陣u的n1行元素
ylabel(['IMF' ,int2str(n1)],'fontsize',11);%int2str(i)是將數(shù)值i四舍五入后轉(zhuǎn)變成字符,y軸命名
end
xlabel('樣本序列','fontsize',14,'fontname','宋體');
%時(shí)間\itt/s
toc;
%----------------------計(jì)算中心頻率確定分解個(gè)數(shù)K-----------------------------
#####################;%求矩陣列的平均值
average即為計(jì)算得出的中心頻率,因?yàn)槭且_定分解層數(shù),所以需要我們從K=1開始,不斷增加輸入,每輸入一個(gè)K值就進(jìn)行一次計(jì)算。最后輸入的K值是幾,比如說最后K=5,或者K=11,這個(gè)不能確定,要看具體的處理結(jié)果??梢源_定K值的依據(jù)為:一旦出現(xiàn)相似頻率,此時(shí)的K值被確定為最佳K值。
通過上述代碼計(jì)算,我們計(jì)算出不同k值下的中心頻率的結(jié)果:
注意看,我們觀察各分解情況下,各層分解最后的數(shù)值,可以看到,當(dāng)分解層數(shù)為7的時(shí)候,中心頻率已經(jīng)穩(wěn)定下來了,數(shù)值為0.457155,當(dāng)分解層數(shù)為8時(shí),中心頻率的數(shù)值為0.457612,當(dāng)分解層數(shù)為9時(shí),中心頻率為0.457802。所以確定分解的層數(shù)為7。
確定了VMD的分解層數(shù)之后,可以進(jìn)一步確定另一個(gè)參數(shù)tau,這里只有確定了分解層數(shù)后,才能確定tau的具體數(shù)值。具體的方法為殘差指數(shù)法(REI)。具體可以參考這個(gè)文獻(xiàn):ShortTerm?Wind?Speed?Forecast?With?Low?Loss?of?Information?Based?on?Feature?Generation?of?OSVDhttps://www.webofscience.com/wos/woscc/full-record/WOS:000474609400001
相應(yīng)具體的公式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
這里簡要解釋一下具體的含義,U表示各分解模態(tài)數(shù),f表示原始信號(hào),N表示信號(hào)的個(gè)數(shù)。所以這個(gè)公式可以簡單理解為各分解模態(tài)加起來與原始信號(hào)相比,求最小,以最接近原始信號(hào)。下面直接上代碼:
?這個(gè)代碼實(shí)際上,在確定tau的范圍后,做一個(gè)循環(huán),不斷進(jìn)行VMD分解,以求REI達(dá)到最小值。根據(jù)文獻(xiàn),tau的范圍為0到1,其中步長為0.01。這里再次提醒一下,要先確定分解層數(shù),比如上述代碼中的分解層數(shù)為7.輸入K=7后,進(jìn)行下面的迭代運(yùn)算。運(yùn)算結(jié)果如下:
這里在tau中找到那個(gè)最小值,即為我們要選取的參數(shù)tau的數(shù)值。找到最小值的操作,可以在MATLAB中直接找尋,也可以將數(shù)值導(dǎo)入到EXCEL中進(jìn)行尋找。
這里把tau直觀化:
這樣分解層數(shù)K和更新步長tau都找到了,將數(shù)值帶入到VMD分解中,進(jìn)行計(jì)算就OK了。文章來源:http://www.zghlxwxcb.cn/news/detail-403851.html
如果想進(jìn)一步詳細(xì)了解,可閱讀上面的那篇文獻(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-403851.html
到了這里,關(guān)于VMD如何確定分解層數(shù)(一):最優(yōu)變分模態(tài)分解(OVMD)---VMD分解的基礎(chǔ)上確定分解層數(shù)和更新步長的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!