我正在python中创建一个带通滤波器。我使用signal.remez计算传递函数系数,频率响应看起来就像我想要的那样。但是,signal.remez返回单个1D系数数组。我期待两个数组,每个数组用于传递函数的分子和分母。
如何在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)
答案 0 :(得分:0)
这是一个古老的问题,但是有1000多个视图,也许仍然有人在这里出现类似的问题。
scipy.signal.remez
计算finite impulse response(FIR)滤波器的系数。输出只是一组系数。您说您期望两组系数,这意味着您期望remez
设计一个infinite impulse response(IIR)过滤器,但是remez
不会这样做。
您可以将滤波器与卷积函数一起使用,例如numpy.convolve
或scipy.signal.convolve
。您也可以使用scipy.signal.lfilter
。 lfilter
接受IIR滤波器的系数。 lfilter
的前两个自变量b
和a
是IIR滤波器的分子和分母的系数。通过将lfilter
设置为b
返回的系数并设置remez
,可以将FIR滤波器传递到a=1
。 (换句话说,带有平凡分母的“ IIR”滤波器实际上是FIR滤波器。)