# isstable

Determine whether filter is stable

## Syntax

## Description

returns `flag`

= isstable(`B,A`

,"ctf")`1`

if the filter specified as Cascaded Transfer Functions (CTF) with numerator coefficients `B`

and denominator coefficients
`A`

is stable.* (since R2024b)*

returns `flag`

= isstable(`d`

)`1`

if the digital filter `d`

is stable. Use
`designfilt`

to generate `d`

based on frequency-response
specifications.

## Examples

### Filter Stability

Design a sixth-order Butterworth highpass IIR filter using second order sections. Specify a normalized 3-dB frequency of 0.7. Determine if the filter is stable.

```
[z,p,k] = butter(6,0.7,"high");
SOS = zp2sos(z,p,k);
flag = isstable(SOS)
```

`flag = `*logical*
1

zplane(z,p)

Redesign the filter using `designfilt`

and check it for stability.

d = designfilt("highpassiir",DesignMethod="butter",FilterOrder=6, ... HalfPowerFrequency=0.7); dflg = isstable(d)

`dflg = `*logical*
1

zplane(d)

Create a filter and determine its stability at double and single precision.

b = [1 -0.5]; a = [1 -0.999999999]; act_flag1 = isstable(b,a)

`act_flag1 = `*logical*
1

act_flag2 = isstable(single(b),single(a))

`act_flag2 = `*logical*
0

### Verify Filter Stability from Cascaded Transfer Functions

*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. Verify that the filter is stable using the filter coefficients in the CTF format.

[B,A] = cheby2(40,50,0.4,"ctf"); flag = isstable(B,A,"ctf")

`flag = `*logical*
1

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. Verify that the filter is stable using the filter coefficients and gain in the CTF format.

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

`flag = `*logical*
1

## Input Arguments

`b`

, `a`

— Transfer function coefficients

vector

Transfer function coefficients, specified as vectors.

**Data Types: **`single`

| `double`

`B,A`

— Cascaded transfer function (CTF) coefficients

scalars | vectors | matrices

*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.

For more information about the cascaded transfer function format and coefficient matrices, see Specify Digital Filters in CTF Format.

**Note**

If any element of `A(:,1)`

is not equal to
`1`

, then `isstable`

normalizes the
filter coefficients by `A(:,1)`

. In this case,
`A(:,1)`

must be nonzero.

**Data Types: **`double`

| `single`

**Complex Number Support: **Yes

`g`

— Scale values

scalar | vector

*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 `isstable`

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`

`d`

— Digital filter

`digitalFilter`

object

Digital filter, specified as a `digitalFilter`

object.

`sos`

— Second order sections

*k*-by-6 matrix

Second order sections, specified as a *k*-by-6 matrix where the
number of sections *k* must be greater than or equal to 2. Each row of
`sos`

corresponds to the coefficients of a second order (biquad)
filter. The *i*th row of the matrix corresponds to ```
[bi(1)
bi(2) bi(3) ai(1) ai(2) ai(3)]
```

.

**Data Types: **`double`

## Output Arguments

`flag`

— Logical output

`1`

(`true`

) | `0`

(`false`

)

Logical output, returned as `1`

or `0`

. If the
poles lie on or outside the circle, the function returns `0`

. If the
poles are inside the circle, the function returns `1`

.

**Data Types: **`logical`

## More About

### 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
*H*_{1}(*z*),
*H*_{2}(*z*), …,
*H*_{L}(*z*) is

$$H(z)={\displaystyle \prod _{l=1}^{L}{H}_{l}(z)}={H}_{1}(z)\times {H}_{2}(z)\times \cdots \times {H}_{L}(z).$$

### 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}\\ \vdots & \vdots & \ddots & \vdots \\ {b}_{L1}& {b}_{L2}& \cdots & {b}_{L,m+1}\end{array}\right],\text{\hspace{1em}}A=\left[\begin{array}{cccc}{a}_{11}& {a}_{12}& \cdots & {a}_{1,n+1}\\ {a}_{21}& {a}_{22}& \cdots & {a}_{2,n+1}\\ \vdots & \vdots & \ddots & \vdots \\ {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}}\times \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}}\times \cdots \times \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**

**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}\\ \vdots & \vdots & \ddots & \vdots \\ {b}_{L1}& {b}_{L2}& \cdots & {b}_{L,m+1}\end{array}\right],\text{\hspace{1em}}A=\left[\begin{array}{cccc}{a}_{11}& {a}_{12}& \cdots & {a}_{1,n+1}\\ {a}_{21}& {a}_{22}& \cdots & {a}_{2,n+1}\\ \vdots & \vdots & \ddots & \vdots \\ {a}_{L1}& {a}_{L2}& \cdots & {a}_{L,n+1}\end{array}\right],\text{\hspace{1em}}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}}\times {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}}\times \cdots \times {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).$$

## Tips

## References

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

## Extended Capabilities

### C/C++ Code Generation

Generate C and C++ code using MATLAB® Coder™.

Usage notes and limitations:

If the first input to

`isstable`

is a variable-sized matrix during code generation, then it must not reduce to a vector at runtime.

## Version History

**Introduced in R2013a**

### R2024b: Analyze filters using cascaded transfer functions

The `isstable`

function supports inputs in the cascaded transfer
function (CTF) format.

## See Also

`ctffilt`

| `designfilt`

| `digitalFilter`

| `isallpass`

| `islinphase`

| `ismaxphase`

| `isminphase`

| `zplane`

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

## How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)