アップデート:
この質問に基づいた Scipy レシピを見つけました! したがって、興味のある方は、目次 » 信号処理 » バターワース バンドパスに直接アクセスしてください。
1-D numpy 配列 (時系列) にバターワース バンドパス フィルターを実装するという、当初は単純なタスクに見えたものを達成するのに苦労しています。
含める必要があるパラメーターは、sample_rate、ヘルツのカットオフ周波数、および場合によっては次数です (減衰、固有周波数などの他のパラメーターは私にはわかりにくいため、任意の「デフォルト」値で十分です)。
私が今持っているのはこれです。これはハイパスフィルターとして機能しているようですが、正しく行っているかどうかはわかりません:
def butter_highpass(interval, sampling_rate, cutoff, order=5):
nyq = sampling_rate * 0.5
stopfreq = float(cutoff)
cornerfreq = 0.4 * stopfreq # (?)
ws = cornerfreq/nyq
wp = stopfreq/nyq
# for bandpass:
# wp = [0.2, 0.5], ws = [0.1, 0.6]
N, wn = scipy.signal.buttord(wp, ws, 3, 16) # (?)
# for hardcoded order:
# N = order
b, a = scipy.signal.butter(N, wn, btype='high') # should 'high' be here for bandpass?
sf = scipy.signal.lfilter(b, a, interval)
return sf
ドキュメントと例は紛らわしくわかりにくいですが、「バンドパス用」とマークされたコマンドに示されているフォームを実装したいと思います。コメント内の疑問符は、何が起こっているのかを理解せずに例をコピーして貼り付けただけの場所を示しています。
私は電気工学者でも科学者でもありません。医療機器の設計者であり、EMG 信号に対してかなり単純なバンドパス フィルタリングを実行する必要があります。