如何将Python的scipy.signal.remez输出用于scipy.signal.lfilter?
我正在用Python创建一个带通滤波器。我使用signal.remez计算了传递函数的系数,频率响应看起来正是我想要的。不过,signal.remez返回的是一个一维的系数数组。我原本以为会得到两个数组,分别是传递函数的分子和分母。
我该如何在signal.lfilter中使用Python remez算法的输出呢?
代码片段:
from scipy.signal import lfilter, remez
def Rfilter(data, samplerate):
g = samplerate/2.
f = g/62.5
e = f*0.875
d = e*(3./7.)
c = d*(4./15.)
coeff = remez(400, [0, c, d, e, f, g], [0, 1, 0], Hz=samplerate, maxiter=100)
return coeff
infile = 'data.csv'
data = open(infile, 'r')
data = data.readlines()
X = []
V = []
for line in data:
line = line.strip().split(',')
X.append(float(line[0]))
V.append(float(line[1]))
timestep = X[1] - X[0]
samplerate = 1/timestep
#Here is the array of coefficients that remez returns.
coeff = Rfilter(V, samplerate)
#From coeff, need to generate a and b, the numerator and denomenator coefficients
#FV = lfilter(a, b, V)
1 个回答
4
这个问题虽然老旧,但已经有超过1000人查看,可能还有很多人有类似的疑问。
scipy.signal.remez
是用来计算一个 有限脉冲响应 (FIR) 滤波器的系数的。它的输出结果只有一组系数。你说你期待得到两组系数,这意味着你希望 remez
能设计一个 无限脉冲响应 (IIR) 滤波器,但 remez
并不支持这个功能。
你可以使用像 numpy.convolve
或者 scipy.signal.convolve
这样的卷积函数来应用这个滤波器。你也可以使用 scipy.signal.lfilter
。lfilter
可以接受一个 IIR 滤波器的系数。lfilter
的前两个参数,b
和 a
,分别是 IIR 滤波器的分子和分母的系数。你可以通过将 b
设置为 remez
返回的系数,并将 a=1
来将 FIR 滤波器传递给 lfilter
。(换句话说,一个分母很简单的 "IIR" 滤波器,实际上就是一个 FIR 滤波器。)