Main Content

# sos2ctf

Convert digital filter second-order section parameters to cascaded transfer function form

Since R2024a

## Syntax

``[B,A] = sos2ctf(sos)``
``[B,A] = sos2ctf(sos,g)``

## Description

````[B,A] = sos2ctf(sos)` computes the second-order Cascaded Transfer Functions (CTF) of a filter system described by the second-order section matrix `sos`.```

example

````[B,A] = sos2ctf(sos,g)` also specifies the scale values `g` to perform gain scaling across the sections of the cascaded transfer function of the system.```

example

## Examples

collapse all

Convert a second-order sections matrix to the cascaded transfer function form.

```sos = [2 4 2 1 0 0;3 2 0 1 1 0]; [ctfB,ctfA] = sos2ctf(sos)```
```ctfB = 2×3 2 4 2 3 2 0 ```
```ctfA = 2×3 1 0 0 1 1 0 ```

Obtain the cascaded transfer function of a 10th-order lowpass elliptic filter with a normalized cutoff frequency of 0.25$\pi$rad/sample.

```[z,p,k] = ellip(10,1,60,0.25); [sos,g] = zp2sos(z,p,k); [b,a] = sos2ctf(sos,g)```
```b = 5×3 0.3216 0.2716 0.3216 0.3216 -0.2850 0.3216 0.3216 -0.4033 0.3216 0.3216 -0.4345 0.3216 0.3216 -0.4432 0.3216 ```
```a = 5×3 1.0000 -1.5959 0.6751 1.0000 -1.5123 0.8125 1.0000 -1.4458 0.9225 1.0000 -1.4169 0.9730 1.0000 -1.4099 0.9936 ```

Plot the filter response.

`filterAnalyzer(b,a)`

## Input Arguments

collapse all

Second-order section representation, specified as an L-by-6 matrix, where L is the number of second-order sections. The matrix

`$\text{sos}=\left[\begin{array}{cccccc}{b}_{01}& {b}_{11}& {b}_{21}& 1& {a}_{11}& {a}_{21}\\ {b}_{02}& {b}_{12}& {b}_{22}& 1& {a}_{12}& {a}_{22}\\ ⋮& ⋮& ⋮& ⋮& ⋮& ⋮\\ {b}_{0L}& {b}_{1L}& {b}_{2L}& 1& {a}_{1L}& {a}_{2L}\end{array}\right]$`

represents the second-order sections of H(z):

`$H\left(z\right)=g\prod _{k=1}^{L}{H}_{k}\left(z\right)=g\prod _{k=1}^{L}\frac{{b}_{0k}+{b}_{1k}{z}^{-1}+{b}_{2k}{z}^{-2}}{1+{a}_{1k}{z}^{-1}+{a}_{2k}{z}^{-2}}.$`

Example: `[z,p,k] = butter(3,1/32); sos = zp2sos(z,p,k)` specifies a third-order Butterworth filter with a normalized 3 dB frequency of π/32 rad/sample.

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

Scale values, specified as a real-valued scalar or as a real-valued vector with L+1 elements, where L is the number of second-order sections.

The `sos2ctf` function applies a gain to the filter sections using the `scaleFilterSections` function. Depending on the value you specify in `g`:

• Scalar — The function uniformly distributes the gain 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.

## Output Arguments

collapse all

Cascaded transfer function coefficients, returned as L-by-3 matrices, where L is the number of second-order sections.

The matrices `B` and `A` list the numerator and denominator coefficients of the cascaded transfer function, respectively. See Return Digital Filters in CTF Format for more information.

## More About

collapse all

### Cascaded Transfer Functions

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).$`

### Return Digital Filters in CTF Format

Get the filter coefficients by specifying to return `B` and `A`. That way, you can have digital filters in CTF format for analysis, visualization and signal filtering.

Filter Coefficients

When you specify to return the numerator and denominator coefficients in the CTF format, the L-row matrices B and A are returned 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}1& {a}_{12}& \cdots & {a}_{1,n+1}\\ 1& {a}_{22}& \cdots & {a}_{2,n+1}\\ ⋮& ⋮& \ddots & ⋮\\ 1& {a}_{L2}& \cdots & {a}_{L,n+1}\end{array}\right],$`

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}}{1+{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}}{1+{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}}{1+{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.

Note

## Algorithms

The `sos2ctf` function computes the numerator and denominator coefficients of the cascaded-transfer-function sections from the second-order-section coefficients of the filter system.

The output arguments `B` and `A` contain the second-order cascaded transfer function coefficients of the filter system distributed in `L` rows.

• Each row of `A` and `B` lists the coefficients in each section.

• The `sos2ctf` function returns the L-by-3 matrices `B` and `A`, where the last two columns correspond to the z–1 and z–2 terms for each cascaded section of the filter system.

For a second-order-section matrix `sos`, and unity scale value (`g=1`), the values for `B` and `A` are these:

```B = sos(:,1:3); A = sos(:,4:6);```

If you specify `g`, `sos2ctf` distributes the scale values from `g` across the numerator coefficients, so that the values for `B` and `A` are these:

```B = scaleFilterSections(sos(:,1:3),g); A = sos(:,4:6);```

## References

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

## Version History

Introduced in R2024a