y=filter(b,a,x,zi)
およびdy[i]/dx[j]
を、GPUの実装で可能なスピードアップのために時間領域ではなくFFTを使用して計算したいと考えています。FFTを使用したフィルタ(b、a、x、zi)の計算
特に、zi
がゼロ以外の場合は、それが可能かどうかはわかりません。私はscipeyでscipy.signal.lfilter
、オクターブでfilter
がどのように実装されているか調べました。それらは、ダイレクトフォーム2とオクターブ直接フォーム1(DLD-FUNCTIONS/filter.cc
のコードを見て)を使用してscipyで、時間領域で直接行われます。私は、MATLABのFIRフィルター(つまりa = [1.])の場合はfftfilt
に類似したFFT実装を見たことがありません。
私は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)
ありがとうございました。このコードは、音声信号のパワースペクトルを計算するようです。私は、FFT経由のIRRフィルタリングがどこで行われるのかを見つけることができませんでした。 – Paul