Main Content

bilinear

Bilinear transformation method for analog-to-digital filter conversion

Description

[zd,pd,kd] = bilinear(z,p,k,fs) converts the s-domain transfer function in pole-zero form specified by z, p, k and sample rate fs to a discrete equivalent.

example

[numd,dend] = bilinear(num,den,fs) converts the s-domain transfer function specified by numerator num and denominator den to a discrete equivalent.

[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs) converts the continuous-time state-space system in matrices A, B, C, and D to a discrete-time system.

example

[___] = bilinear(___,fp)uses parameter fp as "match" frequency to specify prewarping.

example

Examples

collapse all

Design the prototype for a 10th-order Chebyshev type I filter with 6 dB of ripple in the passband. Convert the prototype to state-space form.

[z,p,k] = cheb1ap(10,6);
[A,B,C,D] = zp2ss(z,p,k);  

Transform the prototype to a bandpass filter such that the equivalent digital filter has a passband with edges at 100 Hz and 500 Hz when sampled at a rate fs=2kHz. For the transformation, specify prewarped band edges u1and u2 in rad/s, a center frequency Wo=u1u2, and a bandwidth Bw=u2-u1.

fs = 2e3;

f1 = 100; u1 = 2*fs*tan(f1*(2*pi/fs)/2);
f2 = 500; u2 = 2*fs*tan(f2*(2*pi/fs)/2);

[At,Bt,Ct,Dt] = lp2bp(A,B,C,D,sqrt(u1*u2),u2-u1);

Compute the frequency response of the analog filter using freqs. Plot the magnitude response and the prewarped frequency band edges.

[b,a] = ss2tf(At,Bt,Ct,Dt);
[h,w] = freqs(b,a,2048);

plot(w,mag2db(abs(h)))
xline([u1 u2],"-",["Lower" "Upper"]+" passband edge", ...
    LabelVerticalAlignment="middle")

ylim([-165 5])
xlabel("Angular frequency (rad/s)")
ylabel("Magnitude (dB)")
grid

Figure contains an axes object. The axes object with xlabel Angular frequency (rad/s), ylabel Magnitude (dB) contains 3 objects of type line, constantline.

Use the bilinear function to create a digital bandpass filter with sample rate fs.

[Ad,Bd,Cd,Dd] = bilinear(At,Bt,Ct,Dt,fs);

Convert the digital filter from state-space form to second-order sections and compute the frequency response using freqz. Plot the magnitude response and the passband edges.

[hd,fd] = freqz(ss2sos(Ad,Bd,Cd,Dd),2048,fs);

plot(fd,mag2db(abs(hd)))
xline([f1 f2],"-",["Lower" "Upper"]+" passband edge", ...
    LabelVerticalAlignment="middle")

ylim([-165 5])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")
grid

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 3 objects of type line, constantline.

Design a 6th-order elliptic analog lowpass filter with 5 dB of ripple in the passband, a stopband attenuation of 90 dB, and a cutoff frequency fc=20Hz.

fc = 20;

[z,p,k] = ellip(6,5,90,2*pi*fc,"s");

Visualize the magnitude response of the analog elliptic filter. Display the cutoff frequency.

[num,den] = zp2tf(z,p,k);
[h,w] = freqs(num,den,1024);

plot(w/(2*pi),mag2db(abs(h)))
xline(fc,Color=[0.8500 0.3250 0.0980])

axis([0 100 -125 5])
grid
legend(["Magnitude response" "Cutoff frequency"])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 2 objects of type line, constantline. These objects represent Magnitude response, Cutoff frequency.

Use the bilinear function to transform the analog filter to a discrete-time IIR filter. Specify a sample rate fs=200Hz and a prewarping match frequency fp=20Hz.

fs = 200;
fp = 20;

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

Visualize the magnitude response of the discrete-time filter. Display the cutoff frequency.

[hd,fd] = freqz(zp2sos(zd,pd,kd),[],fs);

plot(fd,mag2db(abs(hd)))
xline(fc,Color=[0.8500 0.3250 0.0980])

axis([0 100 -125 5])
grid
legend(["Magnitude response" "Cutoff frequency"])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 2 objects of type line, constantline. These objects represent Magnitude response, Cutoff frequency.

Input Arguments

collapse all

Zeros, poles, and gain of the s-domain transfer function, specified as two column vectors and a scalar.

Sample rate, specified as a positive scalar.

Numerator and denominator coefficients of the analog transfer function, specified as row vectors.

State-space representation in the s-domain, specified as matrices. If the system has p inputs and q outputs and is described by n state variables, then A is n-by-n, B is n-by-p, C is q-by-n, and D is q-by-p.

Data Types: single | double

Match frequency, specified as a positive scalar.

Output Arguments

collapse all

Zeros, poles, and gain of the z-domain transfer function, returned as column vectors and a scalar.

Numerator and denominator coefficients of the digital transfer function, returned as row vectors.

State-space representation in the z-domain, returned as matrices. If the system is described by n state variables and has q outputs, then Ad is n-by-n, Bd is n-by-1, Cd is q-by-n, and Dd is q-by-1.

Data Types: single | double

Algorithms

collapse all

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=2fs×z1z+1.

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

ω=2tan1(Ω2fs).

bilinear can accept an optional parameter fp that specifies prewarping. fp, in hertz, indicates a match 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=2πfptan(πfpfs)×z1z+1.

With the prewarping option, bilinear maps the jΩ axis (from Ω = –∞ to +∞) repeatedly around the unit circle (e, from ω = –π to π) by

ω=2tan1(Ωtan(πfpfs)2πfp).

In prewarped mode, bilinear matches the frequency 2πfp (in radians per second) in the s-plane to the normalized frequency 2πfp/fs (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.

bilinear uses one of two algorithms depending on the format of the input linear system you supply. One algorithm works on the zero-pole-gain format and the other on the state-space format. For transfer function representations, bilinear converts to state-space form, performs the transformation, and converts the resulting state-space system back to transfer function form.

Zero-Pole-Gain Algorithm

For a system in zero-pole-gain form, bilinear performs four steps:

  1. If fp is present, it prewarps:

    fp = 2*pi*fp;
    fs = fp/tan(fp/fs/2)
    

    otherwise, fs = 2*fs.

  2. It strips any zeros at ±∞ using

    z = z(finite(z));
    
  3. It transforms the zeros, poles, and gain using

    pd = (1+p/fs)./(1-p/fs);    % Do bilinear transformation
    zd = (1+z/fs)./(1-z/fs);
    kd = real(k*prod(fs-z)./prod(fs-p));
    
  4. It adds extra zeros at –1 so the resulting system has equal numerator and denominator orders.

State-Space Algorithm

The state-space equations for analog system

x˙=Ax+Buy=Cx+Du

can be converted to discrete form:

x[n+1]=Adx[n]+Bdu[n],y[n]     =Cdx[n]+Ddu[n].

To do the conversion, bilinear performs two steps [1]:

  1. If a match frequency fp is specified, let

    λ=πfptan(πfp/fs).

    If fp is not specified, let λ = fs.

  2. Compute Ad, Bd, Cd, and Dd in terms of A, B, C, and D using

    Ad=(IA12λ)1(I+A12λ),Bd=1λ(IA12λ)1B,Cd=1λC(IA12λ)1,Dd=12λC(IA12λ)1B+D.

Transfer Function

For a system in transfer function form, bilinear converts 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:

B(s)A(s)=B(1)sn++B(n)s+B(n+1)A(1)sm++A(m)s+A(m+1)

fs is the sample rate 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.

References

[1] Al-Saggaf, Ubaid M., and Gene F. Franklin. “Model Reduction via Balanced Realizations: An Extension and Frequency Weighting Techniques.” IEEE Transactions on Automatic Control 33, no. 7 (July 1988): 687–92. https://doi.org/10.1109/9.1280.

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

[3] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987.

[4] Tustin, Arnold. “A Method of Analysing the Behaviour of Linear Systems in Terms of Time Series.” Journal of the Institution of Electrical Engineers - Part IIA: Automatic Regulators and Servo Mechanisms 94, no. 1 (May 1947): 130–42. https://doi.org/10.1049/ji-2a.1947.0020.

Extended Capabilities

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced before R2006a

See Also

| | | |

Topics