Variational Mode Decomposition (1- or 2-dimensional)

vmd(data, alpha, tau, K, DC, init, tol, verbose = FALSE)

Arguments

data

either a vector or a matrix (of type numeric or integer)

alpha

a numeric value specifying the balancing parameter of the data-fidelity constraint

tau

a numeric value specifying the time-step of the dual ascent ( pick 0 for noise-slack )

K

a numeric value specifying the number of modes to be recovered

DC

a boolean. If true the first mode is put and kept at DC (0-freq)

init

a numeric value. This parameter differs depending on the input 'data' parameter (1-dimensional and 2-dimensional). See the details section for more information

tol

a numeric value specifying the tolerance of convergence criterion (typically this parameter is around 1e-6 for the 1-dimensional and 1e-7 for the 2-dimensional data)

verbose

a boolean. If TRUE then information will be printed in the console

Value

a list object of length three which includes the

  • 'u' (collection of decomposed modes)

  • 'u_hat' (spectra of the modes)

  • 'omega' (estimated mode center-frequencies) objects

Details

The 'init' parameter takes the following values for,

  • 1-dimensional data:

    • 0 = all omegas start at 0

    • 1 = all omegas start uniformly distributed

    • 2 = all omegas initialized randomly

  • 2-dimensional data:

    • 0 = all omegas start at 0

    • 1 = all omegas start initialized randomly

References

https://math.montana.edu/dzosso/code/

Examples


require(VMDecomp)

#..............
# 1-dimensional
#..............

N = 250

set.seed(1)
rand_unif = runif(n = N, min = 0, max = 1.0)

f_sig1 = 6 * rand_unif
f_sig2 = cos(x = 8 * pi * rand_unif)
f_sig3 = 0.5 * cos(x = 40 * pi * rand_unif)

f_sig = f_sig1 + f_sig2 + f_sig3

alpha = 2000
tau = 0
K = 3
DC = FALSE
init = 1
tol = 1e-6

set.seed(2)
res_1d = vmd(data = f_sig,
             alpha = alpha,
             tau = tau,
             K = K,
             DC = DC,
             init = init,
             tol = tol,
             verbose = FALSE)

#..............
# 2-dimensional
#..............

rows_cols = 10

set.seed(3)
data = matrix(runif(rows_cols^2), rows_cols, rows_cols)
alpha = 5000
tau = 0.25
K = 2
DC = TRUE
init = 1
tol = 1e-7

set.seed(4)
res_2d = vmd(data = data,
             alpha = alpha,
             tau = tau,
             K = K,
             DC = DC,
             init = init,
             tol = tol,
             verbose = FALSE)