File Exchange

image thumbnail

Variational Mode Decomposition

version (4.33 KB) by Dominique Zosso
Variationally decompose a 1D signal into k band-separated modes.


Updated 20 Dec 2013

View License

Spectrum-based decomposition of a 1D input signal into k band-separated modes. Here, we propose an entirely non-recursive variational mode decomposition model, where the modes are extracted concurrently. The model looks for an ensemble of modes and their respective center frequencies, such that the modes collectively reproduce the (1D) input signal, while each being smooth after demodulation into baseband. The variational model is efficiently optimized using an alternating direction method of multipliers approach.

Applications: signal decomposition in audio engineering, climate analysis, various flux and neuromuscular signal analysis in medicine and biology, etc.

This is a variational alternative to the empirical mode decomposition (EMD; Huang et al. 1998), or the empirical wavelet transform (EWT; Gilles 2013).

See: K. Dragomiretskiy and D. Zosso, Variational Mode Decomposition, IEEE Trans. Signal Processing (in press).

Cite As

Dominique Zosso (2020). Variational Mode Decomposition (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (48)

秀丽 殷

致 林

光正 zhang


@yang Chenguang Maybe your system conf. might not be supporting, just check with the "Maximum number of iterations" once! Hope that helps.

sama alshammari

Very thanks for sharing this code.

yang chenguang

When you run the VMD program, do you have any errors in VMD (line 108) for the out of memory?

xiao chen


Thank you for the wonderful code!!!
I need lil guidance regarding the mutual information between two adjacent modes. I mean, will they(any two adjacent modes) be mutually independent of each other or mutually dependent? please let me know

Muhammad Tariq Sadiq

Hi there, Let suppose I have 1 EEG channel and I want to generate 5 modes/IMF for this channel? how to do it? what are the criterias?

Daoshuang Geng

long C

Israel Ruiz

I would like to test your new version @Virgil Stokes :-), the effectiveness of this decomposition method is great!

Virgil Stokes

I would like to apologize to the authors for missing their explanation for mirroring in their seminal paper on VMD ( They also suggesed some alternatives for mirroring near the end of the paper. I am currently working on how to "improve" their code and comments that IMHO should make it more user friendly :-). I will make this code available to the authors.

Virgil Stokes

This contribution to File Exhange is appreciated since this is a rather complex algorithm. However, IMHO it should not have been submitted until it had been tested thoroughly by at least one competent MATLAB programmer. In general, this implementation of VMD is not written well. This includes: the use of a mirror of the input, inefficient loops, lack of information for the selection of important parameters, poor design of graphical outputs (e.g. scaling), etc. I would be glad to review this code when it has been refactored.

Wentao Zhao


I am applying this method for PPG data set . I have read your paper. how to select parameters alpha, tau, dc level, tolerence,

MC Hao


could you please help me with this.. the input to vmd is a row vector or column vector? i'm thoroughly confused. because each time I run the code for row vector as input, the reconstructed signals are not the same as the original component (vmd_test.m).
Same with column as input. Could you please shed some light on this..

Ziqiang Xu


Faisal Nawaz

how does this function be applicable on financial time series, what should be the value of the parameters:

signal - time series data
% alpha - the balancing parameter of the data-fidelity constraint
% tau - time-step of the dual ascent ( pick 0 for noise-slack )
% K - the number of modes to be recovered, say 2 if we want 2 series
% DC - true if the first mode is put and kept at DC (0-freq)
% init - 0 = all omegas start at 0
% 1 = all omegas start uniformly distributed
% 2 = all omegas initialized randomly
% tol


Hi there,What is meant by extending a signal by mirroring?
Authors implemented the follwing section of code,what it really do?
% extend the signal by mirroring
T = save_T;
f_mirror(1:T/2) = signal(T/2:-1:1);
f_mirror(T/2+1:3*T/2) = signal;
f_mirror(3*T/2+1:2*T) = signal(T:-1:T/2+1);
f = f_mirror;
Thank you in Advance!


Priya Das

In the code, what is the unit for Omega? Is it in Hz? I have to check whether the omega is below 1hz, but all omega values are below 1hz which cannot be possible for my signal. So is it normalized? If so, then how should I get the actual frequency value?

Muhammad Tariq Sadiq

@Na Sun can you please share your MATLAB codes? I want to decompose a time series into 7 modes

David Haslacher


Na Sun

thanks for your nice work!

Na Sun

Thanks for your nice work! I use this code to decompose a time series into 7 modes, but why I just got 5 modes the other two modes all are NAN.

xb zhang

thanks for your nice work!

mingyu xiao

Hi there, Let suppose I have 1 EEG channel and I want to generate 5 modes/IMF for this channel? how to do it? what are the criterias?


Yang Liu

LIU Landy

hesam akbari

hesam akbari

Hi dear Dominique Zosso
I'm have a question!
An algorithm that proposed by EWT,can be modify by VMD?
What about EMD?
What's the difference among EWT and VMD??
I want to modify a algorithm that is implemented by EWT for VMD.
"Please forgive me for my poor grammar"

hesam akbari


i am working on fault diagnosis data set of 1X256 data set in the format of .mat file. can anyone help me in this concern that how to provide a .mat file as an input to vmd code 1d.thank you


Is your EMD code in the cited paper available as well?


chunlin fu

thank for your generous offering

Nithya R .Menon

how does variational mode decomposition work?

Thanks for the post, I applied your method on a trending series (stock prices) and was able to reconstruct the original signal. However, when i apply the method on a stationary series (stock returns), the summation of modes is considerably less than the original signal. Is it that the approach is only adequate for a series with trend.

manas jena

Mahmoud Farout

very nice work.

Dominique Zosso

@Timothy Scharf:

there is no sharp rule for alpha, since the value essentially depends on the amplitude of signals and the noisiness of the data. Trial and error, mostly, I'm afraid.

For the tau (time step): this governs how quickly the Lagrangian multiplier accumulates the "reconstruction error". We have mostly worked with values of either 0 (no accumulation, the reconstruction is not strictly enforced, but encouraged in least-squares sense, allowing for the noise to go in these residuals), or around 0.1. Higher values might lead to overly fast "freezing" of the modes.

Hope that helps.

Timothy Scharf

Thank you for posting this.

I am tinkering around with your algorithm for EEG classification for seizure detection (in lieu of the very common EMD) .

I wonder if you could shed any light on the alpha (band width constraint) and tau (time-step) parameters? I have read and re-read the paper and still need a little guidance from the author. Thanks either way for posting


MATLAB Release Compatibility
Created with R2012a
Compatible with any release
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!