PythonのSciPyでハイパスフィルタをかける!

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

信号の高周波成分のみを抽出したい時はハイパスフィルタを利用します。フィルタ処理は難しい理論がありますが、PythonのSciPyであれば使うだけなら簡単にできます。

こんにちは。wat(@watlablog)です。ローパスフィルタを学んだ後はハイパスフィルタです。ここではハイパスフィルタをPythonでコーディングする方法を習得します

ハイパスフィルタについて

ハイパスフィルタとは?

前回の記事(PythonのSciPyでローパスフィルタをかける!)ではローパスフィルタを学んで高周波帯域のノイズ除去を行いました。

フィルタには様々な種類があり、ハイパスフィルタ(High-pass filter)も使用頻度の高いフィルタです。

ハイパスフィルタとは、信号の高周波成分のみを通過(パス)させ、低周波帯域の成分は阻止(カット)するフィルタのことを指します。

ハイパスフィルタの有名な事例は画像処理におけるエッジ処理です。画像も2次元の信号であるため、波形の信号処理技術はそのまま応用可能です。

画像の輪郭というのは波形でいうと急激に値が変化する部分となり、高周波成分を多く含みます。ハイパスフィルタを使うことでエッジ部分を検出しやすくしたり、シャープネスを強くした画像に変換したりといった処理がよく行われています。

ハイパスフィルタで重要な因子と用語(図解)

ハイパスフィルタは高周波帯域の信号を通し、低周波帯域の信号を阻止するので、周波数軸で考えると下図のように3つの領域(「阻止域」「遷移域」「通過域」)に分けられます。

ハイパスフィルタの用語

ほとんどローパスフィルタの時の図と同じですね。今回もバターワースフィルタにおける実装例を以下に示していきます。

PythonのSciPyハイパスフィルタ

Advertisements

ソースコード

メインファイル

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

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

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

中身ですが、ローパスの時とパラメータは全く同じです。但し、通過域と阻止域の周波数の大小関係が逆になっている点だけに注意して下さい。減衰量の考え方は変更ありません。基本は上に添付した図のイメージを頭に入れておけば問題無いと思います。

関数ファイル

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

正規化の考え方や根拠は「PythonのSciPyでローパスフィルタをかける!」の記事をご覧下さい。

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

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

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

実行結果

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

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

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

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

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

元波形は500[Hz]のサイン波に50[Hz]のサイン波が重畳されているため、500[Hz]のサイン波全体がうねり成分を持っています。今回はハイパスフィルタを使うことでこのうねり成分を除去してみました。これも一種のノイズ除去ですね。

まとめ

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

ハイパスフィルタもローパスフィルタと同じように通過域、遷移域、阻止域を持ちますが、その位置関係に違いがありました。

SciPyを使えば簡単にこれらのフィルタ設計ができることを学びました。

ローパスを学んだ後だとハイパスは一瞬で理解できたぞ!フィルタを自由に使いこなすのは信号処理技術者としての基礎だと思うので、しっかり復習しよう!

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

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

SNSでもご購読できます。

コメント

コメントを残す

*