在信号处理、时频分析、故障诊断等诸多领域,如何将一个复杂信号进行多分量分解,进而提取到其中所包含的不同频率成分,一直是重要且基础的研究方向。传统上,经验模态分解 (EMD) 及其改进方法(如 EEMD、CEEMDAN)在非线性、非平稳信号分析中有非常广泛的应用。然而它们也存在一些模态混叠、端点效应、算法鲁棒性较弱等不足。
变分模态分解(Variational Mode Decomposition,简称 VMD) 是 2014 年由 Dragomiretskiy 和 Zosso 提出的一种新的信号分解方法。与 EMD 系列不同,VMD 不再利用局部极值点和包络来进行筛选,而是直接在频域中引入带宽约束,通过变分优化的方式,对信号进行稳健且自适应的模态分解。相较于传统方法,VMD 更加稳定、参数可控且能够有效抑制模态混叠。它已被应用于机械故障诊断、经济时间序列分析、生物医学信号处理等领域。
我们希望将一个给定的信号 f ( t ) f(t) f(t) 分解为若干个模态函数:
u k ( t ) , k = 1 , 2 , … , K , u_k(t), \quad k = 1,2,\dots, K, uk(t),k=1,2,…,K,
其中 K K K 是我们预先设定或估计的模态数量。每个模态 u k ( t ) u_k(t) uk(t) 在频域上近似集中在一个中心频率 ω k \omega_k ωk 附近,即这个模态“带宽”较小。最终,这些模态函数之和应能重构原信号:
f ( t ) ≈ ∑ k = 1 K u k ( t ) . f(t) \approx \sum_{k=1}^K u_k(t). f(t)≈k=1∑Kuk(t).
VMD 的思路是:在保证各模态之和逼近 f ( t ) f(t) f(t) 的同时,要求各模态在其中心频率附近的带宽之和最小。这可以视为一个优化问题,通过变分法加以求解。
在变分模态分解里,我们把“带宽”刻画成模态信号的希尔伯特变换后移到基带的能量大小。设一个模态 u k ( t ) u_k(t) uk(t) 的解析信号为:
u k ( t ) + j H { u k ( t ) } , u_k(t) + j \mathcal{H}\{u_k(t)\}, uk(t)+jH{uk(t)},
其中 H \mathcal{H} H{·} 表示希尔伯特变换。再通过乘以 e − j ω k t e^{-j\omega_k t} e−jωkt 将该模态搬移到基带。如果此时模态在频域集中,则其在基带附近呈现较少的高频分量,故称之为“带宽有限”。
对于第 k k k 个模态,假设它的中心频率为 ω k \omega_k ωk。在频域上,如果 U k ( ω ) U_k(\omega) Uk(ω) 表示 u k ( t ) u_k(t) uk(t) 的傅里叶变换,那么我们期望在 ω ≈ ω k \omega \approx \omega_k ω≈ωk 附近有主要能量。
以 Dragomiretskiy 等人的定义,衡量带宽可写成:
∥ ∂ t [ ( u k ( t ) + j H ( u k ( t ) ) ) e − j ω k t ] ∥ 2 2 , \left\| \partial_t \left[ \left(u_k(t) + j \mathcal{H}(u_k(t))\right) e^{-j \omega_k t}\right]\right\|_2^2, ∂t[(uk(t)+jH(uk(t)))e−jωkt] 22,
即看其瞬时能量在多大程度上延伸到高频,通过对该量求和并最小化,就能让各模态聚拢在各自的中心频率附近。
令
{ ω k } k = 1 K 为所有模态的中心频率集合 , \{\omega_k\}_{k=1}^K \quad \text{为所有模态的中心频率集合}, {ωk}k=1K为所有模态的中心频率集合,
{ u k ( t ) } k = 1 K 为所有模态函数集合 . \{u_k(t)\}_{k=1}^K \quad \text{为所有模态函数集合}. {uk(t)}k=1K为所有模态函数集合.
VMD 要最小化的目标函数可以写成:
min { u k } , { ω k } ∑ k = 1 K ∥ ∂ t [ ( δ ( t ) + 1 π t ) ∗ u k ( t ) ] e − j ω k t ∥ 2 2 , \min_{\{u_k\}, \{\omega_k\}} \sum_{k=1}^K \left\| \partial_t \left[ \left( \delta(t) + \frac{1}{\pi t}\right)* u_k(t)\right] e^{- j \omega_k t}\right\|_2^2, {uk},{ωk}mink=1∑K ∂t[(δ(t)+πt1)∗uk(t)]e−jωkt 22,
同时满足约束:
∑ k = 1 K u k ( t ) = f ( t ) . \sum_{k=1}^K u_k(t) = f(t). k=1∑Kuk(t)=f(t).
此处 ( δ ( t ) + 1 π t ) ∗ u k ( t ) \left(\delta(t) + \frac{1}{\pi t}\right)* u_k(t) (δ(t)+πt1)∗uk(t) 本质上是对 u k ( t ) u_k(t) uk(t) 进行希尔伯特变换(在实际实现中往往直接在频域上操作)。
为处理约束 ∑ k u k = f ( t ) \sum_k u_k = f(t) ∑kuk=f(t),定义拉格朗日函数:
L ( { u k } , { ω k } , λ ) = ∑ k = 1 K ∥ ∂ t [ ( δ ( t ) + 1 π t ) ∗ u k ( t ) ] e − j ω k t ∥ 2 2 + λ ( t ) ( f ( t ) − ∑ k = 1 K u k ( t ) ) , \mathcal{L}\big(\{u_k\}, \{\omega_k\}, \lambda\big) = \sum_{k=1}^K \left\| \partial_t \left[\left(\delta(t)+\frac{1}{\pi t}\right)* u_k(t)\right] e^{-j \omega_k t} \right\|_2^2 + \lambda(t) \left(f(t) - \sum_{k=1}^K u_k(t)\right), L({uk},{ωk},λ)=k=1∑K ∂t[(δ(t)+πt1)∗uk(t)]e−jωkt 22+λ(t)(f(t)−k=1∑Kuk(t)),
在某些参考文献中也会引入一个因子 α \alpha α 来调整对带宽的惩罚强度,以及在误差项或约束项里加入二范数,这些细节略有不同,但思路一致:通过不断更新 u k ( t ) u_k(t) uk(t)、 ω k \omega_k ωk 与 λ ( t ) \lambda(t) λ(t) 来迭代逼近最优解。
在具体实现时,常先对所有量进行傅里叶变换。记 u ^ k ( ω ) \hat{u}_k(\omega) u^k(ω) 表示 u k ( t ) u_k(t) uk(t) 的频域表示, f ^ ( ω ) \hat{f}(\omega) f^(ω) 表示原信号 f ( t ) f(t) f(t) 在频域的表示。而拉格朗日乘子 λ ^ ( ω ) \hat{\lambda}(\omega) λ^(ω) 则与约束对应。
在每一步迭代中,对第 k k k 个模态,我们先假设其他模态均已知并固定,然后在频域中更新 u ^ k ( ω ) \hat{u}_k(\omega) u^k(ω):
u ^ k n + 1 ( ω ) = f ^ ( ω ) − ∑ i ≠ k u ^ i n ( ω ) + 1 2 λ ^ n ( ω ) 1 + 2 α ( ω − ω k n ) 2 , \hat{u}_k^{n+1}(\omega) = \frac{\hat{f}(\omega) - \sum_{i \neq k}\hat{u}_i^n(\omega) + \frac{1}{2}\hat{\lambda}^n(\omega)} {1 + 2\alpha (\omega - \omega_k^n)^2}, u^kn+1(ω)=1+2α(ω−ωkn)2f^(ω)−∑i=ku^in(ω)+21λ^n(ω),
其中 α \alpha α 为惩罚项系数。更新完 u ^ k \hat{u}_k u^k 后,再计算新的中心频率:
ω k n + 1 = ∫ 0 ∞ ω ∣ u ^ k n + 1 ( ω ) ∣ 2 d ω ∫ 0 ∞ ∣ u ^ k n + 1 ( ω ) ∣ 2 d ω . \omega_k^{n+1} = \frac{\int_0^\infty \omega \left|\hat{u}_k^{n+1}(\omega)\right|^2 d\omega}{\int_0^\infty \left|\hat{u}_k^{n+1}(\omega)\right|^2 d\omega}. ωkn+1=∫0∞ u^kn+1(ω) 2dω∫0∞ω u^kn+1(ω) 2dω.
最后更新拉格朗日乘子:
λ ^ n + 1 ( ω ) = λ ^ n ( ω ) + τ ( f ^ ( ω ) − ∑ k = 1 K u ^ k n + 1 ( ω ) ) , \hat{\lambda}^{n+1}(\omega) = \hat{\lambda}^n(\omega) + \tau \Bigl(\hat{f}(\omega) - \sum_{k=1}^K \hat{u}_k^{n+1}(\omega)\Bigr), λ^n+1(ω)=λ^n(ω)+τ(f^(ω)−k=1∑Ku^kn+1(ω)),
其中 τ \tau τ 是步长,用来控制更新速度。
通过反复交替更新每个模态及其中心频率,直至收敛或达到迭代上限,我们就能获得每一个 u k u_k uk(再逆傅里叶变换回到时域)。这套迭代在 Dragomiretskiy 和 Zosso 的原始论文里已给出比较详尽的数学推导和收敛性讨论。
分解机制
可控性与稳定性
计算复杂度
模态混叠
简化后的主要流程可以概括为:
如何选参常常需要结合经验或进行少量试验。对于不同的信号, α \alpha α 等最佳值会存在差异。
下面给出一个示例 Python 代码,演示如何使用 vmdpy
库对信号进行 VMD 分解,以及如何可视化结果。该示例包含一些可调参数和可选可视化流程,供读者参考。若无 vmdpy
库,可自行下载或安装(pip install vmdpy
)。对于研究学习,也可查看该库的源码或实现自己的 VMD 程序。
import numpy as np
import matplotlib.pyplot as plt
# 如果已经安装 vmdpy 则可直接引用
# 若没有安装:pip install vmdpy
from vmdpy import VMD
# -----------------------------
# 1. 生成或导入示例信号
# -----------------------------
fs = 1000 # 采样率
t_max = 1.0 # 信号时长
t = np.linspace(0, t_max, int(fs * t_max), endpoint=False)
# 构造一个包含三种不同频率正弦+噪声的信号
f1 = 5 # 5 Hz
f2 = 50 # 50 Hz
f3 = 120 # 120 Hz
sig1 = np.sin(2 * np.pi * f1 * t)
sig2 = 0.4 * np.sin(2 * np.pi * f2 * t)
sig3 = 0.2 * np.sin(2 * np.pi * f3 * t)
# 加入随机噪声
noise = 0.1 * np.random.randn(len(t))
# 综合信号
f = sig1 + sig2 + sig3 + noise
# -----------------------------
# 2. VMD 参数设置
# -----------------------------
alpha = 2000 # 惩罚系数,控制带宽大小
tau = 0.0 # 拉格朗日乘子更新步长
K = 3 # 预设要分解的模态数
DC = 0 # 是否估计直流分量
init = 1 # 初始化方式 (1为全零)
tol = 1e-7 # 收敛阈值
# -----------------------------
# 3. 调用 VMD 分解
# -----------------------------
u, omega = VMD(f, alpha, tau, K, DC, init, tol, fs)
# u 形状 = (K, N),包含 K 个模态
# omega 是每个模态的中心频率 (单位: Hz),形状 = (K,)
print("Estimated center frequencies (Hz):", omega)
# -----------------------------
# 4. 可视化结果
# -----------------------------
plt.figure(figsize=(10,8))
# (a) 原信号
plt.subplot(K+1, 1, 1)
plt.plot(t, f, 'k')
plt.title("Original signal")
# (b) 各模态
for i in range(K):
plt.subplot(K+1, 1, i+2)
plt.plot(t, u[i,:], label=f"IMF {i+1}")
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
# -----------------------------
# 5. 结果分析
# -----------------------------
# 亦可查看各模态的频谱,判断是否将不同频率成分分离
alpha
、K
、tol
等是控制分解过程的重要参数;若信号更复杂,可以尝试不同 alpha
与 K
。VMD()
函数
vmdpy
库,接受时域信号、一些控制参数和采样率,返回分解后的模态矩阵 u
和各模态的中心频率 omega
。