LLRFLibsPy库中ss_freqresp函数解读

source code: Github

这个函数 ss_freqresp 用于计算和绘制状态空间系统的频率响应。它适用于连续系统(当 TsNone 时)和离散系统(当 Ts 具有非零浮点值时)。

参数

  • A, B, C, D: 状态空间模型的矩阵(复杂矩阵),定义系统的动力学。
  • Ts: 采样时间,单位为秒。如果为 None,表示系统是连续的。
  • plot: 布尔值,是否绘制频率响应图。
  • plot_pno: 绘图点的数量。默认值为 1000。
  • plot_maxf: 要绘制的频率范围(+/-),单位为赫兹。默认值为 1 MHz。
  • title: 绘图标题。

返回值

  • status: 布尔值,表示计算是否成功。
  • f_wf: 频率波形,单位为赫兹。
  • A_wf_dB: 幅度响应波形,单位为分贝(dB)。
  • P_wf_deg: 相位响应波形,单位为度(degree)。
  • h: 复杂响应。

函数逻辑

  1. 输入检查与默认值设定

    • 检查 plot_pnoplot_maxf 的值,如果它们小于或等于 0,则分别设为默认值 1000 和 1 MHz。
    • 如果 Ts 不为 None,则检查 Ts 是否大于 0。如果不大于 0,则返回失败状态。
  2. 计算频率响应

    • 如果 TsNone,则系统是连续的:
      • 使用 signal.freqresp 计算频率响应。
    • 如果 Ts 不为 None,则系统是离散的:
      • 使用 signal.dfreqresp 计算频率响应。
  3. 计算显示结果

    • 将频率从弧度每秒转换为赫兹。
    • 计算幅度响应(单位为分贝)和相位响应(单位为度)。
  4. 绘制频率响应图(如果 plotTrue):

    • 调用 rf_plot 模块中的 plot_ss_freqresp 函数绘制频率响应图。
  5. 返回计算结果

    • 返回计算状态、频率波形、幅度响应波形、相位响应波形和复杂响应。

示例使用

假设有一个状态空间模型,其矩阵为 A, B, C, D,采样时间为 Ts,想要计算并绘制其频率响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
A = np.array([[0, 1], [-2, -3]])
B = np.array([[0], [1]])
C = np.array([[1, 0]])
D = np.array([[0]])
Ts = 0.1 # 采样时间

status, f_wf, A_wf_dB, P_wf_deg, h = ss_freqresp(A, B, C, D, Ts, plot=True)
if status:
print("Frequency response calculated successfully.")
print("Frequency (Hz):", f_wf)
print("Amplitude (dB):", A_wf_dB)
print("Phase (deg):", P_wf_deg)
else:
print("Failed to calculate frequency response.")

example-ss-freqresp.png

这个示例展示了如何使用 ss_freqresp 函数计算状态空间模型的频率响应,并选择性地绘制响应图。