質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1973閲覧

scipyを使ったFIRフィルタの仕方について

sham0909

総合スコア27

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/22 06:14

お世話になります。

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
ご要望が多いため、完全な答えをご提供できませんが、下記が解決のヒントになれば幸いです。

結論から申し上げますと、フィルタ設計は適切にできていると思われます。

設計されたFIRフィルタを scipy.signal.freqz で分析すると下図のようになります。
正規化後のカットオフ周波数は fe1, fe2 = 0.05, 0.065 ですので、たしかにバンドパスフィルタとして機能しているように見えます。

イメージ説明

下記のコードでこの内容が再現できます。

python

1plt.figure() 2plt.plot(w/np.pi, 20*np.log10(abs(h))) 3plt.vlines(x=[fe1, fe2], ymin=-20, ymax=0, linestyle="dashed", colors='grey') 4plt.xlim(0, fe2*1.25) 5plt.ylim(-20,0) 6plt.show()

フィルタは正しく設計できているので、プロットする元のデータやFFTの内容を見直してみてはいかがでしょうか。

投稿2018/07/25 12:29

RyoKaji

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sham0909

2018/07/30 05:54

回答ありがとうございました。 データを見直して再検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問