はじめに
この記事は完全に理解したTalk Advent Calendar 2020の9日目の記事です。
9日目の欄が空いたままになっていたので、遅ればせながらではありますが、ささやかな記事を1つ上げたいと思います。
今回の記事は過去に2つ上げていた遺伝的アルゴリズムとは一風変わり、信号処理のお話です。
皆さんはIoTやっていますか?私は別にやってないです。IoTと言いたかっただけです。
完全に想像ではありますが、IoTの用途の中には「なにかの数値をセンサーで計測し、その計測値を用いで何らかの判断を行い、処理を実行する」ということが行われることもあるのではないかと思います。
そういった場合、下図のように、計測系のどこかにノイズが入り込んで重畳されてしまうことがあるのではないでしょうか?
こういった場合、可能な限りノイズを除去して、オリジナルの信号波形に近いデータを得たいはずです。
信号処理って色んなやり方があって、ケースバイケースでノイズ除去を行うことになると思うのですが、今回はそういった場合に「とりあえず使ってみる」という用途に向いているフィルタを紹介したいと思います。
定義
Y[i] = alpha * Y[i-1] + (1-alpha) * X[i]
X:センサの測定値
Y:フィルタの出力値
alpha:調整パラメータ[0 <= aplha <= 1]
ただしY[0] = X[0]とする
超簡単ですね。
要するに今回の計測値と前回のフィルタ処理後の数値を重み付けして足し合わせることで平準化を行っています。
alphaは調整パラメータで1に近づけば近づくほどフィルタの効果が強くなります。
動作イメージ
例えばこんな感じに、青い波形から赤い波形を抽出することが出来ます。
ちなみにこのときalpha = 0.85です。
自分はだいたい0.75~0.95くらいの間で使うことが多いです。
alphaを変化させたときのイメージは下記のとおりです(ノイズ波形をRAND関数で生成しているので毎回波形が違う点はご勘弁を)。
今回のケースでも、alphaは0.75以上に設定するのが良さそうです。
この辺りは実際にフィルタを掛けるときに試行錯誤することになるかな、と思います。
留意したい点は、なるべくalphaは小さい方が良い、ということです。理由はデメリットの項で紹介します。
メリット
今回紹介するフィルタのメリットは以下の通りかなと思います。
- 専門的知識が要らない
- Excelなどの表計算ツールで簡単に適用できる
- 調整パラメータが1つだけで調整しやすい
デメリット
逆にデメリットは以下の2点かなと思います。
- alphaを強くすると信号波形の位相が遅れる
- alphaを強くすると信号波形のゲインが小さくなる
実は今回最初に提示した信号波形は、正弦波にランダムなノイズを足し合わせて人工的に作ったものです(黄色 = 青色 + 赤色)。
では、このオリジナルの正弦波と、フィルター適用後の波形を重ねるとどうなるでしょうか?
以下はalpha = 0.85のときの比較です。
信号のゲイン(振幅の大きさ)が若干ですが弱まっていることがわかります。また、信号の波形が若干右にずれている(位相が遅れている)ことがわかります。
さらにalpha = 0.95のときを見てみましょう。ゲインが半分以下になって、位相もかなり遅れています。
最後にalpha = 0.99のときです。波形は滑らかですが、話になりませんね。
ゲインの方はあとから補正はできなくもないですが、位相のほうが致命的です。
例えばこの測定値をPID制御のコントローラに入力してフィードバック制御を行う場合など、制御系の位相がトータルで90deg遅れると制御系が不安定になり発散するリスクがあります。
自動制御に使う場合は注意が必要です。