如何在 Python/SciPy 中实现级联双二阶传递函数

信息处理 过滤器 过滤器设计 Python scipy 双二阶
2022-02-15 10:40:20

我正在尝试在 python/Scipy 中实现具有以下 S 域传递函数的双二阶滤波器:

H(s)=w02N1(s+wz)[s2+(w0/Q)s+w02]N

我的问题是,由于 N 幂分母,我不知道如何将此传递函数写入 scipy.signal 中的 freqs 或 filtfilt 函数所需的 M 阶分子和 N 阶分母数组形式. 作为一种解决方法,我将滤波器分解为 N-1 个二阶低通和一个二阶带通部分的级联,例如(对于 N=4):

H(s)=w02s2+(w0/Q)s+w02×w02s2+(w0/Q)s+w02×w02s2+(w0/Q)s+w02×w0(s+wz)s2+(w0/Q)s+w02
这是我的代码:

from scipy import signal
import numpy as np

N=4
Q=10
fc=1000
worN=np.linspace(0, np.pi, int(fs/2))
wc =2*np.pi*fc/fs
w0=wc/(np.sqrt(((N-1)/(2*N-1))*(1-1/(2*Q[ii]**2))) * np.sqrt(1+np.sqrt(1+(1/((N-1)**2/(2*N-1)*(1-1/(2*Q[ii]**2))**2)))))

wz =1/10*w0

#LP transfers function
num_LP=[0, 0, w0**2]
den_LP=[1, w0/Q, w0**2]
w_LP, h_LP=signal.freqs(num_LP,den_LP,worN=worN)


#BP transfers function
num_BP=[0, w0, wz*w0]
den_BP=[1, w0/Q, w0**2]

w_BP, h_BP =signal.freqs(num_BP,den_BP,worN=worN)


# Cascad 3 LP biquads with 1 BP biquad filter
h_casc=h_LP**(N-1)*h_BP

这种解决方法效果很好,但在计算方面它可能不是最有效的。此外,我的最终目标是使用最小二乘算法优化过滤器的参数,因此级联解决方案可能不是最好的解决方案。

我的问题是,如何将此过滤器公式化为单个传递函数,以便实现实际的过滤函数 scipy.signal.filtfilt 或 scipy.signal.lfilter?

filtered_signal=scipy.signal.filtfilt(numerator,denumerator,input_signal)

我应该先将传递函数转换为 Z 域吗?

非常感谢您的帮助!

2个回答

我不知道如何将此传递函数写入 scipy.signal 中的 filts 函数所需的 M 阶分子和 N 阶分母形式。

什么是“过滤”功能?

#LP transfers function
num_LP=[0, 0, w0**2]
den_LP=[1, w0/Q, w0**2]

这对我来说是正确的。

#BP transfers function
num_BP=[0, w0, wz**2]
den_BP=[1, w0/Q, w0**2]

那不应该w0*wz代替wz**2吗?

# Cascad 3 LP biquads with 1 BP biquad filter
h_casc=h_LP**(N-1)*h_BP

这对于查看频率响应很好,但不能实现实际的滤波器。

我的问题是,如何将此过滤器公式化为单个传递函数?

你不应该。您应该将其保留为四个过滤阶段并连续应用它们。级联二阶部分优于高阶传递函数,后者更容易受到数值误差的影响。

我应该先将传递函数转换为 Z 域吗?

是的,您的滤波器是模拟的,因此您可以使用 来查看模拟频率响应scipy.signal.freqs,但如果您想实际过滤信号,则需要先将其转换为数字滤波器。使用什么转换以及使用什么采样率取决于您的最终目标。

正如 endolith 指出的那样,级联二阶部分比直接形式的滤波器在数值上更稳健,如果您坚持将一系列级联滤波器转换为直接形式的传递函数,只需分别乘分子和分母多项式即可。

H(s)=B1(s)A1(s)B2(s)A2(s)=B1(s)B2(s)A1(s)A2(s)
多项式的乘法相当于离散卷积。这里因此,总传递函数由下式给出

num = conv(conv(conv(num_LP, num_LP), num_LP), num_BP)
den = conv(conv(conv(den_LP, den_LP), den_LP), den_BP)