我正在尝试在 python/Scipy 中实现具有以下 S 域传递函数的双二阶滤波器:
我的问题是,由于 N 幂分母,我不知道如何将此传递函数写入 scipy.signal 中的 freqs 或 filtfilt 函数所需的 M 阶分子和 N 阶分母数组形式. 作为一种解决方法,我将滤波器分解为 N-1 个二阶低通和一个二阶带通部分的级联,例如(对于 N=4):
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 域吗?
非常感谢您的帮助!