memd — Multivariate Empirical Mode Decomposition algorithm for signals cotaining 3-16 channels.
imf = memd(X) imf = memd(X,num_directions) imf = memd(X,num_directions,'stopping criteria' imf = memd(X, num_directions, 'stop', stop_vec) imf = memd(X, num_directions, 'fix_h', n_iter)
function NEMD applies the "Multivariate Empirical Mode Decomposition" algorithm (Rehman and Mandic, Proc. Roy. Soc A, 2010) to multivariate inputs. We have verified this code by simulations for signals cotaining 3-16 channels.
imf = NEMD(X) returns a 3D matrix 'imf(N,M,L)' containing M multivariate IMFs, one IMF per column, computed by applying the multivariate EMD algorithm on the N-variate signal (time-series) X of length L. - For instance, imf_k = IMF(k,:,:) returns the k-th component (1 <= k <= N) for all of the N-variate IMFs.
For example, for hexavariate inputs (N=6), we obtain a 3D matrix IMF(6, M, L) where M is the number of IMFs extracted, and L is the data length.
imf = NEMD(X,num_directions) where integer variable num_directions (>= 1) specifies the total number of projections of the signal - As a rule of thumb, the minimum value of num_directions should be twice the number of data channels, - for instance, num_directions = 6 for a 3-variate signal and num_directions= 16 for an 8-variate signal The default number of directions is chosen to be 128 - to extract meaningful IMFs, the number of directions should be considerably greater than the dimensionality of the signals
imf = NEMD(X,num_directions,'stopping criteria') uses the optional parameter 'stopping criteria' to control the sifting process. The available options are - 'stop' which uses the standard stopping criterion specified in [2] - 'fix_h' which uses the modified version of the stopping criteria specified in [3] The default value for the 'stopping criteria' is 'stop'.
The settings num_directions=128 and 'stopping criteria' = 'stop' are defaults. Thus imf = NEMD(X) = NEMD(X,128) = NEMD(X,128,'stop') = NEMD(X,[],'stop'),
imf = NEMD(X, num_directions, 'stop', stop_vec) computes the IMFs based on the standard stopping criterion whose parameters are given in the 'stop_vec' - stop_vec has three elements specifying the threshold and tolerance values used, see [2]. - the default value for the stopping vector is step_vec = [0.075 0.75 0.075]. - the option 'stop_vec' is only valid if the parameter 'stopping criteria' is set to 'stop'.
imf = NEMD(X, num_directions, 'fix_h', n_iter) computes the IMFs with n_iter (integer variable) specifying the number of consecutive iterations when the number of extrema and the number of zero crossings differ at most by one [3]. - the default value for the parameter n_iter is set to n_iter = 5. - the option n_iter is only valid if the parameter 'stopping criteria' = 'fix_h'
This code allows to process multivaraite signals having 3-16 channels, using the multivariate EMD algorithm [1]. - to perform EMD on more than 16 channels, modify the variable 'Max_channels' on line 536 in the code accordingly. - to process 1- and 2-dimensional (univariate and bivariate) data using EMD, we recommend the toolbox from http://perso.ens-lyon.fr/patrick.flandrin/emd.html
Acknowledgment: Part of this code is based on the bivariate EMD code, publicly available from http://perso.ens-lyon.fr/patrick.flandrin/emd.html
Copyright: Naveed ur Rehman and Danilo P. Mandic, Oct-2009
[1] Rehman and D. P. Mandic, "Multivariate Empirical Mode Decomposition", Proceedings of the Royal Society A, 2010
[2] G. Rilling, P. Flandrin and P. Gonçalves, "On Empirical Mode Decomposition and its Algorithms", Proc of the IEEE-EURASIP Workshop on Nonlinear Signal and Image Processing, NSIP-03, Grado (I), June 2003
[3] N. E. Huang et al., "A confidence limit for the Empirical Mode Decomposition and Hilbert spectral analysis", Proceedings of the Royal Society A, Vol. 459, pp. 2317-2345, 2003
Case 1: inp = rand(1000,3,'normal'); imf = memd(inp); imf_x = matrix(imf(1,:,:).entries,size(imf,2),size(imf,3)); // imfs corresponding to 1st component imf_y = matrix(imf(2,:,:).entries,size(imf,2),size(imf,3)); // imfs corresponding to 2nd component imf_z = matrix(imf(3,:,:).entries,size(imf,2),size(imf,3)); // imfs corresponding to 3rd component Case 2: load syn_hex_inp.mat imf = memd(s6,256,'stop',[0.05 0.5 0.05])