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

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

特徴量抽出に役立つバンドパスフィルタと逆の作用をするバンドストップフィルタも習得していきます。フィルタには実際難しい理論がありますが、PythonのSciPyなら簡単に使うことが可能です。

こんにちは。wat(@watlablog)です。
基本的なフィルタを学んでいますが、今回はバンドストップフィルタを扱います

バンドストップフィルタについて

バンドストップフィルタとは?

前回の記事「PythonのSciPyでバンドパスフィルタをかける!」では、バンドパスフィルタを使えるようになりました。

今回扱うのはバンドストップフィルタband-stop filter)といって、バンドパスの逆の作用をするフィルタを説明します。

バンドストップフィルタとは、ある周波数幅(バンド)のみの信号を阻止(ストップ)するフィルタのことです。

このバンドストップフィルタは音楽の分野で日常的に活用されています。電子楽器は当然電気を用いて駆動していますが、演奏で出したい音の他にも電源ノイズ(50Hz、60Hzの電源周波数に準ずる)が演奏に交じって発生するハム音という(ブーン音)ものがあります。

この音はサイン波に近い形状をしているので、倍音(高調波成分)があまり無く、このバンドストップフィルタで阻止して演奏の質を上げる用途で使われています。

その他、音声分析の分野では、ある音を消した時にどう聞こえるかといった用途で使われることもあり、使い道は様々あるフィルタです。

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

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

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

これまで同様、バターワースフィルタを例にコードの解説をしていきます。

PythonのSciPyバンドストップフィルタ

ソースコード

メインファイル

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

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

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

中身はバンドパスフィルタの場合とほぼ同じです。詳しくは「PythonのSciPyでバンドパスフィルタをかける!」を参照下さい。

関数ファイル

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

参考:フーリエ変換まで含めた全コード

先ほどまではフィルタ処理の部分のみを解説していましたが、ファイルを2つ作ったり面倒だと思いますので、コピペしてすぐ動かせる全コードを以下に示します。

このコードはサンプル波形を生成して、フーリエ変換とデシベル変換を行っており、フィルタ前後の波形を比較する事が可能です。是非動かして遊んでみて下さい。

実行結果

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

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

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

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

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

元波形は1000[Hz]の信号が200[Hz]でうねり成分を持ち、かつ全体的に高周波ノイズを含んでいます。フィルタ後の波形は1000[Hz]の信号のみを減衰させ、うねり成分とノイズ成分のみを評価できる状態にしたことになります。

まとめ

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

バンドストップフィルタはバンドパスフィルタと同じく通過域端と阻止域端が2つずつあるフィルタであるため、周波数の設定も同じくベクトル形式になります。

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

ローパスフィルタ、ハイパスフィルタ、バンドパスフィルタ、バンドストップフィルタを使えるようになったぞ!信号処理初心者でもこんなに簡単に扱えるとは、Pythonすごい!

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

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

SNSでもご購読できます。

コメントを残す

*