チェビシェフフィルターを適用するにはどうすればよいですか?


7

脳とコンピューターのインターフェースについての論文を読んだ。この論文では、著者らは「各信号はカットオフ周波数が0.1および10 Hzであり、高カットオフ周波数に従って間引かれている8次バンドパスチェビシェフI型フィルターでフィルター処理されている」と報告しています。私はこのフィルターをscipyで設計しようとしました:

import scipy.signal as signal
signal.cheby1(8,0.05,[0.1,10.0],btype='band',analog=0,output='ba')

結果は:

Warning: invalid value encountered in sqrt
(array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]), array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]))

私は信号処理のバックグラウンドがないので、実際何をしているのかわかりません。IIRフィルターとFIRフィルターのどちらを使用したのか、カットオフ周波数をスケーリングする必要があるのか​​、間違ったリップルを使用しているのかはわかりません。あなたが私を助けてくれることを願っています。

回答:


5

あなたが与えた例の主な問題は、フィルター設計関数cheby1がすべてNaNのを返すことですが、これは非常に優れたフィルターにはなりません。問題は、通過帯域/阻止帯域のエッジ周波数をどのように指定するかです。この特定の関数は、MATLABのcheby1関数をエミュレートするためのものです。指定する周波数は、値が1サンプルレートの半分に対応するように正規化する必要があります。

import scipy.signal as signal
fs = whatever_the_sample_rate_of_the_filter_input_is_going_to_be
signal.cheby1(8,0.05,[0.1/(fs/2),10.0/(fs/2)],btype='band',analog=0,output='ba')

私はSciPyを手元に持っていませんが、少なくとも、必要なフィルターを正しく設計できるはずです。


ありがとう、夕方にやってみます。私のサンプリングレートは240 Hzです。データにフィルターを適用する方法を知っていますか?ウィキペディア(en.wikipedia.org/wiki/…)で数式を見つけましたが、これは奇妙な振動結果(非常に大きな数字...)を与えてくれます。だから私は何か間違ったことを実装したと思います。これをC ++で実装しているため、関数scipy.signal.lfilterを呼び出すことができません。ところで リップルを変更すると何が変わりますか?
アルファ2012

2
極が単位円に非常に近いため、これは数値的に困難なフィルターです。フィルターを2次セクションに分割し、それらを順番に適用する必要があります。
Hilmar 2012

そして、どうすればフィルターを2次セクションに分解できますか?Matlabにはこの機能があると思いますが、scipyでは利用できません。
アルファ

@alfa:なしscipyのダウンロードには、それを持っていませんが、私のpythonにオクターブコードを翻訳開始しました:gist.github.com/endolith/4525003
endolith

2

2つのカットオフ周波数は、通常、ハイパスが0.1Hzでローパスが10Hzのバンドパスフィルターであることを意味します。ローパスカットオフ(2つの周波数の高い方)は、どれだけダウンサンプリングできるかによって決まります。ローパスフィルターが無限に急勾配である場合、20 Hzの新しいサンプルレート(カットオフの2倍)で問題を回避できます。勾配が制限されているため、カットオフ周波数と新しいナイキスト周波数の間にガードバンドを残す必要があります。どれだけ必要かは、フィルターの次数と許容できるエイリアシングノイズの量によって異なります。

この特定の例では、12倍程度のダウンサンプリングが行われているように見えます。これは私には非常に攻撃的で、エイリアシングノイズが多くなる可能性があります。


説明ありがとうございます。振幅と周波数が高いノイズが多く、関心のある信号の周波数が非常に低いため、12倍のダウンサンプリングは理にかなっていると思います。実際に彼らの結果を再現したかった。この種類のフィルターに関する実用的なチュートリアル(コード付き)はありますか?
アルファ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.