Bilinear transformation method for analog-to-digital filter conversion

`[zd,pd,kd] = bilinear(z,p,k,fs) `

[zd,pd,kd] = bilinear(z,p,k,fs,fp)

[numd,dend] = bilinear(num,den,fs)

[numd,dend] = bilinear(num,den,fs,fp)

[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs)

[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs,fp)

The *bilinear transformation* is a mathematical
mapping of variables. In digital filtering, it is a standard method
of mapping the *s* or analog plane into the *z* or
digital plane. It transforms analog filters, designed using classical
filter design techniques, into their discrete equivalents.

The bilinear transformation maps the *s*-plane
into the *z*-plane by

$$H(z)=H{(s)|}_{s=2{f}_{z}\frac{z-1}{z+1}}$$

This transformation maps the *j*Ω axis
(from Ω = –∞
to +∞) repeatedly around the unit circle (*e ^{jw}*,
from ω = –π to π)
by

$$\omega =2{\mathrm{tan}}^{-1}\left(\frac{\Omega}{2{f}_{s}}\right)$$

`bilinear`

can accept an optional parameter `Fp`

that
specifies prewarping. `fp`

, in hertz, indicates
a "match" frequency, that is, a frequency for which
the frequency responses before and after mapping match exactly. In
prewarped mode, the bilinear transformation maps the *s*-plane
into the *z*-plane with

$$H(z)=H{(s)|}_{s=\frac{2\pi {f}_{p}}{\mathrm{tan}\left(\pi \frac{{f}_{p}}{{f}_{z}}\right)}}{}_{\frac{(z-1)}{(z+1)}}$$

With the prewarping option, `bilinear`

maps
the *j*Ω axis (from Ω = –∞ to +∞) repeatedly around the unit
circle (*e ^{jw}*, from ω = –π to π) by

$$\omega =2{\mathrm{tan}}^{-1}\left(\frac{\Omega \mathrm{tan}\left(\pi \frac{{f}_{p}}{{f}_{s}}\right)}{2\pi {f}_{p}}\right)$$

In prewarped mode, `bilinear`

matches the frequency
2π*f*_{p} (in radians per
second) in the *s*-plane to the normalized frequency
2π*f*_{p}/*f*_{s} (in
radians per second) in the *z*-plane.

The `bilinear`

function works with three different
linear system representations: zero-pole-gain, transfer function,
and state-space form.

`[zd,pd,kd] = bilinear(z,p,k,fs) `

and

`[zd,pd,kd] = bilinear(z,p,k,fs,fp) `

convert the *s*-domain transfer function specified
by `z`

, `p`

, and `k`

to
a discrete equivalent. Inputs `z`

and `p`

are
column vectors containing the zeros and poles, `k`

is
a scalar gain, and `fs`

is the sampling frequency
in hertz. `bilinear`

returns the discrete equivalent
in column vectors `zd`

and `pd`

and
scalar `kd`

. The optional match frequency, `fp`

is
in hertz and is used for prewarping.

`[numd,dend] = bilinear(num,den,fs)`

and

`[numd,dend] = bilinear(num,den,fs,fp)`

convert
an *s*-domain transfer function given by `num`

and `den`

to
a discrete equivalent. Row vectors `num`

and `den`

specify
the coefficients of the numerator and denominator, respectively, in
descending powers of *s*. Let *B*(*s*)
be the numerator polynomial and *A*(*s*)
be the denominator polynomial. The transfer function is:

$$\frac{B(s)}{A(s)}=\frac{B(1){s}^{n}+\cdots +B(n)s+B(n+1)}{A(1){s}^{m}+\cdots +A(m)s+A(m+1)}$$

`fs`

is the sampling frequency in hertz. `bilinear`

returns
the discrete equivalent in row vectors `numd`

and `dend`

in
descending powers of *z* (ascending
powers of *z*^{–1}). `fp`

is
the optional match frequency, in hertz, for prewarping.

`[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs)`

and

`[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs,fp)`

convert
the continuous-time state-space system in matrices `A`

, `B`

, `C`

, `D`

$$\begin{array}{l}\dot{x}=Ax+Bu\\ y=Cx+Du\end{array}$$

to the discrete-time system:

$$\begin{array}{l}x[n+1]={A}_{d}x[n]+{B}_{d}u[n]\\ y[n]\text{}={C}_{d}x[n]+{D}_{d}u[n]\text{}\end{array}$$

`fs`

is the sampling frequency in hertz. `bilinear`

returns
the discrete equivalent in matrices `Ad`

, `Bd`

, `Cd`

, `Dd`

.
The optional match frequency, `fp`

is in hertz and
is used for prewarping.

`bilinear`

requires that the numerator order
be no greater than the denominator order. If this is not the case, `bilinear`

displays

Numerator cannot be higher order than denominator.

For `bilinear`

to distinguish between the zero-pole-gain
and transfer function linear system formats, the first two input parameters
must be vectors with the same orientation in these cases. If this
is not the case, `bilinear`

displays

First two arguments must have the same orientation.

[1] Parks, Thomas W., and C. Sidney Burrus. *Digital
Filter Design*. New York: John Wiley & Sons, 1987,
pp. 209–213.

[2] Oppenheim, Alan V., Ronald W. Schafer,
and John R. Buck. *Discrete-Time Signal Processing*.
Upper Saddle River, NJ: Prentice Hall, 1999, pp. 450–454.

Was this topic helpful?