PythonのSciPyでバンドパスフィルタをかける!

  • このエントリーをはてなブックマークに追加

ローパス、ハイパスフィルタの応用となるバンドパスフィルタは信号のノイズ除去以外にも、特徴量の抽出に役立ちます。フィルタには実際難しい理論がありますが、PythonのSciPyなら簡単に使うことが可能です。

こんにちは。wat(@watlablog)です。
これまで学んだフィルタ処理の応用編として、このページではバンドパスフィルタを紹介します

バンドパスフィルタについて

バンドパスフィルタとは?

WATLABブログでは前回までに、高周波帯域ノイズを除去したい時に使うローパスフィルタ、低周波帯域の信号をキャンセルして高周波帯域成分を抽出するハイパスフィルタをPythonでコーディングして来ました。

今回はその両方の特性を持つバンドパスフィルタband-pass filter)を紹介します。

バンドパスフィルタとは、ある周波数幅(バンド)のみの信号を通過(パス)させるフィルタのことで、ローパスフィルタとハイパスフィルタの組み合わせによって構成されます。

バンドパスフィルタは光学の分野でよく使われており、特定波長の光のみを抽出する目的で利用されます。

しかし、「特定の周波数帯域だけを通す」という機能は、工学的にも幅広い用途があるためあらゆる場面で活用されています。

バンドパスフィルタで重要な因子と用語(図解)

バンドパスフィルタはある周波数幅の帯域だけを通過させるため、以下の図のように1つの通過域がありますが、阻止域遷移域が2つあるのが特徴です。

そのため、通過域端と阻止域端が2つずつあることになり、これまでのローパスフィルタやハイパスフィルタと比べるとプログラムする上で設定項目が増えることになります。

今回もバターワースフィルタを例にコーディングしていきます。

PythonのSciPyバンドパスフィルタ

ソースコード

メインファイル

ソースコードを以下に示します。フィルタ処理を実際に行う部分はdef文を使って関数化しました。関数の使い方については「Pythonの関数def文の使い方!引数や別ファイル式も解説」の記事に詳細を示しています。

まずはメイン(main_filter.py)のコードです。

サンプルとしてガウシアンノイズを生成していますが、こちらについては「Pythonでガウス分布を持つノイズの作り方と調整方法」の記事を参照下さい。

中身ですが、ローパスやハイパスの時とパラメータの種類は同じです。しかし通過域端周波数fpと阻止域端周波数fsは上図の理由で2つあるので、以下のコードのようにベクトル形式で入力する必要があります。そしてこのベクトルはNumPy形式で記述する必要があるため、np.arrayを使っています。

関数ファイル

関数ファイル(filter_function.py)もローパスやハイパスとほぼ同じです。signal.butterでbandを指定する所が変化点です。

実行結果

バンドパスフィルタをガウシアンノイズに対してかけた結果です。
下図上段が時間波形、下段が上段の波形をFFTした後の周波数波形です。それぞれフィルタ前(original)とフィルタ後(filtered)を比較しています。

ここではFFTやデシベル変換も使っていますが、それぞれの詳細は以下の記事にまとめていますので、是非ご覧ください。

PythonでFFT!SciPyのFFTまとめ
Pythonで音圧のデシベル(dB)変換式と逆変換式

これまでと同じように、ノイズ波形だけではつまらないので、サイン波を二つ合成させた波形を作って効果を確認していきます。

上のメインコード(main_filter.py)の波形生成部分とフィルタ周波数を以下のように変更してみます。

元波形は1000[Hz]の信号が200[Hz]でうねり成分を持ち、かつ全体的に高周波ノイズが含まれていましたが、バンドパスフィルタをかけたことで1000[Hz]の信号を比較的綺麗に抽出することができました。

まとめ

フィルタ処理の一種であるバンドパスフィルタをPythonで使えるようになりました。

バンドパスフィルタはローパスフィルタやハイパスフィルタと比べ阻止域が2つあるため、周波数の設定はベクトル形式で用意する必要がありました。

SciPyを使えばバンドパスフィルタを容易に設計できることを学びました。

バンドパスは特定の信号を抽出する用途で使うため、何か特徴量を抽出する分野では万能に使えそうだね!フィルタ処理の基礎もあと少し!

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*