Pythonで信号をバンドパスフィルタにかけたいと考えています。
Python
1fs = 250 # サンプリング周波数 2nyq = fs / 2 # ナイキスト周波数 3fc1 = 4 / fs # カットオフ周波数 4fc2 = 50 / fs # カットオフ周波数 5numtaps = 125 # フィルタ係数の数 6dt = 0.04 # サンプリング間隔 7t = np.arange(0, N*dt, dt) # 時間軸 8freq = np.linspace(0, 1.0/dt, N) # 周波数軸 9 10# フィルタ係数 11b = scipy.signal.firwin(numtaps, [fc1, fc2], pass_zero=False) 12# scipyによるFIRフィルタ 13data_pca = scipy.signal.lfilter(b, 1, data_pca) 14 15 16F = np.fft.fft(data_pca) 17Amp = np.abs(F) 18 19plt.subplot(211) 20plt.plot(t, F) 21plt.xlim(0, 30) 22plt.subplot(212) 23plt.plot(freq, Amp) 24 25plt.show()
このようなコードで実行して4Hzから50Hzの周波数だけ残したと思っています。
実行すると、このようになりました。
下の図を見るとフィルタがかかっていないように思えます。
正しければ、4から50Hzの周波数帯だけが残ると考えています。
どのようにすれば正しくフィルタをかけることができますか。
よろしくお願いします。
波形のみ表示しても周波数成分がどのようになっているか不明瞭です。FFTなどによる周波数スペクトルを比較すべきではないでしょうか?
フィルタ適用前の周波数スペクトルはありますか?
周波数スペクトルの画像を追加しました。まだ、足りない点があれば教えてください。よろしくお願いします。
最初の自分のコメントは指摘ミスでした。大変失礼しました。元々フィルター後の周波数スペクトルをプロットされてたんですね。ozwkさんコメントのとおりフィルタ適用前の(data_pca = scipy.signal.lfilter(b, 1, data_pca)をコメント化したときの)実行結果をそのまま追加すればよいと思います。ところで3枚目の図は自分にはよくわかりませんでした・・・
回答ありがとうございます。コメント化したときの実行結果を更新しておきました。よろしくお願います。
fs=250Hzならdt=0.004じゃないですかね
dt=1.0/fsと計算で求めた方が間違いがないですね!
ありがとうございます。とても参考になりました。
回答2件
あなたの回答
tips
プレビュー