お世話になります。
scipyを使ったFIRフィルタの仕方について質問させていただきます。teratailでもいくつかFIRフィルタについて質問がありましたので、質問内容と以下のホームページ(https://momonoki2017.blogspot.com/2018/03/pythonfft-1-fft.html)を参考にしてプログラムを組んでみました。
以下ソースコードです。
これは、60Hzと120Hzを合計した信号をFIRフィルタ(バンドパスフィルタ。カットオフ周波数は100~130Hz)を通す処理を行っております。私自身の理解として、フィルタを通した後は120Hzの周波数特性だけが抜き出されるのかと思いましたが、私のイメージとは異なります。この波形は正解なのでしょうか。仕方が間違っている、もしくは理解が異なっておりましたらご指摘願います。
また、本サイトの質問の主旨から少し離れるかもしれませんが、タップ数についてあまり理解できていないので、それにつきましても教えていただきたく思います。今回はデータ数分のタップ数を設けておりますが、それで問題ないでしょうか。タップ数の決め方も教えていただければ幸いです。
よろしくお願いいたします。
python
1import numpy as np 2import scipy.signal 3import matplotlib.pyplot as plt 4 5N=10.00 #データ最大値 6samplingF=0.0001 #サンプリング周波数 7NN=N/samplingF 8data=np.arange(0,N,samplingF) 9y=np.sin(2*np.pi*60*data)+np.sin(2*np.pi*120*data) #60Hz+120Hz信号 10fq = np.linspace(0, 1/samplingF,NN) 11set=y #フーリエ変換する要素 12numf=abs(np.fft.fft(set)*2/NN) #フィルタ前のフーリエ変換 13nyq=1/(samplingF*2) #ナイキスト周波数 14fe1=100/nyq #カットオフ周波数1 15fe2=130/nyq #カットオフ周波数2 16numtaps =int(NN) #タップ数 17bandpass=scipy.signal.firwin(numtaps,[fe1,fe2],pass_zero=False) #バンドパスフィルタ 18passdata=scipy.signal.lfilter(bandpass,1,set) #フィルタ処理 19numff=abs(np.fft.fft(passdata)*2/NN) #フィルタ後のフーリエ変換 20 21 22plt.plot(fq,numf) #フィルタ前の波形 23plt.plot(fq,numff) #フィルタ後の波形 24plt.xlim(50,200) 25plt.xlabel('freqency(Hz)', fontsize=14) 26plt.ylabel('signal amplitude', fontsize=14) 27plt.show()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/30 05:54