このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。 M5Stack

UIFlow2:HPF(ハイパスフィルタ)の作り方

センサデータに「ゆっくりとした変動」や「ドリフト」が含まれていて、本当に注目したい瞬間的な変化が埋もれてしまう。

そんな経験はありませんか?

そんなときに活躍するのがHPF(ハイパスフィルタ)です。

HPF(ハイパスフィルタ)を使えば、信号の中から急激な変化や高周波成分だけを抽出することができるので、異常検知や動きの検出など、IoT分野でも非常に有効です。

この記事では、HPFの基本的な仕組みと考え方を始め、ローパスフィルタとの関係や実装方法などについて解説していきます。

HPF(ハイパスフィルタ)のフロー概要

HPF(ハイパスフィルタ)のテスト用フローの完成形を示します。

  • LPFのイニシャライズ
  • HPFのイニシャライズ
  • フィルターへの入力信号の処理
  • ローパスフィルタの計算
  • ハイパスフィルタの計算
  • デバッグ用シリアル出力

HPF(ハイパスフィルタ)の実行結果

入力信号(赤色)に対して、ハイパスフィルタ(緑色)の信号を抽出できます。

入力信号の変化を捉えていることがわかります。

HPF(ハイパスフィルタ)の計算式

ハイパスフィルタは、ローパスフィルタの出力を利用して計算できます。

入力信号:value

ローパスフィルタの出力:LPF(value)

とすると

HPF(value) = value - LPF(value)

と表すことができます。

LPF(ローパスフィルタ)についてはこちらの記事を参考にしてください。

関連記事
UIFlow2:LPF(ローパスフィルタ)の作り方

ハイパスフィルタとは?

LPF(ローパスフィルタ)は信号の低周波成分(なめらかな変化)を通します。

入力信号から、LPFの結果を引くと、残るのは高周波成分(急激な変化やノイズ)になります。

つまり、

高周波成分 = 元の信号 - 低周波成分

実装例

lpf_value = alpha × value + ( 1 - alpha ) × lpf_value_prev

  • value : 入力信号
  • lpf_value : ローパスフィルタ出力
  • lpf_value_prev : 前回のローパスフィルタ出力
  • alpha : ローパスフィルタ係数
    • alpha = T / ( T + Ti ) T : サンプリング周期 Ti : 時定数

hpf_value = value - lpf_value

  • hpf_value : ハイパスフィルタ出力

HPF(ハイパスフィルタ)のフロー詳細

HPF(ハイパスフィルタ)の詳細について説明します。

関数 InitLpf と 関数 InitHpf を実行して計算のイニシャライズを行います。

LPF(ローパスフィルタ)の計算に使用する変数の初期値を設定します。

  • 変数 T[sec]:サンプリング周期
  • 変数 Ti[sec]:時定数
  • 変数 alpha: T / ( T + Ti )
  • 変数 value:LPFに入力する値
  • 変数 lpf_value_prev:前回のLPF出力値

hpf_value の初期値を設定

Loopブロックでは、ボタンのオンオフでフィルターの入力値を変化させます。

  • ボタンを押している時は、1
  • ボタンを離している時は、0

となるように値を設定します。

この処理を100msec周期で繰り返します。

Setupブロックで設定しているように、このタイマーコールバック関数は100secごとに呼び出されます。

ローパスフィルタの計算(関数)、ハイパスフィルタの計算(関数)および、デバッグ用のシリアル出力からなります。

関数: LPF

ローパスフィルタの計算式は少し複雑なので、ここではPythonコード実行ブロックに数式を記述しています。

ローパスフィルタ計算の後に、計算結果 lpf_value を lpf_value_prevに保存します。

関数:Hpf

ハイパスフィルタの計算式を記述します。

実行結果

上図は、M5Stackのシリアル出力を使って、フィルタの計算結果をプロットしたものです。

入力信号(赤色)に対して、HPF(ハイパスフィルタ)の出力(緑色)の特徴は次の通り。

  • 入力信号の変化を抽出している
  • 変化がない時は、HPFの出力はゼロ

HPF(ハイパスフィルタ)が正しく動作していることを確認できました。

別の記事では、実際のアプリケーションでHPFを使った事例について紹介していきます。

-M5Stack