如何将Python的scipy.signal.remez输出用于scipy.signal.lfilter?

0 投票
1 回答
3699 浏览
提问于 2025-04-18 11:23

我正在用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.lfilterlfilter 可以接受一个 IIR 滤波器的系数。lfilter 的前两个参数,ba,分别是 IIR 滤波器的分子和分母的系数。你可以通过将 b 设置为 remez 返回的系数,并将 a=1 来将 FIR 滤波器传递给 lfilter。(换句话说,一个分母很简单的 "IIR" 滤波器,实际上就是一个 FIR 滤波器。)

撰写回答