如何使用Python不使用更高级别的软件包对传递函数建模并绘制幅度和相位响应?

问题描述

我正在尝试在Python中为传递函数建模,并认为我可以通过简单地绘制许多频率处的传递函数来做到这一点。这似乎适用于二阶LPF。参见下图。

Magnitude response of 2nd Order LPF.

一些示例代码如下:

s = np.arange(10 * 2 * np.pi,1000 * 2 * np.pi,10) # Creates vector of frequencies in rad/s
lpf = np.zeros(len(s))  # Initializes lowpass filter vector

for k in range(len(s)):
   lpf[k] = lpfilt_func(s[k])  # Calls LPF function with TF = cutoff_freq ** 2 / (s + cutoff_freq) ** 2

要获得频率响应,我没有使用s作为实数,而是使用内置函数scomplex(0,s)更改为复数并计算了幅度和相位如下:

for k in range(len(s)):
   lpf[k] = lpfilt_func(complex(0,s[k]))
   gain_lpf[k] = np.absolute(lpfilt_func(complex(0,s[k])))
   phase_lpf[k] = np.angle(lpfilt_func(complex(0,s[k]))) * 180 / np.pi  # Phase in deg

我认为这本质上类似于设置s = jw,然后将幅度计算为| LPF |。 = \ sqrt {A ^ 2 + B ^ 2},相位响应为\ angle {LPF} = \ angle {(B / A)}。

这是计算传递函数频率响应的有效方法吗? s从实数到复数的转换有效吗?

我知道有一些软件包和库,例如scipy.signal,可以轻松地对SISO系统执行此操作。但是,我上面的方法可以用于MIMO系统吗?还是本质上相当复杂的系统?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)