推荐开源项目:vmdpy——Python中的变分模式分解工具

推荐开源项目:vmdpy——Python中的变分模式分解工具

vmdpy项目地址:https://gitcode.com/gh_mirrors/vm/vmdpy

在数据分析和信号处理的广阔天地里,【vmdpy】是一个不可或缺的新星。自2023年8月起,它正式成为【sktime】库的一部分,为时间序列分析带来了强大的功能支持。本文旨在向您详细介绍这个宝藏工具,让您的数据解析之旅更加顺遂。

项目介绍

vmdpy是基于Variational Mode Decomposition(变分模式分解,简称VMD)方法的Python实现。该方法源自Dragomiretskiy和Zosso于2014年的开创性工作。如同它的MATLAB前身,vmdpy能高效地将复杂信号分解成更简单、更容易理解的子信号或“模式”,对于信号处理和时序数据分析有着非凡的意义。

技术分析

vmdpy通过Python语言重构了原本的MATLAB工具箱,使得这一高级信号处理技术对广大Python开发者开放。它利用优化算法,自动寻找并分离信号中的不同频率成分,其核心在于处理非线性、非平稳信号,特别适用于多尺度信号的精确解耦。算法通过调整带宽约束、噪声容忍度等参数,灵活适应不同的信号特性,确保了分解结果的准确性与实用性。

应用场景

  • 信号去噪:通过VMD分解,可以识别并滤除信号中的噪声部分。
  • 故障检测:在工业监测中,可以将机器运行的声音或振动信号分解,从而识别出异常模式

vmdpy项目地址:https://gitcode.com/gh_mirrors/vm/vmdpy

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):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尚丽桃Kimball

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

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

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

打赏作者

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

抵扣说明:

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

余额充值