Main Content

bilinear

Bilinear transformation method for analog-to-digital filter conversion

Description

Use this function to convert a continuous-time transfer function to a discrete-time equivalent.

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

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

expand all

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

Version History

Introduced before R2006a

See Also

| | | |

Topics