Drop in replacement for vmdpy with fixes and improvements using the vmd-rs Rust crate.
VMD, aka Variational Mode Decomposition, is a signal processing tool that decompse the input signal into different band-limited IMFs.
Available on PyPI
pip install --upgrade vmdrs-py
numpy>=1.20
#%% Simple example: generate signal with 3 components + noise
import numpy as np
import matplotlib.pyplot as plt
from vmdrs_py import VMD
#. Time Domain 0 to T
T = 1000
fs = 1/T
t = np.arange(1,T+1)/T
freqs = 2*np.pi*(t-0.5-fs)/(fs)
#. center frequencies of components
f_1 = 2
f_2 = 24
f_3 = 288
#. modes
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))
f = v_1 + v_2 + v_3 + 0.1*np.random.randn(v_1.size)
#. some sample parameters for VMD
alpha = 2000 # moderate bandwidth constraint
tau = 0. # noise-tolerance (no strict fidelity enforcement)
K = 3 # 3 modes
DC = 0 # no DC part imposed
init = 1 # initialize omegas uniformly
tol = 1e-7
#. Run VMD
u, u_hat, omega = VMD(f, alpha, tau, K, DC, init, tol)
#. Visualize decomposed modes
plt.figure()
plt.subplot(2,1,1)
plt.plot(f)
plt.title('Original signal')
plt.xlabel('time (s)')
plt.subplot(2,1,2)
plt.plot(u.T)
plt.title('Decomposed modes')
plt.xlabel('time (s)')
plt.legend(['Mode %d'%m_i for m_i in range(u.shape[0])])
plt.tight_layout()
- Python >= 3.7
- Rustc
Rust compiler is needed since this project is compiled using Maturin.
pip install maturin
git clone https://github.com/jiafuei/vmdrs-py.git && cd vmdrs-py
maturin build --release
BLAS is used by ndarray, follow the instructions there and edit Cargo.toml.