1. 简述
VMD的目标是将实值输入信号 f f f分解为离散数量的子信号(模态) u k u_k uk 。我们先假设每个模态在一个中心频率 ω k \omega_k ωk周围是紧密的,也就是说这个模态包含的频率分量都在 ω k \omega_k ωk附近,而 ω k \omega_k ωk是随着分解来确定。
为了评估一个模态的带宽,提出以下方案:1)对于每个模态,通过希尔伯特变换计算相关的分析信号,以便获得单向频谱。2)对于每种模态,通过与调谐到相应估计中心频率的指数混频,将模态的频谱移至“基带”。3)现在通过解调信号的高斯平滑度,即梯度的平方范数来估计带宽。
得到的约束变分问题如下:
求解上述方程,得到模态 u k u_k uk的求解公式为:
中心频率 ω k \omega_k ωk的求解公式为:
2. 运算步骤
3.VMD分解之后的模态和原信号的关系
经过VMD分解之后的k个模态直接相加可以得到一个原信号的近似信号,两信号相减会有一个残差,这是因为对于一个实际信号不管分解多少次都不可能完全用分解出来的模态完全代表原信号。
所以在对分解出来的模态操作时不能忘记残差。
4. 源码解读
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 20 19:24:58 2019
@author: Vinícius Rezende Carvalho
"""
import numpy as np
def VMD(f, alpha, tau, K, DC, init, tol):
"""
u,u_hat,omega = VMD(f, alpha, tau, K, DC, init, tol)
Variational mode decomposition
Python implementation by Vinícius Rezende Carvalho - vrcarva@gmail.com
code based on Dominique Zosso's MATLAB code, available at:
https://www.mathworks.com/matlabcentral/fileexchange/44765-variational-mode-decomposition
Original paper:
Dragomiretskiy, K. and Zosso, D. (2014) ‘Variational Mode Decomposition’,
IEEE Transactions on Signal Processing, 62(3), pp. 531–544. doi: 10.1109/TSP.2013.2288675.
Input and Parameters:
---------------------
f - 即将被分解的一维时域信号
alpha - 数据保真度约束的平衡参数
tau - 双重上升的时间步长(为零噪声选择0)
K - 要被恢复的模态数量
DC - 如果将第一种模态置于并保持为直流(0频率),则为true
init - 0 = all omegas start at 0
1 = all omegas start uniformly distributed
2 = all omegas initialized randomly
tol - tolerance of convergence criterion; typically around 1e-6
收敛准则的容忍度; 通常在1e-6左右
Output:
-------
u - the collection of decomposed modes
分解模态的集合
u_hat - spectra of the modes
模态的频谱
omega - estimated mode center-frequencies
被估计的模态中心频率
omega 是一个矩阵,他储存了Niter-1组中心频率值,
形状为(Niter-1, K),Niter在vmdpy.py中定义,K为分解数量
omega矩阵储存了中心频率收敛过程中的数据,