Successive Variational Mode Decomposition
decomposeSVMD.RdExtracts variational modes one at a time from the whole signal, keeping the centers of the modes already extracted fixed, and stops after a known number of modes or when the residual power meets a known noise power.
Usage
decomposeSVMD(signal, samplingInterval, initialCenter = 0, alpha, maxAlpha,
tau, tolerance, maxIterations = 299, stopping)Arguments
- signal
Non-empty numeric vector of finite values without
dim, in the units of the quantity.- samplingInterval
Sampling interval \(\Delta t\) in seconds, a finite number greater than zero.
- initialCenter
Initial center of every mode in Hz, in \([0, 1/(2\Delta t)]\); default
0.- alpha
Initial penalty \(\alpha > 0\) in \(s^2\). No default.
- maxAlpha
Final penalty, at least
alpha, in \(s^2\); equal toalphagives a fixed penalty. No default. PySDKit uses 10 and 20000 for its denominator \(1 + 2 \alpha_\nu (\nu - \nu_L)^2\) on cycles per sample \(\nu\); a value \(\alpha_\nu\) there corresponds to \(\alpha_\nu \Delta t^2 / (4 \pi^2)\).- tau
Dual ascent step \(\tau \ge 0\). No default; PySDKit uses 0.
- tolerance
Threshold \(\epsilon_1 > 0\) of the relative change of the mode spectrum between inner iterations. No default; PySDKit uses
1e-6.- maxIterations
Whole number \(\ge 1\) of inner iterations for each value of the penalty; default
299. The defaults ofinitialCenterandmaxIterationsare those of the authors' svmd.m 1.1.1.- stopping
Named list with the field
stopRuleand exactly the fields of that rule:"modeCount"modeCount, the whole number of modes to extract, without default."noisePower"noisePower, the noise power \(\sigma^2 > 0\) in squared units of the signal;noiseTolerance, the dimensionless \(\epsilon_2 > 0\);maxModes, a whole number \(\ge 1\) orInf, defaultInf.
Details
The signal is extended and transformed as in decomposeVMD.
Mode \(L\) is extracted from the whole signal with the centers
\(\omega_1, \ldots, \omega_{L-1}\) of the previous modes fixed. Its
penalty starts at alpha and doubles while below maxAlpha;
when doubling would exceed maxAlpha, one last computation runs at
maxAlpha. Each penalty restarts the inner iteration from the
spectrum and center reached, with a zero multiplier and the penalty
\(H_{L-1}(\omega) = \sum_{i<L} 1 / (\alpha^2 (\omega - \omega_i)^4)\). With
\(A = \alpha^2 (\omega - \omega_L)^4\), the inner update is
$$\hat u_L \leftarrow \frac{\hat x + A \hat u_L + \hat\lambda / 2}{(1 + A)\left(1 + 2 \alpha (\omega - \omega_L)^2 + H_{L-1}\right)},$$
followed by the new center and the dual ascent, and it stops when the
relative change of \(\hat u_L\) is below tolerance or after
maxIterations. Extraction stops with "modeCount" after
modeCount modes; with "noisePower" when
\(|\sigma^2 - P_L| / \sigma^2 < \epsilon_2\), \(P_L\) the mean square of
the residual on the record; or with "modeLimit" after
maxModes modes without meeting it. With maxModes = Inf the
extraction under "noisePower" continues until the condition holds.
The modes keep the extraction order. Their bandwidth formulation does not
impose the geometrical IMF conditions of EMD.
Value
A list with
- modes
Double matrix, samples by modes, in extraction order.
- fitResidual
Numeric vector \(x - \sum_L u_L\).
- centers
Numeric vector of the centers in Hz.
- iterations
Integer vector by mode, the inner iterations of all its penalties.
- converged
Logical vector by mode,
TRUEwhen every inner loop of the mode met the change test.- stopReason
"modeCount","noisePower"or"modeLimit".
Conditions
A mode without spectral energy leaves its center undefined and stops the
function with an error of class xemdZeroEnergy.
References
Nazari, M. and Sakhaei, S. M. (2020). Successive variational mode decomposition. Signal Processing, 107610. doi:10.1016/j.sigpro.2020.107610
Examples
SamplingInterval <- 1 / 1000
Time <- seq_len(1000) * SamplingInterval
Signal <- cos(2 * pi * 2 * Time) + 0.25 * cos(2 * pi * 24 * Time) +
0.0625 * cos(2 * pi * 288 * Time)
OUT <- decomposeSVMD(Signal, samplingInterval = SamplingInterval,
initialCenter = 0,
alpha = 10 * SamplingInterval^2 / (4 * pi^2),
maxAlpha = 20000 * SamplingInterval^2 / (4 * pi^2),
tau = 0, tolerance = 1e-6, maxIterations = 299,
stopping = list(stopRule = "modeCount", modeCount = 5))
OUT$centers
#> [1] 1.999983 287.997040 278.041353 23.999702 297.789812
OUT$stopReason
#> [1] "modeCount"