FIR フィルターの設計には、いくつかの手法とアプローチがあります。ただし、f_c Hz (サンプリング レート sr Hz) を中心とする n_pts ポイントを持つ単純なバンドパス フィルターが必要な場合は、次のようにします。
import numpy as np
import scipy.signal
fir_coeff = np.hanning(n_pts)*np.cos(2.*np.pi*f_c/sr*np.arange(n_pts))
fir_coeff /= np.sum(np.hanning(n_pts))
filtered_signal = scipy.signal.lfilter(fir_coeff, 1.0, signal)
これは妥当なバンドパス フィルターで、Q は約 n_pts/(sr/f_c) です。フィルタ長 n_pts を増やすことで、Q を増やします (より狭いバンドパス フィルタにします)。
低電力ハードウェアにフィルターを実装しようとしている場合は、FIR の代わりに IIR フィルターを使用する方がはるかに優れていることに注意してください (それらが問題に適している場合)。したがって、同様のフィルターを次のように実装できます。
# Q = n_pts/(sr/f_c) or defined some other way
w_c = 2*pi*f_c/sr
beta = np.cos(w_c)
BW = w_c / Q
alpha = (1. - np.sin(BW))/np.cos(BW)
G = (1. - alpha)/2.
filtered_signal = scipy.signal.lfilter([G, 0, -G], [1, -beta*(1+alpha), alpha], signal)
適度に狭いフィルター (n_pts = 33 程度) の場合、これは 1 桁速くなるはずです。
(式はhttp://www.ee.columbia.edu/~dpwe/e4810/lectures/L06-filters.pdfのスライド 14 に基づいています。これは DSP コースで学習するものです)。