中心频率法确认VMD的K值的python实现

本文介绍了利用中心频率法确定变分模态分解(VMD)算法中K值的原理和步骤。VMD是一种信号分解方法,通过求解变分问题找到信号的模态分量。文章详细阐述了VMD的基本步骤,并提供了Python代码实现,展示不同K值下中心频率的变化,建议选择间隔较大的K值以确保更好的分解效果。
摘要由CSDN通过智能技术生成
  1. 变分模态分解VMD

1.1原理

VMD算法是利用VMD是一种新的信号分解方法,就是求解变分问题。首先构造变分问题,将信号f分解为K个IMF分量,且每个模态分量都有各自的中心频率,同时求解模态的估计带宽之和最小值,约束条件为所有模态分量之和与原始信号相等。

算法认为所有分量都是集中在各自中心频率附近的窄带信号, 根据分量窄带条件建立约束优化问题,从而估计信号分量的中心频率和子信号。

1.2 基本步骤

(1) 利用Hilbert变换求解析信号;

(2)将信号平移到基带;

(3)梯度的2范数的平方来估计信号的带宽。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
import numpy as np from numba import jit @jit def VMD(signal, fs, T, alpha, tau, K, DC, init, tol): f_mirror = np.zeros((2*T)) for i in range(T//2): f_mirror[i] = signal[T//2-1-i] for k in range(T//2, 3*T//2): f_mirror[k] = signal[k - T // 2] for l in range(3*T//2, 2*T): f_mirror[l] = signal[5*T//2-l-1] f = f_mirror T = len(f) t = np.arange(1, T+1, 1)/T freqs = t - 0.5 - 1.0 / T freqs = freqs + 0.j N = 500 Alpha = alpha * np.ones((1, K)) Alpha = Alpha + 0.j f_hat = np.fft.fftshift(np.fft.fft(f)) f_hat_plus = f_hat for l in range(0, T//2): f_hat_plus[l] = 0 u_hat_plus = np.zeros((N, T, K)) u_hat_plus = u_hat_plus + 0.j omega_plus = np.zeros((N, K)) # 生成N行K列的数组,元素为0, 500*3 omega_plus = omega_plus + 0.j if init == 1: for i in range(0, K): omega_plus[0][i] = 0.5/K*i elif init == 2: omega_plus[0, :] = np.sort(np.exp(np.log(fs)) + (np.log(0.5)-np.log(fs))*np.random.rand(0, K)) else: omega_plus[0, :] = 0 if DC: omega_plus[0, 0] = 0 else: pass # 从空双变量开始 lambda_hat = np.zeros((N, T)) # lambda_hat = lambda_hat + 0.j # 其他参数初始化 uDiff = tol + 2.77555756e-17 # 更新步长 n = 1 # 循环计数 sum_uk = 0.j # 器材累加 while uDiff > tol and n < N : # 表示没有收敛或低于迭代次数,其中,n和K都从1开始 # 更新第一阶模态累加器 k = 0 sum_uk = u_hat_plus[n-1, :, K-1] + sum_uk - u_hat_plus[n-1, :, 0] # sum_uk此时还是一维数组 # print(sum_uk) # ------------------------ ----检验专用----------------------- # 通过残差维纳滤波器更新第一模态的频谱 u_hat_plus[n, :, k] = (f_hat_plus - sum_uk - lambda_hat[n - 1, :] / 2.0) / (1 + Alpha[0, k]*(freqs - omega_plus[n-1, k])**2) if ~DC: omega_plus[n, k] = np.dot(freqs[T//2: T], ((abs(u_hat_plus[n, T//2:T, k])).reshape(T//2, 1))**2) / sum((abs(u_hat_plus[n, T//2:T, k]))**2) for k in range(1, K):
VMD(Variational Mode Decomposition)是一种用于信号分解的方,可以将复杂的非平稳信号分解成一系列局部时频模态。而VMD分解中心频率是基于VMD算法的一种拓展,用于提取信号中每个模态的中心频率。 在Python中,可以使用PyEMD库中的vmd实现VMD分解中心频率。首先,需要安装PyEMD库,可以使用pip install pyemd命令进行安装。 在使用VMD分解中心频率之前,我们需要导入必要的库和数据。假设我们的信号数据存储在一个一维数组signal中。 ```python import numpy as np from PyEMD import EMD # 导入信号数据 signal = np.array([1, 2, 3, 4, 5, 4, 3, 2, 1]) ``` 接下来,我们可以使用EMD类中的vmd进行VMD分解,并获取每个模态的中心频率。在vmd中,我们可以设置一些相关参数,例如 scales 表示输入信号的尺度范围。 ```python # 使用 vmd进行 VMD 分解 emd = EMD() imfs, centers = emd.vmd(signal, scales=[2, 4, 8]) ``` 得到imfs和centers后,imfs是一个二维数组,存储了每个模态的具体数。centers是一个一维数组,存储了每个模态的中心频率。 最后,我们可以打印出每个模态的中心频率。 ```python # 打印每个模态的中心频率 for i, center in enumerate(centers): print(f"模态{i+1}的中心频率为:{center}") ``` 使用VMD分解中心频率可以帮助我们分析信号的局部时频特性,对于一些非平稳信号的处理具有很大的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

似水不惧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值