scipy.signal.

dbode#

scipy.signal.dbode(system, w=None, n=100)[原始碼]#

計算離散時間系統的 Bode 振幅和相位資料。

參數:
system

LTI 類別 dlti 的實例或描述系統的元組。元組中的元素數量決定了解釋方式,即:

  1. (sys_dlti):LTI 類別 dlti 的實例。請注意,衍生的實例,例如 TransferFunctionZerosPolesGainStateSpace 的實例,也都是允許的。

  2. (num, den, dt):有理多項式,如 TransferFunction 中所述。多項式的係數應以指數遞減的順序指定,例如,z² + 3z + 5 將表示為 [1, 3, 5]

  3. (zeros, poles, gain, dt):零點、極點、增益形式,如 ZerosPolesGain 中所述。

  4. (A, B, C, D, dt):狀態空間形式,如 StateSpace 中所述。

warray_like,選用

頻率陣列,標準化至 Nyquist 頻率為 π,即單位為弧度/樣本。振幅和相位資料會針對此陣列中的每個值計算。如果未給定,將會計算一組合理的數值。

nint,選用

如果未給定 w,則要計算的頻率點數量。n 個頻率點會以對數方式間隔,間隔範圍會選擇包含系統的極點和零點的影響。

返回:
w1D ndarray

頻率陣列,標準化至 Nyquist 頻率為 np.pi/dt,其中 dtsystem 參數的取樣間隔。單位為 rad/s,假設 dt 單位為秒。

mag1D ndarray

以 dB 為單位的振幅陣列

phase1D ndarray

以度為單位的相位陣列

註解

此函數是 dfreqresp 的便利包裝函式,用於從計算出的頻率響應複數值振幅中提取振幅和相位。

在 0.18.0 版本中新增。

範例

以下範例示範如何建立一個 5 階 Butterworth 低通濾波器的 Bode 圖,其轉角頻率為 100 Hz

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from scipy import signal
...
>>> T = 1e-4  # sampling interval in s
>>> f_c, o = 1e2, 5  # corner frequency in Hz (i.e., -3 dB value) and filter order
>>> bb, aa = signal.butter(o, f_c, 'lowpass', fs=1/T)
...
>>> w, mag, phase = signal.dbode((bb, aa, T))
>>> w /= 2*np.pi  # convert unit of frequency into Hertz
...
>>> fg, (ax0, ax1) = plt.subplots(2, 1, sharex='all', figsize=(5, 4),
...                               tight_layout=True)
>>> ax0.set_title("Bode Plot of Butterworth Lowpass Filter " +
...               rf"($f_c={f_c:g}\,$Hz, order={o})")
>>> ax0.set_ylabel(r"Magnitude in dB")
>>> ax1.set(ylabel=r"Phase in Degrees",
...         xlabel="Frequency $f$ in Hertz", xlim=(w[1], w[-1]))
>>> ax0.semilogx(w, mag, 'C0-', label=r"$20\,\log_{10}|G(f)|$")  # Magnitude plot
>>> ax1.semilogx(w, phase, 'C1-', label=r"$\angle G(f)$")  # Phase plot
...
>>> for ax_ in (ax0, ax1):
...     ax_.axvline(f_c, color='m', alpha=0.25, label=rf"${f_c=:g}\,$Hz")
...     ax_.grid(which='both', axis='x')  # plot major & minor vertical grid lines
...     ax_.grid(which='major', axis='y')
...     ax_.legend()
>>> plt.show()
../../_images/scipy-signal-dbode-1.png