VMD(变分模态分解)详解

VMD(变分模态分解)详解

目录

  1. 前言
  2. 背景及发展
  3. VMD 原理与数学基础
    1. 问题的提出
    2. 变分框架与能量最小化
    3. 中心频率与带宽定义
    4. 目标函数及约束
    5. 拉格朗日乘子法
    6. 频域迭代更新公式
  4. VMD 与 EMD/EEMD/CEEMDAN 等方法比较
  5. VMD 算法流程
  6. 主要参数的选择与影响
  7. 优点与不足
  8. 实际应用中需要注意的问题
  9. 示例代码
  10. 代码简要解读
  11. 参考资料

前言

在信号处理、时频分析、故障诊断等诸多领域,如何将一个复杂信号进行多分量分解,进而提取到其中所包含的不同频率成分,一直是重要且基础的研究方向。传统上,经验模态分解 (EMD) 及其改进方法(如 EEMD、CEEMDAN)在非线性、非平稳信号分析中有非常广泛的应用。然而它们也存在一些模态混叠端点效应算法鲁棒性较弱等不足。

变分模态分解(Variational Mode Decomposition,简称 VMD) 是 2014 年由 Dragomiretskiy 和 Zosso 提出的一种新的信号分解方法。与 EMD 系列不同,VMD 不再利用局部极值点和包络来进行筛选,而是直接在频域中引入带宽约束,通过变分优化的方式,对信号进行稳健且自适应的模态分解。相较于传统方法,VMD 更加稳定、参数可控且能够有效抑制模态混叠。它已被应用于机械故障诊断、经济时间序列分析、生物医学信号处理等领域。


背景及发展

  • EMD:由 Norden E. Huang 等人于 1998 年提出,原理直观,适合处理时变频率的非平稳信号。但 EMD 容易受到噪声影响,也常出现模态混叠(不同本征模态函数 “IMF” 混在一起,难以区分)的情况。
  • EEMD (Ensemble EMD):通过在 EMD 分解前多次加入白噪声,以抵消部分随机性,改善了模态混叠;但计算量大,且分解结果稳定性依赖噪声注入水平。
  • CEEMDAN:在 EEMD 基础上进一步改进,试图在每次分解后对噪声进行校正,但仍然是基于 EMD 的局部极值概念。
  • VMD:通过建立变分形式的能量最小化问题,直接在频域约束各模态的带宽,避免了依赖极值点筛选。从而在许多情况下分解结果更平滑、更具可解释性。

VMD 原理与数学基础

1. 问题的提出

我们希望将一个给定的信号 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=1Kuk(t).
VMD 的思路是:在保证各模态之和逼近 f ( t ) f(t) f(t) 的同时,要求各模态在其中心频率附近的带宽之和最小。这可以视为一个优化问题,通过变分法加以求解。

2. 变分框架与能量最小化

在变分模态分解里,我们把“带宽”刻画成模态信号的希尔伯特变换后移到基带的能量大小。设一个模态 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} ejωkt 将该模态搬移到基带。如果此时模态在频域集中,则其在基带附近呈现较少的高频分量,故称之为“带宽有限”。

3. 中心频率与带宽定义

对于第 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)))ejωkt] 22,
即看其瞬时能量在多大程度上延伸到高频,通过对该量求和并最小化,就能让各模态聚拢在各自的中心频率附近。

4. 目标函数及约束


{ ω 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=1K t[(δ(t)+πt1)uk(t)]ejωkt 22,
同时满足约束:
∑ k = 1 K u k ( t ) = f ( t ) . \sum_{k=1}^K u_k(t) = f(t). k=1Kuk(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) 进行希尔伯特变换(在实际实现中往往直接在频域上操作)。

5. 拉格朗日乘子法

为处理约束 ∑ 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=1K t[(δ(t)+πt1)uk(t)]ejωkt 22+λ(t)(f(t)k=1Kuk(t)),
在某些参考文献中也会引入一个因子 α \alpha α 来调整对带宽的惩罚强度,以及在误差项或约束项里加入二范数,这些细节略有不同,但思路一致:通过不断更新 u k ( t ) u_k(t) uk(t) ω k \omega_k ωk λ ( t ) \lambda(t) λ(t) 来迭代逼近最优解

6. 频域迭代更新公式

在具体实现时,常先对所有量进行傅里叶变换。记 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=1Ku^kn+1(ω)),
其中 τ \tau τ 是步长,用来控制更新速度。

通过反复交替更新每个模态及其中心频率,直至收敛或达到迭代上限,我们就能获得每一个 u k u_k uk(再逆傅里叶变换回到时域)。这套迭代在 Dragomiretskiy 和 Zosso 的原始论文里已给出比较详尽的数学推导和收敛性讨论。


VMD 与 EMD/EEMD/CEEMDAN 等方法比较

  1. 分解机制

    • EMD/EEMD/CEEMDAN:依赖信号局部极值点及包络估计来提取 IMF;具有自适应性,但容易出现模态混叠、端点效应以及对噪声敏感等问题。
    • VMD:将分解问题转化为一个频域带宽最小化的变分优化,天然具有频谱聚集的特性。
  2. 可控性与稳定性

    • EMD 系列:无需预先设定模态数,会自动分解出多层 IMF;但不同数据、不同参数(如插值方法、噪声水平)会导致差异。
    • VMD:需要指定模态数量 K K K,但分解更可控;迭代过程在多数情况下表现出较好的稳定性,对噪声具备相对更强的鲁棒性。
  3. 计算复杂度

    • EMD:主要开销在逐点寻峰、构造包络等,迭代次数不定;对于长信号或高采样率信号,也会比较耗时。
    • VMD:每一步迭代都要进行 FFT、逆 FFT 等频域操作,对大型数据也有开销,不过可以依靠 FFT 的高效并行来加速。
  4. 模态混叠

    • 传统 EMD:易出现同一 IMF 中混入其他频段成分。
    • VMD:通过中心频率与带宽约束,更易分离不同频段成分,减少混叠

VMD 算法流程

简化后的主要流程可以概括为:

  1. 初始化:设定模态数 K K K;初始化 u ^ k \hat{u}_k u^k(可为零或随机),初始化各中心频率 ω k \omega_k ωk(如可从频谱中取 K 个峰作为初值),初始化拉格朗日乘子 λ ^ \hat{\lambda} λ^
  2. 迭代过程
    1. 在频域中,固定其他模态与 ω i \omega_i ωi,更新第 k k k 个模态 u ^ k \hat{u}_k u^k
    2. 根据更新后的 u ^ k \hat{u}_k u^k 重新计算其中心频率 ω k \omega_k ωk
    3. 更新拉格朗日乘子 λ ^ \hat{\lambda} λ^
    4. 判断收敛条件(如两次迭代后模态或中心频率的变化量是否小于阈值),若满足则结束,否则继续迭代。
  3. 逆傅里叶变换:将最终得到的 u ^ k ( ω ) \hat{u}_k(\omega) u^k(ω) 变换回时域,得到各模态分量 u k ( t ) u_k(t) uk(t)
  4. 重构检查:可验证 ∑ k u k ( t ) \sum_k u_k(t) kuk(t) 是否逼近原信号 f ( t ) f(t) f(t) 或是否满足误差要求。

主要参数的选择与影响

  1. 模态数量 K K K
    • 必须手动指定或通过一些经验准则选取。若 K K K 过小,无法充分分解出不同成分;若 K K K 过大,可能产生过分解或引入不必要的“伪模态”。
  2. α \alpha α 惩罚系数
    • 控制带宽压缩程度。数值越大,越强调模态的带宽要更小,导致模态更平滑,但也可能对高频信息产生过度抑制;若 α \alpha α 太小,模态带宽约束变弱,容易导致分解结果震荡且不稳定。
  3. 初始中心频率 ω k \omega_k ωk
    • 若对信号有先验知识(如知道大约存在哪些频率成分),可选择更合理的初值,有助于更快收敛且避免局部极小。若不了解,可随机或均匀设置在 0 ~ (Nyquist 频率) 范围。
  4. 容差 tol \text{tol} tol 和最大迭代次数
    • 用于设置收敛精度和运算时间上限。
  5. 拉格朗日乘子更新步长 τ \tau τ
    • 影响乘子更新速度;选值过大或过小会影响收敛速度。

如何选参常常需要结合经验或进行少量试验。对于不同的信号, α \alpha α 等最佳值会存在差异。


优点与不足

优点

  1. 抗模态混叠:频域带宽控制能更好地把信号不同频率成分分离开来。
  2. 稳定性强:基于迭代收敛,结果在一定范围内比较可重复。
  3. 可控性高:可根据需要指定模态数、设置相应惩罚项。
  4. 适用非平稳信号:和 EMD 一样能处理非线性、非平稳信号,更适合复杂时变过程。

不足

  1. 需要先定 K K K:实际中可能并不知道信号包含多少固有模态,需要结合频谱分析或经验来决定。
  2. 计算量:每次迭代涉及多次 FFT,且要迭代若干次,若信号规模很大或对实时性要求高,可能比较耗时。
  3. 依赖初值:不恰当的初值设置可能导致局部极小或收敛慢。
  4. 仍有边界效应:在信号起止点附近,可能出现振荡或过冲。

实际应用中需要注意的问题

  1. 信号预处理:去除趋势项、归一化或滤波,能提高 VMD 效果并减少干扰。
  2. 端点延拓:如果信号在边缘波形变化剧烈,可考虑在分解前对两端做延拓,减小边界影响。
  3. 模态数选择
    • 可先做简单频谱分析,看是否能找到主要峰值或带宽范围;
    • 也可通过经验,如在 K 从 1 增加到某个值时,观察分解残差或目标函数(如频域带宽)的变化情况,达到一定稳定就可停止。
  4. α \alpha α 选择:尝试在若干典型值(如从较小到较大的指数变化)下观察分解质量、各模态分布、重构误差,再做决定。
  5. 多次实验:VMD 收敛到局部极小的可能性存在。若条件允许,可重复多次迭代,并选取最优结果。

示例代码

下面给出一个示例 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. 结果分析
# -----------------------------
# 亦可查看各模态的频谱,判断是否将不同频率成分分离

代码简要解读

  1. 信号合成
    • 以 5 Hz、50 Hz、120 Hz 为主频率的三个正弦分量叠加,并加入少量噪声,构成一个相对简单但包含多频率的测试信号。
  2. VMD 参数
    • alphaKtol 等是控制分解过程的重要参数;若信号更复杂,可以尝试不同 alphaK
  3. VMD() 函数
    • 来自 vmdpy 库,接受时域信号、一些控制参数和采样率,返回分解后的模态矩阵 u 和各模态的中心频率 omega
  4. 可视化
    • 依次绘制原信号和分解出的各模态,以直观观察结果。

参考资料

  1. Dragomiretskiy, K., & Zosso, D. (2014). Variational mode decomposition. IEEE Transactions on Signal Processing, 62(3), 531-544.
  2. Rehman, N., & Mandic, D. P. (2010). Empirical mode decomposition for trivariate signals. IEEE Transactions on Signal Processing, 58(3), 1059-1068. (关于 EMD 扩展的参考)
  3. Wu, Z., & Huang, N. E. (2009). Ensemble empirical mode decomposition: a noise-assisted data analysis method. Advances in Adaptive Data Analysis, 1(01), 1-41. (EEMD 原文献)
  4. Colominas, M. A., Schlotthauer, G., & Torres, M. E. (2014). Improved complete ensemble EMD: A suitable tool for biomedical signal processing. Biomedical Signal Processing and Control, 14, 19-29. (CEEMDAN 相关方法)

你可能感兴趣的:(波的分析方法,现代谱分析方法,音频处理,数据挖掘,信号处理,人工智能,信息与通信,数学建模)