我想尝试计算y=filter(b,a,x,zi)
和dy[i]/dx[j]
使用 FFT,而不是在时域中,以便在 GPU 实现中实现可能的加速。
我不确定这是否可能,尤其是在zi
非零时。我查看了如何scipy.signal.lfilter
在 scipy 和filter
octave 中实现。它们都直接在时域中完成,scipy 使用直接形式 2 和八度直接形式 1(通过查看 中的代码DLD-FUNCTIONS/filter.cc
)。我在任何地方都没有看到类似于fftfilt
MATLAB 中的 FIR 滤波器的 FFT 实现(即 a = [1.])。
我试过这样做y = ifft(fft(b) / fft(a) * fft(x))
,但这似乎在概念上是错误的。另外,我不确定如何处理初始瞬态zi
。任何引用,指向现有实现的指针,将不胜感激。
示例代码,
import numpy as np
import scipy.signal as sg
import matplotlib.pyplot as plt
# create an IRR lowpass filter
N = 5
b, a = sg.butter(N, .4)
MN = max(len(a), len(b))
# create a random signal to be filtered
T = 100
P = T + MN - 1
x = np.random.randn(T)
zi = np.zeros(MN-1)
# time domain filter
ylf, zo = sg.lfilter(b, a, x, zi=zi)
# frequency domain filter
af = sg.fft(a, P)
bf = sg.fft(b, P)
xf = sg.fft(x, P)
yfft = np.real(sg.ifft(bf/af * xf))[:T]
# error
print np.linalg.norm(yfft - ylf)
# plot, note error is larger at beginning and with larger N
plt.figure(1)
plt.clf()
plt.plot(ylf)
plt.plot(yfft)