bilinear — SciPy v1.15.3 Manual (original) (raw)

scipy.signal.

scipy.signal.bilinear(b, a, fs=1.0)[source]#

Return a digital IIR filter from an analog one using a bilinear transform.

Transform a set of poles and zeros from the analog s-plane to the digital z-plane using Tustin’s method, which substitutes 2*fs*(z-1) / (z+1) fors, maintaining the shape of the frequency response.

Parameters:

barray_like

Numerator of the analog filter transfer function.

aarray_like

Denominator of the analog filter transfer function.

fsfloat

Sample rate, as ordinary frequency (e.g., hertz). No prewarping is done in this function.

Returns:

bndarray

Numerator of the transformed digital filter transfer function.

andarray

Denominator of the transformed digital filter transfer function.

Examples

from scipy import signal import matplotlib.pyplot as plt import numpy as np

fs = 100 bf = 2 * np.pi * np.array([7, 13]) filts = signal.lti(*signal.butter(4, bf, btype='bandpass', ... analog=True)) filtz = signal.lti(signal.bilinear(filts.num, filts.den, fs)) wz, hz = signal.freqz(filtz.num, filtz.den) ws, hs = signal.freqs(filts.num, filts.den, worN=fswz)

plt.semilogx(wzfs/(2np.pi), 20np.log10(np.abs(hz).clip(1e-15)), ... label=r'$|H_z(e^{j \omega})|$') plt.semilogx(wzfs/(2np.pi), 20np.log10(np.abs(hs).clip(1e-15)), ... label=r'$|H(j \omega)|$') plt.legend() plt.xlabel('Frequency [Hz]') plt.ylabel('Amplitude [dB]') plt.grid(True)

../../_images/scipy-signal-bilinear-1.png