bandpass filterの帯域指定値
Mostrar comentarios más antiguos
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 comentarios
Akira Agata
el 18 de Feb. de 2020
Editada: Akira Agata
el 18 de Feb. de 2020
bandpass関数に入力されている配列 data のサイズ(=サンプル数)は、いくつでしょうか?
おそらく、通過帯域の低周波側 (0.1 Hz) に対してbandpass関数内部でIIRフィルタを設計するにあたり、入力信号のサンプル数が足りていないことが原因ではないかと推測します。
Naoya
el 18 de Feb. de 2020
バンドパスフィルタはローパスフィルタとハイパスフィルタの組み合わせになると思いますが、低周波側の通過帯域端が 0.1 Hz ということで、低周波側の阻止帯域幅がとても狭く特性的に厳しいフィルタ仕様となっているかもしれません。
また、bandpass関数のフィルタリングは filtfilt関数によるゼロ位相フィルタリングを行うことになりますが、このようなフィルタ特性が厳しい場合、特に信号の両端部分において大きくゆがむような時刻歴出力が得られる傾向にあります。
例えば、
>> [~,d] = bandpass(data, [0.1,30],256);
で フィルタオブジェクト d を得ることができます。
bandpass 関数内部のfiltfilt処理ではなく、 得られたフィルタオブジェクト d を使って、filter処理でより理想に近い時刻歴出力が得られるかもしれません。
>> A = filter(d, data);
この問題そのものの解ではありませんが、こういった意図しない動作をした場合の解決方法です。
該当するMATLAB関数をエディターで開く。(ソースコードが見れるのもMATLABの良いところ)
>> edit bandpass
確認したい箇所にブレークポイントを設定して、その関数を実行する。
例えば
162行目:フィルタ設計で与えられる各パラメータ
253行目:設計されたフィルタの仕様や特性を確認
125行目:設計されたフィルタでフィルタリングを行った結果を確認
といったところを確認すると、内部で処理が意図した通りに行われているか確認できます。
入力信号、出力信号が意図した通りに定義されているか時系列プロットして確認してみてはいかがでしょうか。
MathWorksさんは推奨されない使い方かもしれませんが・・・
kazuhiko takabatake
el 19 de Feb. de 2020
Respuestas (0)
Categorías
Más información sobre デジタル フィルターとアナログ フィルター en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!