變分模態(tài)分解(VMD)-Python代碼
1、 VMD原理
變分模態(tài)分解(VMD)的原理推薦兩個(gè)參考連接 變分模態(tài)分解原理步驟和VMD算法的介紹文章來源:http://www.zghlxwxcb.cn/news/detail-573935.html
2、 VMD代碼
代碼可直接運(yùn)行文章來源地址http://www.zghlxwxcb.cn/news/detail-573935.html
import numpy as np
import matplotlib.pyplot as plt
from vmdpy import VMD
# -----測(cè)試信號(hào)及其參數(shù)--start-------------
Fs=1000 # 采樣頻率
N=1000 # 采樣點(diǎn)數(shù)
t=np.arange(1,N+1)/N
fre_axis=np.linspace(0,Fs/2,int(N/2))
f_1=100;f_2=200;f_3=300
v_1=(np.cos(2*np.pi*f_1*t));v_2=1/4*(np.cos(2*np.pi*f_2*t));v_3=1/16*(np.cos(2*np.pi*f_3*t))
v=[v_1,v_2,v_3] # 測(cè)試信號(hào)所包含的各成分
f=v_1+v_2+v_3+0.1*np.random.randn(v_1.size) # 測(cè)試信號(hào)
# -----測(cè)試信號(hào)及其參數(shù)--end----------
# alpha 懲罰系數(shù);帶寬限制經(jīng)驗(yàn)取值為抽樣點(diǎn)長(zhǎng)度1.5-2.0倍.
# 懲罰系數(shù)越小,各IMF分量的帶寬越大,過大的帶寬會(huì)使得某些分量包含其他分量言號(hào);
# a值越大,各IMF分量的帶寬越小,過小的帶寬是使得被分解的信號(hào)中某些信號(hào)丟失該系數(shù)常見取值范圍為1000~3000
alpha=2000
tau=0 # tau 噪聲容限,即允許重構(gòu)后的信號(hào)與原始信號(hào)有差別。
K=3 # K 分解模態(tài)(IMF)個(gè)數(shù)
DC=0 # DC 若為0則讓第一個(gè)IMF為直流分量/趨勢(shì)向量
init=1 # init 指每個(gè)IMF的中心頻率進(jìn)行初始化。當(dāng)初始化為1時(shí),進(jìn)行均勻初始化。
tol=1e-7 # 控制誤差大小常量,決定精度與迭代次數(shù)
u, u_hat, omega = VMD(f, alpha, tau, K, DC, init, tol) # 輸出U是各個(gè)IMF分量,u_hat是各IMF的頻譜,omega為各IMF的中心頻率
# 1 畫原始信號(hào)和它的各成分
plt.figure(figsize=(10,7));plt.subplot(K+1, 1, 1);plt.plot(t,f)
for i,y in enumerate(v):
plt.subplot(K+1, 1, i+2);plt.plot(t,y)
plt.suptitle('Original input signal and its components');plt.show()
# 2 分解出來的各IMF分量
plt.figure(figsize=(10,7))
plt.plot(t,u.T);plt.title('all Decomposed modes');plt.show() # u.T是對(duì)u的轉(zhuǎn)置
# 3 各IMF分量的fft幅頻圖
plt.figure(figsize=(10, 7), dpi=80)
for i in range(K):
plt.subplot(K, 1, i + 1)
fft_res=np.fft.fft(u[i, :])
plt.plot(fre_axis,abs(fft_res[:int(N/2)])/(N/2))
plt.title('(FFT) amplitude frequency of IMF {}'.format(i + 1))
plt.show()
# 4 分解出來的各IMF分量的頻譜
# print(u_hat.shape,t.shape,omega.shape)
plt.figure(figsize=(10, 7), dpi=80)
for i in range(K):
plt.subplot(K, 1, i + 1)
plt.plot(fre_axis,abs(u_hat[:, i][int(N/2):])/(N/2))
plt.title('(VMD)amplitude frequency of the modes{}'.format(i + 1))
plt.tight_layout();plt.show()
# 5 各IMF的中心頻率
plt.figure(figsize=(12, 7), dpi=80)
for i in range(K):
plt.subplot(K, 1, i + 1)
plt.plot(omega[:,i]) # X軸為迭代次數(shù),y軸為中心頻率
plt.title('mode center-frequencies{}'.format(i + 1))
plt.tight_layout();plt.show()
plt.figure(figsize=(10,7))
plt.plot(t,np.sum(u,axis=0))
plt.title('reconstructed signal')
以上就是所有內(nèi)容,感謝敢看!求三連!
到了這里,關(guān)于變分模態(tài)分解(VMD)-Python代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!