【仕様書】最小構成のモデルベース開発事例 その12【フィルタ】

事例

バックナンバーはこちら

スポンサーリンク

はじめに

前回で、おおよその仕様決めは終わったと思われた。
しかし、太郎くんのド忘れ発覚によりフィルタ仕様も考える必要が出てきた。

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

ノイズとフィルタの種類

太郎くん
太郎くん

んで、

A/Dの入力にフィルタを掛けたいんだけど、
ざっくりどうすればいいんだろうね?

フクさん
フクさん

目的によるかな?

太郎くん
太郎くん

目的?

フクさん
フクさん

そうそう。
今回の装置はアクセルとECUの間に挟み込むんだけど、

想定されるノイズってどういうのがあるのかなって話。

太郎くん
太郎くん

うーん、ノイズの種類かー。
ちょっとわからないなー

フクさん
フクさん

まぁノイズを並べると以下かな。

  • サージ
  • リプル
  • スパイク
  • クロストーク
  • フリッカノイズ
  • ショットノイズ
  • ホワイトノイズ
太郎くん
太郎くん

ここら辺はハード担当が何とかしてそうだけど・・・。

フクさん
フクさん

ソフトウェアとしては、

スパイク

ホワイトノイズ

を除去くらいでいいかな?

太郎くん
太郎くん

単純に移動平均とかじゃだめ?

フクさん
フクさん

ホワイトノイズはそれで良いが、

スパイクはそれだと抑制は出来ても除去しきれ合いで影響が残るかな。

太郎くん
太郎くん

どうしたら良いの?

フクさん
フクさん

一般的には
ホワイトノイズ → 移動平均で除去
スパイク → メディアンフィルタで除去

太郎くん
太郎くん

ということは2種類のフィルタを掛ければ良いってことかな?

フクさん
フクさん

それでも良いけど、移動平均とメディアンフィルタの両方を掛けると真値が出るまでに結構な時間(周期)を要するね。

太郎くん
太郎くん

うーん、なんかホワイトノイズとスパイクの双方を除去できる調度良いフィルタってないの?

フクさん
フクさん

あるよ。

太郎くん
太郎くん

あるんだったらそれを先に!

フクさん
フクさん

シグマフィルタってのがある。

太郎くん
太郎くん

どういうの?

フクさん
フクさん

平均値から標準偏差\(σ\)に入ってるデータだけを平均して真値とする。

太郎くん
太郎くん

どういう効能があるの?

フクさん
フクさん

移動平均とメディアンフィルタの両方の特性を持ってる感じかな。

太郎くん
太郎くん

じゃー今回必要なフィルタの要件とマッチしているってことだね!
説明よろしく!

シグマフィルタ

フクさん
フクさん

ざっと手順を説明するよ。
凡その流れは以下。
①平均値\(μ\)算出
②各要素の平均値\(μ\)との偏差\((x_n-μ)^2\)を算出
③分散\(σ^2\)算出
④標準偏差\(σ\)算出
⑤平均値\(μ\)±標準偏差\(σ\)の範囲内の要素のみ平均値を算出
(これにより外れ値の除去が可能)
ただし、平方根\(sqrt()\)の演算が処理速度への影響が読めないため、
④と⑤の手順を無くし、
かわりに、偏差 \((x_n-μ)^2\)から分散\(σ^2\)を引いた結果として0以上の要素を
平均値\(μ\)±標準偏差\(σ\)の範囲内とする。

絵で描くとこんなイメージ。

太郎くん
太郎くん

んで、実際の計算はどうするの?

フクさん
フクさん

こんなん。
まず、取得したサンプルの平均値\(μ\)を算出。
$$μ=\frac{1}{n}\sum^n_{i=i}x_i$$
平均差二乗数列を算出。
$${a_n}:=({x_n}-μ)^2$$
分散\(σ^2\)を算出。
$$σ^2=\frac{1}{n}\sum^n_{i=1}a_i$$
標準偏差\(σ\)の範囲内の要素を特定する。
$${b_n}:={a_n}-σ^2$$
$${c_n}:=({b_n}≦0)$$
必要な要素だけの平均を求め、それを真値とする。
$$y=\frac{\vec{x_n}・\vec{c_n}}{\displaystyle\sum^n_{i=1}c_i}=\frac{\vec{x_n}\vec{c_n}^T}{\displaystyle\sum^n_{i=1}c_i}$$

太郎くん
太郎くん

えーっと、”\({a_n}:=\)”って何?

フクさん
フクさん

数列表現とその代入表現。

太郎くん
太郎くん

“\(\vec{c_n}^T\)”って何?

フクさん
フクさん

転置。

太郎くん
太郎くん

ググります!

フクさん
フクさん

Simulinkで描くとこんな感じ。

フクさん
フクさん

念のため簡単に動作確認してみるか。
こういう入力を入れてみる。

フクさん
フクさん

実際には、これにホワイトノイズ相当の信号を合成するけどね。

太郎くん
太郎くん

なるほど。
この飛び出しているのが

疑似的なスパイクノイズだね。

フクさん
フクさん

で、実際の入力と出力。
ついでに移動平均だけだとどうなるかも出してみたよ。

太郎くん
太郎くん

あ、なるほど。
移動平均だと、スパイクノイズが発生した際にしばらく影響が残るんだね。
シグマフィルタはスパイクノイズの影響を受けないし、
立ち上がり、立下りも早いね。

フクさん
フクさん

そうそう。
今回はこのフィルタが相性が良いと思う。

太郎くん
太郎くん

うん。
これも仕様書に含めておこう。

フクさん
フクさん

これで仕様書としてはOKかな?

太郎くん
太郎くん

そーだね。
また困ったら相談に乗ってよ。

フクさん
フクさん

まぁ相談だけならね。

太郎くん
太郎くん

含みのある言い方だなぁ。

まとめ

フクさん
フクさん

まとめだよ。

  • ノイズは様々な種類があり、設置場所や扱う信号によって異なる。
  • 複数のノイズ対策をソフトウェアで実施するとリアルタイム性が犠牲になることがある。
    • よって、適切なフィルタアルゴリズムが無いか調べる必要が出てくる。

バックナンバーはこちら

コメント

タイトルとURLをコピーしました