質問: np.linspace(0, 1/samplingF,NN) set=y #フーリエ変換する要素 numf=abs(np.fft.fft(set)*2/NN) #フィルタ前のフーリエ変換 nyq=1/(samplingF*2) #ナイキスト周波数 fe1=100/nyq #カットオフ周波数1 fe2=130/nyq #カットオフ周波数2 numtaps =int(NN) #タップ数 bandpass=scipy.signal.firwin(numtaps,[fe1,fe2],pass_zero=False) #バンドパスフィルタ passdata=scipy.signal.lfilter(bandpass,1,set) #フィルタ処理 numff=abs(np.fft.fft(passdata)*2/NN) #フィルタ後のフーリエ変換 plt.plot(fq,numf) #フィルタ前の波形 plt.plot(fq,numff) #フィルタ後の波形 plt.xlim(50,200) plt.xlabel('freqency(Hz)', fontsize=14) plt.ylabel('signal amplitude', fontsize=14) plt.show() ```
回答: こんにちは。 ご要望が多いため、完全な答えをご提供できませんが、下記が解決のヒントになれば幸いです。 結論から申し上げますと、フィルタ設計は適切にできていると思われます。 設計されたFIRフィルタを `scipy.signal.freqz` で分析すると下図のようになります。 正規化後のカットオフ周波数は `fe1, fe2 = 0.05, 0.065` ですので、たしかにバンドパスフィルタとして機能しているように見えます。 !イメージ説明 下記のコードでこの内容が再現できます。 ``` plt.figure() plt.plot(w/np.pi, 20*np.log10(abs(h))) plt.vlines(x=[fe1, fe2], ymin=-20, ymax=0, linestyle="dashed", colors='grey') plt.xlim(0, fe2*1.25) plt.ylim(-20,0) plt.show() ``` フィルタは正しく設計できているので、プロットする元のデータやFFTの内容を見直してみてはいかがでしょうか。