Previous Up Next

21.4.8  Empirical mode decomposition

Empirical mode decomposition (EMD) is an adaptive method for decomposing a nonstationary real signal into a sequence of intrinsic mode functions (IMFs). Each IMF will represent an intrinsic oscillation of the input signal and satisfies the following two conditions:

  1. The number of local extrema must be equal to the number of zero crossings or differ from it by at most one.
  2. The mean value of two envelopes interpolating local minima and local maxima, respectively, must be zero at any time.

The sequence of IMFs represents a nearly orthogonal basis for the input signal.

An IMF is extracted from the input signal by a technique referred to as sifting. In each iteration, the mean of the upper and lower envelope is subtracted from the input signal. The process ends when the variance of the mean vector is below a predefined threshold v0. Then the obtained IMF is subtracted from the original signal and the procedure is iteratively repeated until the number of local extrema goes below a predefined threshold (usually 2); the rest of the signal is called the residue or trend (it is not an IMF).

The emd command computes empirical mode decomposition (GSL is required for cubic spline interpolation).

A convenient way to visualize intrinsic mode functions is to use the plotimf command, which plots (a selection of) IMFs in a stacked layout, optionally including the input signal and/or the residue. imfplot is a synonym for plotimf.

Example

To define a synthetic non-stationary signal, enter:

f(t):=2t+cos(10t^2+100t)+cos(60t)+cos(40t)+cos(t^2+20t)+cos(t^2/2+5t)+1:; plot(f(t),t=0..5)

To discretize the signal, enter:

synth:=apply(f,linspace(0,5,500)):;

Now compute EMD and output the total number of intrinsic mode functions:

imf,res:=emd(synth):; size(imf)
     
9           

To show the first four IMFs together with the residue and the original signal, enter:

imfplot(imf,residue=res,input=synth,count=4)

The first IMF captures the high-frequency oscillations which can be filtered by removing that component. Effectively, you sum all but the first IMF and also add the residue to obtain the filtered signal. The first IMF can be discarded by using the tail command.

listplot(res+sum(tail(imf)))

Previous Up Next