Documentation

# emd

Empirical mode decomposition

## Syntax

``[imf,residual] = emd(X)``
``[imf,residual,info] = emd(X)``
``[___] = emd(___,Name,Value)``
``emd(___)``

## Description

example

````[imf,residual] = emd(X)` returns intrinsic mode functions `imf` and residual signal `residual` corresponding to the empirical mode decomposition of `X`. Use `emd` to decompose and simplify complicated signals into a finite number of intrinsic mode functions required to perform Hilbert-spectral analysis.```

example

````[imf,residual,info] = emd(X)` returns additional information `info` on IMFs and residual signal for diagnostic purposes.```

example

````[___] = emd(___,Name,Value)` estimates emd with additional options specified by one or more `Name,Value` pair arguments.```

example

````emd(___)` plots the original signal, IMFs, and residual signal as subplots in the same figure.```

## Examples

collapse all

Load and visualize a nonstationary continuous signal composed of sinusoidal waves with a distinct change in frequency. The vibration of a jackhammer and the sound of fireworks are examples of nonstationary continuous signals. The signal is sampled at a rate `fs`.

```load('sinusoidalSignalExampleData.mat','X','fs') t = (0:length(X)-1)/fs; plot(t,X) xlabel('Time(s)')``` The mixed signal contains sinusoidal waves with different amplitude and frequency values.

To create the Hilbert spectrum plot, you need the intrinsic mode functions (IMFs) of the signal. Perform empirical mode decomposition to compute the IMFs and residuals of the signal. Since the signal is not smooth, specify '`pchip`' as the interpolation method.

`[imf,residual,info] = emd(X,'Interpolation','pchip');`
```Current IMF | #Sift Iter | Relative Tol | Stop Criterion Hit 1 | 2 | 0.026352 | SiftMaxRelativeTolerance 2 | 2 | 0.0039573 | SiftMaxRelativeTolerance 3 | 1 | 0.024838 | SiftMaxRelativeTolerance 4 | 2 | 0.05929 | SiftMaxRelativeTolerance 5 | 2 | 0.11317 | SiftMaxRelativeTolerance 6 | 2 | 0.12599 | SiftMaxRelativeTolerance 7 | 2 | 0.13802 | SiftMaxRelativeTolerance 8 | 3 | 0.15937 | SiftMaxRelativeTolerance 9 | 2 | 0.15923 | SiftMaxRelativeTolerance The decomposition stopped because the number of extrema of the residual signal is less than 'MaxNumExtrema'. ```

The table generated in the command window indicates the number of sift iterations, the relative tolerance, and the sift stop criterion for each generated IMF. This information is also contained in `info`. You can hide the table by adding the `'Display',0` name value pair.

Create the Hilbert spectrum plot using the `imf` components obtained using empirical mode decomposition.

`hht(imf,fs)` The frequency versus time plot is a sparse plot with a vertical color bar indicating the instantaneous energy at each point in the IMF. The plot represents the instantaneous frequency spectrum of each component decomposed from the original mixed signal. Three IMFs appear in the plot with a distinct change in frequency at 1 second.

This trigonometric identity presents two different views of the same physical signal:

$\frac{5}{2}\mathrm{cos}\text{\hspace{0.17em}}\mathrm{2}\pi {\mathit{f}}_{1}\mathit{t}+\text{\hspace{0.17em}}\frac{1}{4}\left(\mathrm{cos}\text{\hspace{0.17em}}2\pi \left({\mathit{f}}_{1}+{\mathit{f}}_{2}\right)t+\mathrm{cos}\text{\hspace{0.17em}}2\pi \left({\mathit{f}}_{1}-{\mathit{f}}_{2}\right)t\right)\text{\hspace{0.17em}}=\left(2+\mathrm{cos}{\text{\hspace{0.17em}}}^{2\text{\hspace{0.17em}}}\pi \text{\hspace{0.17em}}{\mathit{f}}_{2\text{\hspace{0.17em}}}\mathit{t}\right)\text{\hspace{0.17em}}\mathrm{cos}\text{\hspace{0.17em}}2\pi \text{\hspace{0.17em}}{\mathit{f}}_{1\text{\hspace{0.17em}}}\mathit{t}$.

Generate two sinusoids, `s` and `z`, such that `s` is the sum of three sine waves and `z` is a single sine wave with a modulated amplitude. Verify that the two signals are equal by calculating the infinity norm of their difference.

```t = 0:1e-3:10; omega1 = 2*pi*100; omega2 = 2*pi*20; s = 0.25*cos((omega1-omega2)*t) + 2.5*cos(omega1*t) + 0.25*cos((omega1+omega2)*t); z = (2+cos(omega2/2*t).^2).*cos(omega1*t); norm(s-z,Inf) ```
```ans = 3.2729e-13 ```

Plot the sinusoids and select a 1-second interval starting at 2 seconds.

```plot(t,[s' z']) xlim([2 3]) xlabel('Time (s)') ylabel('Signal')``` Obtain the spectrogram of the signal. The spectrogram shows three distinct sinusoidal components. Fourier analysis sees the signals as a superposition of sine waves.

`pspectrum(s,1000,'spectrogram','TimeResolution',4)` Use `emd` to compute the intrinsic mode functions (IMFs) of the signal and additional diagnostic information. The function by default outputs a table that indicates the number of sifting iterations, the relative tolerance, and the sifting stop criterion for each IMF. Empirical mode decomposition sees the signal as `z`.

`[imf,~,info] = emd(s);`
```Current IMF | #Sift Iter | Relative Tol | Stop Criterion Hit 1 | 1 | 1.8025e-06 | SiftMaxRelativeTolerance The decomposition stopped because the current energy ratio is greater than 'MaxEnergyRatio'. ```

The number of zero crossings and local extrema differ by at most one. This satisfies the necessary condition for the signal to be an IMF.

`info.NumZerocrossing - info.NumExtrema`
```ans = 1 ```

Plot the IMF and select a 0.5-second interval starting at 2 seconds. The IMF is an AM signal because `emd` views the signal as amplitude modulated.

```plot(t,imf) xlim([2 2.5]) xlabel('Time (s)') ylabel('IMF')``` Simulate a vibration signal from a damaged bearing. Perform empirical mode decomposition to visualize the IMFs of the signal and look for defects.

A bearing with a pitch diameter of 12 cm has eight rolling elements. Each rolling element has a diameter of 2 cm. The outer race remains stationary as the inner race is driven at 25 cycles per second. An accelerometer samples the bearing vibrations at 10 kHz.

```fs = 10000; f0 = 25; n = 8; d = 0.02; p = 0.12;``` The vibration signal from the healthy bearing includes several orders of the driving frequency.

```t = 0:1/fs:10-1/fs; yHealthy = [1 0.5 0.2 0.1 0.05]*sin(2*pi*f0*[1 2 3 4 5]'.*t)/5;```

A resonance is excited in the bearing vibration halfway through the measurement process.

`yHealthy = (1+1./(1+linspace(-10,10,length(yHealthy)).^4)).*yHealthy;`

The resonance introduces a defect in the outer race of the bearing that results in progressive wear. The defect causes a series of impacts that recur at the ball pass frequency outer race (BPFO) of the bearing:

`$BPFO=\frac{1}{2}n{f}_{0}\left[1-\frac{d}{p}\mathrm{cos}\theta \right],$`

where ${f}_{0}$ is the driving rate, $n$ is the number of rolling elements, $d$ is the diameter of the rolling elements, $p$ is the pitch diameter of the bearing, and $\theta$ is the bearing contact angle. Assume a contact angle of 15° and compute the BPFO.

```ca = 15; bpfo = n*f0/2*(1-d/p*cosd(ca));```

Use the `pulstran` function to model the impacts as a periodic train of 5-millisecond sinusoids. Each 3 kHz sinusoid is windowed by a flat top window. Use a power law to introduce progressive wear in the bearing vibration signal.

```fImpact = 3000; tImpact = 0:1/fs:5e-3-1/fs; wImpact = flattopwin(length(tImpact))'/10; xImpact = sin(2*pi*fImpact*tImpact).*wImpact; tx = 0:1/bpfo:t(end); tx = [tx; 1.3.^tx-2]; nWear = 49000; nSamples = 100000; yImpact = pulstran(t,tx',xImpact,fs)/5; yImpact = [zeros(1,nWear) yImpact(1,(nWear+1):nSamples)];```

Generate the BPFO vibration signal by adding the impacts to the healthy signal. Plot the signal and select a 0.3-second interval starting at 5.0 seconds.

```yBPFO = yImpact + yHealthy; xLimLeft = 5.0; xLimRight = 5.3; yMin = -0.6; yMax = 0.6; plot(t,yBPFO) hold on [limLeft,limRight] = meshgrid([xLimLeft xLimRight],[yMin yMax]); plot(limLeft,limRight,'--') hold off``` Zoom in on the selected interval to visualize the effect of the impacts.

`xlim([xLimLeft xLimRight])` Add white Gaussian noise to the signals. Specify a noise variance of $1/15{0}^{2}$.

```rn = 150; yGood = yHealthy + randn(size(yHealthy))/rn; yBad = yBPFO + randn(size(yHealthy))/rn; plot(t,yGood,t,yBad) xlim([xLimLeft xLimRight]) legend('Healthy','Damaged')``` Use `emd` to perform an empirical mode decomposition of the healthy bearing signal. Compute the first five intrinsic mode functions (IMFs). The function by default outputs a table that indicates the number of sifting iterations, the relative tolerance, and the sifting stop criterion for each IMF.

`imfGood = emd(yGood,'MaxNumIMF',5);`
```Current IMF | #Sift Iter | Relative Tol | Stop Criterion Hit 1 | 3 | 0.017132 | SiftMaxRelativeTolerance 2 | 3 | 0.12694 | SiftMaxRelativeTolerance 3 | 6 | 0.14582 | SiftMaxRelativeTolerance 4 | 1 | 0.011082 | SiftMaxRelativeTolerance 5 | 2 | 0.03463 | SiftMaxRelativeTolerance The decomposition stopped because 'MaxNumIMF' was reached. ```

Use `emd` without output arguments to visualize the first three modes and the residual. Set `'Display'` to `0` to hide the table.

`emd(yGood,'MaxNumIMF',5,'Display',0)` Compute and visualize the IMFs of the defective bearing signal. The first empirical mode reveals the high-frequency impacts. This high-frequency mode increases in energy as the wear progresses. The third mode shows the resonance in the vibration signal.

`imfBad = emd(yBad,'MaxNumIMF',5);`
```Current IMF | #Sift Iter | Relative Tol | Stop Criterion Hit 1 | 2 | 0.041274 | SiftMaxRelativeTolerance 2 | 3 | 0.16695 | SiftMaxRelativeTolerance 3 | 3 | 0.18428 | SiftMaxRelativeTolerance 4 | 1 | 0.037177 | SiftMaxRelativeTolerance 5 | 2 | 0.095861 | SiftMaxRelativeTolerance The decomposition stopped because 'MaxNumIMF' was reached. ```
`emd(yBad,'MaxNumIMF',5,'Display',0)` The next step in the analysis is to compute the Hilbert spectrum of the extracted IMFs. For more details, see the Compute Hilbert Spectrum of Vibration Signal example.

Load and visualize a nonstationary continuous signal composed of sinusoidal waves with a distinct change in frequency. The vibration of a jackhammer and the sound of fireworks are examples of nonstationary continuous signals. The signal is sampled at a rate `fs`.

```load('sinusoidalSignalExampleData.mat','X','fs') t = (0:length(X)-1)/fs; plot(t,X) xlabel('Time(s)')``` The mixed signal contains sinusoidal waves with different amplitude and frequency values.

Perform empirical mode decomposition to plot the intrinsic mode functions and residual of the signal. Since the signal is not smooth, specify '`pchip`' as the interpolation method.

`emd(X,'Interpolation','pchip')`
```Current IMF | #Sift Iter | Relative Tol | Stop Criterion Hit 1 | 2 | 0.026352 | SiftMaxRelativeTolerance 2 | 2 | 0.0039573 | SiftMaxRelativeTolerance 3 | 1 | 0.024838 | SiftMaxRelativeTolerance 4 | 2 | 0.05929 | SiftMaxRelativeTolerance 5 | 2 | 0.11317 | SiftMaxRelativeTolerance 6 | 2 | 0.12599 | SiftMaxRelativeTolerance 7 | 2 | 0.13802 | SiftMaxRelativeTolerance 8 | 3 | 0.15937 | SiftMaxRelativeTolerance 9 | 2 | 0.15923 | SiftMaxRelativeTolerance The decomposition stopped because the number of extrema of the residual signal is less than 'MaxNumExtrema'. ``` An interactive plot with the original signal, the first 3 IMFs, and the residual is generated. The table generated in the command window indicates the number of sift iterations, the relative tolerance, and the sift stop criterion for each generated IMF. You can hide the table by specifying `Display` as `0`.

Right-click on the white space in the plot to open the IMF selector window. Use IMF selector to selectively view the generated IMFs, the original signal, and the residual. Select the IMFs to be displayed from the list. Choose whether to display the original signal and residual on the plot. The selected IMFs are now displayed on the plot. Use the plot to visualize individual components decomposed from the original signal along with the residual. Note that the residual is computed for the total number of IMFs, and does not change based on the IMFs selected in the IMF selector window.

## Input Arguments

collapse all

Uniformly sampled time-domain signal, specified as either a vector or single data column timetable.

### Name-Value Pair Arguments

Specify optional comma-separated pairs of `Name,Value` arguments. `Name` is the argument name and `Value` is the corresponding value. `Name` must appear inside quotes. You can specify several name and value pair arguments in any order as `Name1,Value1,...,NameN,ValueN`.

Example: `'MaxNumIMF',5`

Cauchy type convergence criterion, specified as the comma-separated pair consisting of '`SiftRelativeTolerance`' and a positive scalar. `SiftRelativeTolerance` is one of the sifting stop criteria, that is, sifting stops when current relative tolerance is less than `SiftRelativeTolerance`.

Maximum number of sifting iterations, specified as the comma-separated pair consisting of '`SiftMaxIterations`' and a positive scalar integer. `SiftMaxIterations` is one of the sifting stop criteria, that is, sifting stops when the current number of iterations is larger than `SiftMaxIterations`.

`SiftMaxIterations` can be specified using only positive whole numbers.

Maximum number of IMFs extracted, specified as the comma-separated pair consisting of '`MaxNumIMF`' and a positive scalar integer. `MaxNumIMF` is one of the decomposition stop criteria, that is, decomposition stops when number of IMFs generated is equal to `MaxNumIMF`.

`MaxNumIMF` can be specified using only positive whole numbers.

Maximum number of extrema in the residual signal, specified as the comma-separated pair consisting of '`MaxNumExtrema`' and a positive scalar integer. `MaxNumExtrema` is one of the decomposition stop criteria, that is, decomposition stops when number of extrema is less than `MaxNumExtrema`.

`MaxNumExtrema` can be specified using only positive whole numbers.

Signal to residual energy ratio, specified as the comma-separated pair consisting of '`MaxEnergyRatio`' and a scalar. `MaxEnergyRatio` is the ratio of the energy of the signal at the beginning of sifting and the average envelope energy. `MaxEnergyRatio` is one of the decomposition stop criteria, that is, decomposition stops when current energy ratio is larger than `MaxEnergyRatio`.

Interpolation method for envelope construction, specified as the comma-separated pair consisting of '`Interpolation`' and either `'spline'` or `'pchip'`.

Specify `Interpolation` as:

• `'spline'`, if `X` is a smooth signal

• `'pchip'`, if `X` is a nonsmooth signal

'`spline`' interpolation method uses cubic spline, while `'pchip'` uses piecewise cubic Hermite interpolating polynomial method.

Toggle information display in the command window, specified as the comma-separated pair consisting of '`Display`' and either 1 or 0. The table generated in the command window indicates the number of sift iterations, the relative tolerance, and the sift stop criterion for each generated IMF. Specify `Display` as 1 to show the table or 0 to hide the table.

## Output Arguments

collapse all

Intrinsic mode function, returned as a matrix or timetable. `imf` is any function whose envelope is symmetric with respect to zero and whose numbers of extrema and zero crossings differ by at most one. Use `imf` to apply Hilbert-Huang transform to perform spectral analysis on the signal.

`imf` is returned as:

• A matrix whose each column is an `imf`, when `X` is a vector

• A timetable, when `X` is a single data column timetable

Residual of the signal, returned as a column vector or a single data column timetable. `residual` represents the portion of the original signal `X` not decomposed by `emd`.

`residual` is returned as:

• A column vector, when `X` is a vector.

• A single data column timetable, when `X` is a single data column timetable.

Additional information for diagnostics, returned as a structure with the following fields:

• `NumIMF` - Number of IMFs extracted from the signal

• `NumExtrema` - Number of extrema in each IMF

• `NumZeroCrossing` - Number of zero crossings for each IMF

• `NumSifting` - Number of siftings performed for each IMF

• `MeanEnvelopeEnergy` - Energy of the mean of upper and lower envelope obtained in each IMF computation

• `RelativeTolerance` - Relative tolerance attained for each IMF

## Algorithms

Empirical Mode Decomposition

`emd` decomposes a signal X(t) into k number of intrinsic mode functions (IMF), and residual rk(t) using the sifting process. A brief overview of the sifting process, listed in  and , is as follows:

1. Find local maxima and minima for signal X(t) to construct an upper envelope s+(t), and a lower envelope s(t).

2. Compute mean envelope for ith iteration, mk,i(t),

`${m}_{k,i}\left(t\right)=\frac{1}{2}\left[{s}_{+}\left(t\right)+{s}_{-}\left(t\right)\right]$`
3. With ck(t) = X(t) for the first iteration, subtract mean envelope from residual signal,

`${c}_{k}\left(t\right)={c}_{k}\left(t\right)-{m}_{k,i}\left(t\right)$`

If ck(t) does not match the criteria of an IMF, steps 4 and 5 are skipped. The procedure is iterated again at step 1 with the new value of ck(t).

4. If ck(t) matches the criteria of an IMF, a new residual is computed. To update the residual signal, subtract the kth IMF from the previous residual signal,

`${r}_{k}\left(t\right)={r}_{k-1}\left(t\right)-{c}_{k}\left(t\right)$`
5. Then begin from step 1, using the residual obtained as a new signal rk(t), and store ck(t) as an intrinsic mode function.

For N intrinsic mode functions, the original signal is represented as,

`$X\left(t\right)=\sum _{i=1}^{N}{c}_{i}\left(t\right)+{r}_{N}\left(t\right)$`

`SiftRelativeTolerance`

`SiftRelativeTolerance` is a Cauchy type stop criterion proposed in . Sifting stops when current relative tolerance is less than `SiftRelativeTolerance`. The current relative tolerance is defined as

`$\text{RelativeTolerance}\triangleq \frac{{‖c{\left(t\right)}_{\text{previous}}-c{\left(t\right)}_{\text{current}}‖}^{2}}{{‖c{\left(t\right)}_{\text{current}}‖}^{2}}.$`

Because the Cauchy criterion does not directly count the number of zero crossings and local extrema, it is possible that the IMFs returned by the decomposition do not satisfy the strict definition of an intrinsic mode function. In those cases, you can try reducing the value of the `SiftRelativeTolerance` from its default value. See  for a detailed discussion of stopping criteria. The reference also discusses the advantages and disadvantages of insisting on strictly defined IMFs in empirical mode decomposition.

`MaxEnergyRatio`

Energy ratio is the ratio of the energy of the signal at the beginning of sifting and the average envelope energy . Decomposition stops when current energy ratio is larger than `MaxEnergyRatio`. For k IMFs, `EnergyRatio` is defined as

`$\text{EnergyRatio}\triangleq 10{\mathrm{log}}_{10}\left(\frac{{‖X\left(t\right)‖}^{2}}{{‖{r}_{k}\left(t\right)‖}^{2}}\right).$`

 Huang, Norden E., Zheng Shen, Steven R. Long, Manli C. Wu, Hsing H. Shih, Quanan Zheng, Nai-Chyuan Yen, Chi Chao Tung, and Henry H. Liu. "The empirical mode decomposition and the Hilbert spectrum for nonlinear and non-stationary time series analysis." Proceedings of the Royal Society of London. Series A: Mathematical, Physical and Engineering Sciences. Vol. 454, 1998, pp. 903–995.

 Rilling, G., Patrick Flandrin, and Paulo Gonçalves. "On empirical mode decomposition and its algorithms." IEEE-EURASIP Workshop on Nonlinear Signal and Image Processing 2003. NSIP-03. Grado, Italy. 8–11.

 Rato, R.T., Manuel Ortigueira, and Arnaldo Batista. "On the HHT, its problems, and some solutions." Mechanical Systems and Signal Processing Vol. 22, 2008, pp. 1374–1394.

 Wang, Gang, Xian-Yao Chen, Fang-Li Qiao, Zhaohua Wu, and Norden Huang. "On Intrinsic Mode Function." Advances in Adaptive Data Analysis. Vol. 2, Number 3, 2010, pp. 277–293.