# dwt

Single-level 1-D discrete wavelet transform

## Syntax

``[cA,cD] = dwt(x,wname)``
``[cA,cD] = dwt(x,LoD,HiD)``
``[cA,cD] = dwt(___,'mode',extmode)``

## Description

example

````[cA,cD] = dwt(x,wname)` returns the single-level discrete wavelet transform (DWT) of the vector `x` using the wavelet specified by `wname`. The wavelet must be recognized by `wavemngr`. `dwt` returns the approximation coefficients vector `cA` and detail coefficients vector `cD` of the DWT. NoteIf your application requires a multilevel wavelet decomposition, consider using `wavedec`. ```

example

````[cA,cD] = dwt(x,LoD,HiD)` returns the single-level DWT using the scaling (lowpass) filter `LoD` and wavelet (highpass) filter `HiD`. The filters must have the same length and an even number of samples.```
````[cA,cD] = dwt(___,'mode',extmode)` returns the single-level DWT with the specified extension mode `extmode`. For more information, see `dwtmode`. NoteFor `gpuArray` inputs, the supported modes are `'symh'` (`'sym'`) and `'per'`. All `'mode'` options except `'per'` are converted to `'symh'`. See the example Single-Level Discrete Wavelet Transform on a GPU. ```

## Examples

collapse all

Obtain the single-level DWT of the noisy Doppler signal using a wavelet name.

```load noisdopp; [cA,cD] = dwt(noisdopp,'sym4');```

Reconstruct a smoothed version of the signal using the approximation coefficients. Plot and compare with the original signal.

```xrec = idwt(cA,zeros(size(cA)),'sym4'); plot(noisdopp) hold on grid on plot(xrec) legend('Original','Reconstruction')```

Obtain the single-level DWT of a noisy Doppler signal using the wavelet (highpass) and scaling (lowpass) filters.

```load noisdopp; [LoD,HiD] = wfilters('bior3.5','d'); [cA,cD] = dwt(noisdopp,LoD,HiD);```

Create a DWT filter bank that can be applied to the noisy Doppler signal using the same wavelet. Obtain the highpass and lowpass filters from the filter bank.

```len = length(noisdopp); fb = dwtfilterbank('SignalLength',len,'Wavelet','bior3.5'); [lo,hi] = filters(fb);```

For the `bior3.5` wavelet, `lo` and `hi` are 12-by-2 matrices. `lo` are the lowpass filters, and `hi` are the highpass filters. The first columns of `lo` and `hi` are used for analysis and the second columns are used for synthesis. Compare the first column of `lo` and `hi` with `LoD` and `HiD` respectively. Confirm they are equal.

`disp('Lowpass Analysis Filters')`
```Lowpass Analysis Filters ```
`[lo(:,1) LoD']`
```ans = 12×2 -0.0138 -0.0138 0.0414 0.0414 0.0525 0.0525 -0.2679 -0.2679 -0.0718 -0.0718 0.9667 0.9667 0.9667 0.9667 -0.0718 -0.0718 -0.2679 -0.2679 0.0525 0.0525 ⋮ ```
`disp('Highpass Analysis Filters')`
```Highpass Analysis Filters ```
`[hi(:,1) HiD']`
```ans = 12×2 0 0 0 0 0 0 0 0 -0.1768 -0.1768 0.5303 0.5303 -0.5303 -0.5303 0.1768 0.1768 0 0 0 0 ⋮ ```

Plot the one-sided magnitude frequency responses of the first-level wavelet and scaling filters.

```[psidft,f,phidft] = freqz(fb); level = 1; plot(f(len/2+1:end),abs(phidft(level,len/2+1:end))) hold on plot(f(len/2+1:end),abs(psidft(level,len/2+1:end))) grid on legend('Scaling Filter','Wavelet Filter') title('First-Level One-sided Frequency Responses') xlabel('Normalized Frequency (cycles/sample)') ylabel('Magnitude')```

Refer to GPU Support by Release (Parallel Computing Toolbox) to see what GPUs are supported.

Load the noisy Doppler signal. Put the signal on the GPU using `gpuArray`. Save the current extension mode.

```load noisdopp noisdoppg = gpuArray(noisdopp); origMode = dwtmode('status','nodisp');```

Use `dwtmode` to change the extension mode to zero-padding. Obtain the single-level discrete wavelet transform of the signal on the GPU using the `db2` wavelet.

```dwtmode('zpd','nodisp') [cA,cD] = dwt(noisdoppg,'db2');```

The current extension mode `zpd` is not supported for `gpuArray` input. Therefore, the DWT is instead performed using the `sym` extension mode. Confirm this by taking the DWT of `noisdoppg` with the extension mode set to `sym` and compare with the previous result.

```[cAsym,cDsym] = dwt(noisdoppg,'db2','mode','sym'); [max(abs(cA-cAsym)) max(abs(cD-cDsym))]```
```ans = 0 0 ```

An unsupported extension mode specified as an input argument is converted to `'sym'`. Confirm that taking the DWT of `noisdoppg` with `'mode'` set to an unsupported mode also defaults to the `sym` extension mode.

```[cA,cD] = dwt(noisdoppg,'db2','mode','spd'); [max(abs(cA-cAsym)) max(abs(cD-cDsym))]```
```ans = 0 0 ```

Change the current extension mode to periodic. Obtain the single-level discrete wavelet transform of the signal on the GPU using the `db2` wavelet.

```dwtmode('per','nodisp') [cA,cD] = dwt(noisdoppg,'db2');```

Confirm the current extension mode `per` is supported for `gpuArray` input.

```[cAper,cDper] = dwt(noisdopp,'db2','mode','per'); [max(abs(cA-cAper)) max(abs(cD-cDper))]```
```ans = 0 0 ```

Restore the extension mode to the original setting.

`dwtmode(origMode,'nodisp')`

## Input Arguments

collapse all

Input data, specified as a numeric vector.

Data Types: `single` | `double` | `int8` | `int16` | `int32` | `int64` | `uint8` | `uint16` | `uint32` | `uint64`

Analyzing wavelet used to the compute the single-level DWT, specified as a character vector or string scalar. The wavelet must be recognized by `wavemngr`. The analyzing wavelet is from one of the following wavelet families: Daubechies, Coiflets, Symlets, Fejér-Korovkin, Discrete Meyer, Biorthogonal, and Reverse Biorthogonal. See `wfilters` for the wavelets available in each family.

Example: `'db4'`

Scaling (lowpass) filter, specified as an even-length real-valued vector. `LoD` must be the same length as `HiD`. See `wfilters` for details.

Data Types: `double` | `single`

Wavelet (highpass) filter, specified as an even-length real-valued vector. `HiD` must be the same length as `LoD`. See `wfilters` for details.

Data Types: `double` | `single`

Extension mode used when performing the DWT, specified as one of the following:

`mode`

DWT Extension Mode

`'zpd'`

Zero extension

`'sp0'`

Smooth extension of order 0

`'spd'` (or` 'sp1'`)

Smooth extension of order 1

`'sym'` or `'symh'`

Symmetric extension (half point): boundary value symmetric replication

`'symw'`

Symmetric extension (whole point): boundary value symmetric replication

`'asym'` or `'asymh'`

Antisymmetric extension (half point): boundary value antisymmetric replication

`'asymw'`

Antisymmetric extension (whole point): boundary value antisymmetric replication

`'ppd'`

Periodized extension (1)

`'per'`

Periodized extension (2)

If the signal length is odd, `wextend` adds to the right an extra sample that is equal to the last value, and performs the extension using the `'ppd'` mode. Otherwise, `'per'` reduces to `'ppd'`. This rule also applies to images.

The global variable managed by `dwtmode` specifies the default extension mode. See `dwtmode` for extension mode descriptions.

Example: `[cA,cD] = dwt(x,'db4','mode','symw')` returns the single-level DWT of `x` using the order 4 Daubechies extremal phase wavelet and whole point symmetric extension.

## Output Arguments

collapse all

Approximation coefficients obtained from the wavelet decomposition, returned as a vector. Convolving the input signal `x` with the scaling filter `LoD`, followed by dyadic decimation, yields the approximation coefficients. Let `sx = size(x)` and `lf = `the length of the decomposition filters.

• If the DWT extension mode is set to periodization, `cA` is a vector of length `ceil(sx/2)`.

• For the other extension modes, `cA` is a vector of length `floor((sx+lf-1)/2)`.

Data Types: `double` | `single`

Detail coefficients obtained from the wavelet decomposition, returned as a vector. Convolving the input signal `x` with the wavelet filter `HiD`, followed by dyadic decimation, yields the detail coefficients. Let `sx = size(x)` and `lf = `the length of the decomposition filters.

• If the DWT extension mode is set to periodization, `cD` is a vector of length `ceil(sx/2)`.

• For the other extension modes, `cD` is a vector of length `floor((sx+lf-1)/2)`.

Data Types: `double` | `single`

## Algorithms

Starting from a signal s of length N, two sets of coefficients are computed: approximation coefficients cA1, and detail coefficients cD1. Convolving s with the scaling filter `LoD`, followed by dyadic decimation, yields the approximation coefficients. Similarly, convolving s with the wavelet filter `HiD`, followed by dyadic decimation, yields the detail coefficients.

where

• — Convolve with filter X

• $\begin{array}{||}\hline ↓2\\ \hline\end{array}$ — Downsample (keep the even-indexed elements)

The length of each filter is equal to 2n. If N = length(s), the signals F and G are of length N + 2n −1 and the coefficients cA1 and cD1 are of length floor$\left(\frac{N-1}{2}\right)+n$.

To deal with signal-end effects resulting from a convolution-based algorithm, a global variable managed by `dwtmode` defines the kind of signal extension mode used. The possible options include zero-padding and symmetric extension, which is the default mode.

Note

For the same input, the `dwt` function and the DWT block in the DSP System Toolbox™ do not produce the same results. The DWT block is designed for real-time implementation while Wavelet Toolbox™ software is designed for analysis, so the products handle boundary conditions and filter states differently.

To make the `dwt` function output match the DWT block output, set the function boundary condition to zero-padding by typing `dwtmode('zpd')` at the MATLAB® command prompt. To match the latency of the DWT block, which is implemented using FIR filters, add zeros to the input of the `dwt` function. The number of zeros you add must be equal to half the filter length.

## References

[1] Daubechies, I. Ten Lectures on Wavelets. CBMS-NSF Regional Conference Series in Applied Mathematics. Philadelphia, PA: Society for Industrial and Applied Mathematics, 1992.

[2] Mallat, S. G. “A Theory for Multiresolution Signal Decomposition: The Wavelet Representation.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 11, Issue 7, July 1989, pp. 674–693.

[3] Meyer, Y. Wavelets and Operators. Translated by D. H. Salinger. Cambridge, UK: Cambridge University Press, 1995.