# phasedelay

Phase delay of digital filter

## Syntax

``[phi,w] = phasedelay(b,a,n)``
``[phi,w] = phasedelay(B,A,"ctf",n)``
``[phi,w] = phasedelay({B,A,g},"ctf",n)``
``[phi,w] = phasedelay(d,n)``
``[phi,w] = phasedelay(sos,n)``
``[phi,w] = phasedelay(___,n,"whole")``
``[phi,f] = phasedelay(___,n,fs)``
``[phi,f] = phasedelay(___,n,"whole",fs)``
``phi = phasedelay(___,w)``
``phi = phasedelay(___,f,fs)``
``[phi,w,s] = phasedelay(___)``
``[phi,f,s] = phasedelay(___)``
``phasedelay(___)``

## Description

````[phi,w] = phasedelay(b,a,n)` returns the phase delay response of the specified digital filter. Specify a digital filter with numerator coefficients `b` and denominator coefficients `a`. The function returns the `n`-point phase delay response vector in `phi` and the corresponding angular frequency vector `w`.```
````[phi,w] = phasedelay(B,A,"ctf",n)` returns the `n`-point phase delay response of the digital filter represented as Cascaded Transfer Functions (CTF) with numerator coefficients `B` and denominator coefficients `A`. (since R2024b)```

example

````[phi,w] = phasedelay({B,A,g},"ctf",n)` returns the `n`-point phase delay response of the digital filter in CTF format. Specify the filter with numerator coefficients `B`, denominator coefficients `A`, and scaling values `g` across filter sections. (since R2024b)```

example

````[phi,w] = phasedelay(d,n)` returns the `n`-point phase delay response of the digital filter `d`.```
````[phi,w] = phasedelay(sos,n)` returns the `n`-point phase delay response corresponding to the second-order sections `sos`.```

example

````[phi,w] = phasedelay(___,n,"whole")` returns the phase delay response at `n` equally spaced points around the whole unit circle.```

example

````[phi,f] = phasedelay(___,n,fs)` returns the phase delay response and the corresponding `n`-point frequency vector `f` for a digital filter designed to filter signals sampled at a rate `fs`.```
````[phi,f] = phasedelay(___,n,"whole",fs)` returns the frequency vector `f` at `n` points ranging between `0` and `fs`.```
````phi = phasedelay(___,w)` returns the phase delay response evaluated at the angular frequencies specified in `w`.```
````phi = phasedelay(___,f,fs)` returns the phase delay response evaluated at the frequencies specified in `f`.```
````[phi,w,s] = phasedelay(___)` returns plotting information, where `s` is a structure with fields that you can change to display different frequency response plots.```
````[phi,f,s] = phasedelay(___)` returns plotting information, where `s` is a structure with fields that you can change to display different frequency response plots.```
````phasedelay(___)` plots the phase delay response versus frequency.```

example

## Examples

collapse all

Use constrained least squares to design a lowpass FIR filter of order 54 and normalized cutoff frequency 0.3. Specify the passband ripple and stopband attenuation as 0.02 and 0.08, respectively, expressed in linear units. Compute and plot the phase delay response of the filter.

```Ap = 0.02; As = 0.008; b = fircls1(54,0.3,Ap,As); phasedelay(b)```

Repeat the example using `designfilt`. Keep in mind that this function expresses the ripples in decibels.

```Apd = 40*log10((1+Ap)/(1-Ap)); Asd = -20*log10(As); d = designfilt('lowpassfir','FilterOrder',54,'CutoffFrequency',0.3, ... 'PassbandRipple',Apd,'StopbandAttenuation',Asd); phasedelay(d)```

Since R2024b

Design a 40th-order lowpass Chebyshev type II digital filter with a stopband edge frequency of 0.4 and stopband attenuation of 50 dB. Plot the phase delay response of the filter using its coefficients in the CTF format.

```[B,A] = cheby2(40,50,0.4,"ctf"); phasedelay(B,A,"ctf")```

Design a 30th-order bandpass elliptic digital filter with passband edge frequencies of 0.3 and 0.7, passband ripple of 0.1 dB, and stopband attenuation of 50 dB. Plot the phase delay response of the filter using its coefficients and gain in the CTF format.

```[B,A,g] = ellip(30,0.1,50,[0.3 0.7],"ctf"); phasedelay({B,A,g},"ctf")```

Design a third-order lowpass Butterworth filter with a cutoff frequency of 200 Hz. The sample rate is 1000 Hz.

```fc = 200; fs = 1000; [z,p,k] = butter(3,fc/(fs/2),'low');```

Use the `zp2sos` function to convert the zeros, poles, and gain to second-order sections. Compute the phase delay response of the filter and set the number of evaluation points to `1024`. Display the result.

```sos = zp2sos(z,p,k); phasedelay(sos,1024)```

Design an elliptic filter of order 10 and normalized passband frequency 0.4. Specify a passband ripple of 0.5 dB and a stopband attenuation of 20 dB. Display the phase delay response of the filter over the complete unit circle.

```[b,a] = ellip(10,0.5,20,0.4); phasedelay(b,a,512,'whole')```

Repeat the example using `designfilt`.

```d = designfilt('lowpassiir','DesignMethod','ellip','FilterOrder',10, ... 'PassbandFrequency',0.4, ... 'PassbandRipple',0.5,'StopbandAttenuation',20); phasedelay(d,512,'whole')```

## Input Arguments

collapse all

Transfer function coefficients, specified as vectors.

Data Types: `single` | `double`

Number of frequency points over which to evaluate response, specified as a positive integer. Set `n` to a value greater than the filter order.

Data Types: `single` | `double`

Since R2024b

Cascaded transfer function (CTF) coefficients, specified as scalars, vectors, or matrices. `B` and `A` list the numerator and denominator coefficients of the cascaded transfer function, respectively.

`B` must be of size L-by-(m + 1) and `A` must be of size L-by-(n + 1), where:

• L represents the number of filter sections.

• m represents the order of the filter numerators.

• n represents the order of the filter denominators.

Note

If any element of `A(:,1)` is not equal to `1`, then `phasedelay` normalizes the filter coefficients by `A(:,1)`. In this case, `A(:,1)` must be nonzero.

Data Types: `double` | `single`
Complex Number Support: Yes

Since R2024b

Scale values, specified as a real-valued scalar or as a real-valued vector with L + 1 elements, where L is the number of CTF sections. The scale values represent the distribution of the filter gain across sections of the cascaded filter representation.

The `phasedelay` function applies a gain to the filter sections using the `scaleFilterSections` function depending on how you specify `g`:

• Scalar — The function distributes the gain uniformly across all filter sections.

• Vector — The function applies the first L gain values to the corresponding filter sections and distributes the last gain value uniformly across all filter sections.

Data Types: `double` | `single`

Digital filter, specified as a `digitalFilter` object. To generate `d` based on frequency-response specifications, use the `designfilt` function.

Second-order section coefficients, specified as a matrix. `sos` is a K-by-6 matrix, where K is the number of sections and must be greater than or equal to 2. If the number of sections is less than 2, the function considers the input to be a numerator vector, `b`. Each row of `sos` corresponds to the coefficients of a second-order (biquad) filter. The ith row of the `sos` matrix corresponds to ```[bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)]```.

Data Types: `single` | `double`

Angular frequencies at which the function evaluates the phase delay response, specified as a vector and expressed in rad/sample. The frequencies are normally between 0 and π. `w` must contain at least two elements.

Sample rate, specified as a real-valued scalar and expressed in hertz.

Data Types: `double`

Frequencies at which the function evaluates the phase delay response, specified as a vector and expressed in hertz. `f` must contain at least two elements.

## Output Arguments

collapse all

Phase delay response, returned as a vector of length `n`. The phase delay response is evaluated at `n` equally spaced points around the upper half of the unit circle.

Note

If the input to `phasedelay` is single precision, the function calculates the phase delay response using single-precision arithmetic. The output `phi` is single precision.

Angular frequencies in rad/sample, returned as a vector. If you specify `n`, `w` has length `n`. If you do not specify `n` or you specify `n` as an empty vector, then `w` has length `512`.

Frequencies in hertz, returned as a vector. If you specify `n`, `f` has length `n`. If you do not specify `n` or you specify `n` as an empty vector, then `f` has length `512`.

Plotting information, returned as a structure. You can modify the fields in `s` to display different frequency response plots.

collapse all

Partitioning an IIR digital filter into cascaded sections improves its numerical stability and reduces its susceptibility to coefficient quantization errors. The cascaded form of a transfer function H(z) in terms of the L transfer functions H1(z), H2(z), …, HL(z) is

`$H\left(z\right)=\prod _{l=1}^{L}{H}_{l}\left(z\right)={H}_{1}\left(z\right)×{H}_{2}\left(z\right)×\cdots ×{H}_{L}\left(z\right).$`

### Specify Digital Filters in CTF Format

You can specify digital filters in the CTF format for analysis, visualization, and signal filtering. Specify a filter by listing its coefficients `B` and `A`. You can also include the filter scaling gain across sections by specifying a scalar or vector `g`.

Filter Coefficients

When you specify the coefficients as L-row matrices,

`$B=\left[\begin{array}{cccc}{b}_{11}& {b}_{12}& \cdots & {b}_{1,m+1}\\ {b}_{21}& {b}_{22}& \cdots & {b}_{2,m+1}\\ ⋮& ⋮& \ddots & ⋮\\ {b}_{L1}& {b}_{L2}& \cdots & {b}_{L,m+1}\end{array}\right],\text{ }A=\left[\begin{array}{cccc}{a}_{11}& {a}_{12}& \cdots & {a}_{1,n+1}\\ {a}_{21}& {a}_{22}& \cdots & {a}_{2,n+1}\\ ⋮& ⋮& \ddots & ⋮\\ {a}_{L1}& {a}_{L2}& \cdots & {a}_{L,n+1}\end{array}\right],$`

it is assumed that you have specified the filter as a sequence of L cascaded transfer functions, such that the full transfer function of the filter is

`$H\left(z\right)=\frac{{b}_{11}+{b}_{12}{z}^{-1}+\cdots +{b}_{1,m+1}{z}^{-m}}{{a}_{11}+{a}_{12}{z}^{-1}+\cdots +{a}_{1,n+1}{z}^{-n}}×\frac{{b}_{21}+{b}_{22}{z}^{-1}+\cdots +{b}_{2,m+1}{z}^{-m}}{{a}_{21}+{a}_{22}{z}^{-1}+\cdots +{a}_{2,n+1}{z}^{-n}}×\cdots ×\frac{{b}_{L1}+{b}_{L2}{z}^{-1}+\cdots +{b}_{L,m+1}{z}^{-m}}{{a}_{L1}+{a}_{L2}{z}^{-1}+\cdots +{a}_{L,n+1}{z}^{-n}},$`

where m ≥ 0 is the numerator order of the filter and n ≥ 0 is the denominator order.

• If you specify both B and A as vectors, it is assumed that the underlying system is a one-section IIR filter (L = 1), with B representing the numerator of the transfer function and A representing its denominator.

• If B is scalar, it is assumed that the filter is a cascade of all-pole IIR filters with each section having an overall system gain equal to B.

• If A is scalar, it is assumed that the filter is a cascade of FIR filters with each section having an overall system gain equal to 1/A.

Note

• To convert second-order section matrices to cascaded transfer functions, use the `sos2ctf` function.

• To convert a zero-pole-gain filter representation to cascaded transfer functions, use the `zp2ctf` function.

Coefficients and Gain

If you have an overall scaling gain or multiple scaling gains factored out from the coefficient values, you can specify the coefficients and gain as a cell array of the form `{B,A,g}`. Scaling filter sections is especially important when you work with fixed-point arithmetic to ensure that the output of each filter section has similar amplitude levels, which helps avoid inaccuracies in the filter response due to limited numeric precision.

The gain can be a scalar overall gain or a vector of section gains.

• If the gain is scalar, the value applies uniformly to all the cascade filter sections.

• If the gain is a vector, it must have one more element than the number of filter sections L in the cascade. Each of the first L scale values applies to the corresponding filter section, and the last value applies uniformly to all the cascade filter sections.

If you specify the coefficient matrices and gain vector as

`$B=\left[\begin{array}{cccc}{b}_{11}& {b}_{12}& \cdots & {b}_{1,m+1}\\ {b}_{21}& {b}_{22}& \cdots & {b}_{2,m+1}\\ ⋮& ⋮& \ddots & ⋮\\ {b}_{L1}& {b}_{L2}& \cdots & {b}_{L,m+1}\end{array}\right],\text{ }A=\left[\begin{array}{cccc}{a}_{11}& {a}_{12}& \cdots & {a}_{1,n+1}\\ {a}_{21}& {a}_{22}& \cdots & {a}_{2,n+1}\\ ⋮& ⋮& \ddots & ⋮\\ {a}_{L1}& {a}_{L2}& \cdots & {a}_{L,n+1}\end{array}\right],\text{ }g=\left[\begin{array}{ccccc}{g}_{1}& {g}_{2}& \cdots & {g}_{L}& {g}_{\text{S}}\end{array}\right],$`

it is assumed that the transfer function of the filter system is

`$H\left(z\right)={g}_{\text{S}}\left({g}_{1}\frac{{b}_{11}+{b}_{12}{z}^{-1}+\cdots +{b}_{1,m+1}{z}^{-m}}{{a}_{11}+{a}_{12}{z}^{-1}+\cdots +{a}_{1,n+1}{z}^{-n}}×{g}_{2}\frac{{b}_{21}+{b}_{22}{z}^{-1}+\cdots +{b}_{2,m+1}{z}^{-m}}{{a}_{21}+{a}_{22}{z}^{-1}+\cdots +{a}_{2,n+1}{z}^{-n}}×\cdots ×{g}_{L}\frac{{b}_{L1}+{b}_{L2}{z}^{-1}+\cdots +{b}_{L,m+1}{z}^{-m}}{{a}_{L1}+{a}_{L2}{z}^{-1}+\cdots +{a}_{L,n+1}{z}^{-n}}\right).$`

## Algorithms

The phase delay response of a filter corresponds to the time delay that each frequency component experiences as the input signal passes through the system. The `phasedelay` function returns the phase delay response and the frequency vector of the filter

`$H\left({e}^{j\omega }\right)=\frac{B\left({e}^{j\omega }\right)}{A\left({e}^{j\omega }\right)}=\frac{\text{b}\left(1\right)+\text{b}\left(2\right){e}^{-j\omega }+\dots +\text{b}\left(\text{m}+1\right){e}^{-jm\omega }}{\text{a}\left(1\right)+\text{a}\left(2\right){e}^{-j\omega }+\dots +\text{a}\left(\text{n}+1\right){e}^{-jn\omega }}$`

given numerator and denominator coefficients in inputs `b` and `a`.

## References

[1] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

## Version History

Introduced before R2006a

expand all