bandpass filterの帯域指定値

4 views (last 30 days)
kazuhiko takabatake
kazuhiko takabatake on 18 Feb 2020
R2019aでbandpass関数を使用してフィルターをかけましたが、フィルターのかかっていないデータが返ってきました。
256HZでサンプリングされたdataに対して0.1~30Hzのバンドパスをかけたいため、
A=bandpass(data,[0.1 30],256);
とコードしましたが、フィルタリングされていないデータが返ってきました。
B=bandpass(data,[1 30],256);
と1~30Hzでフィルタリングしたデータは問題ありません。
下図は同じデータをフィルタリングしたもののパワースペクトルでAが赤線、Bが青線となっています。
サポートページにも通過周波数を指定するfpassのベクトルに関して整数値とは指定されていなかったのですが、
整数値でないといけないのか、コードのエラーなのか教えていただければ幸いです。
  4 Comments
Shoumei
Shoumei on 19 Feb 2020
Edited: Shoumei on 19 Feb 2020
この問題そのものの解ではありませんが、こういった意図しない動作をした場合の解決方法です。
該当するMATLAB関数をエディターで開く。(ソースコードが見れるのもMATLABの良いところ)
>> edit bandpass
確認したい箇所にブレークポイントを設定して、その関数を実行する。
例えば
162行目:フィルタ設計で与えられる各パラメータ
253行目:設計されたフィルタの仕様や特性を確認
125行目:設計されたフィルタでフィルタリングを行った結果を確認
といったところを確認すると、内部で処理が意図した通りに行われているか確認できます。
入力信号、出力信号が意図した通りに定義されているか時系列プロットして確認してみてはいかがでしょうか。
MathWorksさんは推奨されない使い方かもしれませんが・・・
kazuhiko takabatake
kazuhiko takabatake on 19 Feb 2020
>>Akira Agata
dataは脳波を256Hzでサンプリングした、サンプルサイズ46080になるデータです。
>>Naoya
アドバイスいただいたフィルタ関数を得て、filter処理を行う事で改善はしましたが、まだ30Hz以上の周波数帯の成分が含まれる結果でした。(下図赤線)
青線はbandpass関数で1~30Hzに設定したもので、黄色はScott Makeig(SCCN/INC/UCSD scott@sccn.ucsd.edu)によって配布されているeegfiltというコードを比較のため使用したものになります。
ご指摘のように0.1Hzのローカット設定ではフィルタの歪みが含まれてしまうため、bandpass関数をそのまま使用することは困難なようでした。ほかのコードを使用するかフィルターを設計してかける方法も考慮してみます。
>>shoumei
アドバイスありがとうございます。あまりやったことがないのですが、editでコードの内部も一度確認してみます。

Sign in to comment.

Answers (0)

Categories

Find more on デジタル フィルターとアナログ フィルター in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!