直感的に理解する信号処理とフィルタ【STEP0：導入編】

# はじめに

・キッチンスケールで小麦粉の重さを量る
・Bluetoothイヤホンで音楽を聴く
・GPSで今いる場所を確認する

これら全ての基礎になる技術が**信号処理**です。
そして信号処理で扱うあらゆる信号には影のようにつきまとってくるものがあります。

そう、**ノイズ**ですね。 

　・電源ラインから入り込んでくるノイズ
　・モータの振動によるノイズ
　・電子回路のクロストークノイズ
 
原因は様々ですが通常、信号とノイズは必ずセットで扱わなければなりません。

最も有効なノイズ対策はノイズ源そのものを除去することですが、例えば工場での重量計測において、計測中は周囲で動いてる装置を全部止めて振動を無くしましょう！なんて現実的ではありません。

そこで活躍するのがフィルタ技術、とりわけデジタル(ディジタル)フィルタです。

このシリーズではフィルタ設計法習得に向け、フィルタ設計と信号処理の基礎に関する直感的な理解を目標に解説していきたいと思います。


:::note warn
なるべく数式を排して取っつきやすい説明を行っていくつもりなので、やや不自然な言い回しや誤解を招きかねない表現があるかもしれません。
そういった箇所を見つけられた場合はすみませんが、ご指摘頂けると幸いです。
:::

本記事はその **STEP0：導入編** です。

他STEPへのリンクは下記です↓
[STEP:1 フィルタ特性の見方](https://qiita.com/otter1602/items/20ae3138a8ef3530df7d)
[STEP:2 インパルス応答とフィルタ](https://qiita.com/otter1602/items/6a7f1bddff49d73eedd3)
[STEP:3 周波数領域における伝達関数](https://qiita.com/otter1602/items/a9292b9d91c00dc7273b)
[STEP:4 ノイズ除去実践編](https://qiita.com/otter1602/items/9719c0850f6cffc2d006)

簡単なフィルタ設計&性能評価をやってみたい方は下記もどうぞ↓
[FIRローパスフィルタを作ってみよう！](https://qiita.com/otter1602/items/83ec804e822f0842d701)

# 1. フィルタへの要求を考える
今回は導入編として、**重量計測**を目的とする信号処理を考えていきます。

フィルタ設計にあたって、まず考えることはどんな信号を除去して、どんな信号を残すかということですね。
今は重量計測について考えているため、はかりに載っているモノの重さが時間で変化するかどうかを考えます。
当然載ってるモノが勝手に重くなったり軽くなったりはしないので、次のようになります。

　残したい！：0Hzの信号 (直流成分とかDC成分とか呼ばれる)
　消したい！：0Hzより高い周波数の信号
 
なので、重量計測で欲しいフィルタの特性はこんなイメージです↓
![ideal1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/84dbd76f-5234-43a5-9bc7-18f54b75140d.png)

これだとちょっと分かりづらいので、0Hzから0.14Hzぐらいまでを拡大すると、こんな感じ↓
![ideal1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/d9e13f9f-4589-4136-aec6-39ab5f45ca33.png)
大体0.03Hzでゲインが0.7倍、すなわち振幅が約-3dBになり、0.1Hzより上の周波数で0倍、
すなわち振幅が0になるようなフィルタになっています。
※上記は一例です。振幅0になるところがもっと0Hzに近付けば、より良い性能といえます。

まとめると、ゲインが下記のようになるフィルタが設計できれば良さそうです。
・0Hzでは1.0倍
・0.03Hzで0.7倍
・0.03Hzから0.1Hzまでは線形にゲインが低下
・0.1Hz以上では0倍

# 2. テスト用信号を作る
さて、前節で欲しいフィルタの特性が分かったので、百聞は一見に如かず、さっそくシミュレーションしてみましょう。

まずシミュレーション用の重量信号を作ります。
重量120g, サンプリング周波数100Hzで3秒間サンプリングした想定のデータを準備します。
![Weight_Sim_No_Noise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/fea83c80-a8c9-43e9-93de-dde0b5105a0d.png)
ノイズを加えていないので、当然きれいな直線ですね。

これを真値として、ここにノイズを重畳(どうでも良いですが、読みは"ちょうじょう"です)
させた信号を作ります。こんな感じ↓
![Weight_Sim_With_Noise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/993fbd26-a271-4dc5-8f80-e941e5ea2c16.png)
オレンジの線が先ほどの真値(120g)です。ノイズあり(青い線)の方は結構よく見る形をしています。真値の120gに対して、下は90gから上は150gまで、と大きく値が振れていますね。

青い線(ノイズあり)をオレンジの線(ノイズなし)にするためのフィルタを設計してみます。
# 3. フィルタを設計する
早速ですが、設計したフィルタの特性を↓に表示します。

・全体の振幅特性
![LPF1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/67bc7f31-e762-49ac-9f3f-b8054b972476.png)

・0Hzから0.14Hzぐらいまで拡大
![LPF1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/f5e09762-ae01-4778-9ab8-b85a6469b377.png)


初っ端のフィルタと比較してもこの通り、なかなかいい感じです。
![LPF2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/c4970ece-ba28-4c69-80fe-ade91cfa1d35.png)

では、このフィルタを先程のテスト用信号に適用して、元通りノイズなしの値が出力されるか試してみましょう。

# 4. フィルタにテスト用信号を通してみる
フィルタにテスト用信号を通した結果ですが、こうなります↓

![filtered_3sec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/1d0294a1-71ca-4f1e-b8c9-2ab2f5db147c.png)
緑の線(フィルタの出力)とオレンジの線(真値)が重なってほしいところですが、フィルタ出力は真値と似ても似つかない値になっていますね、、、これはなぜでしょうか？

ここでフィルタ出力をよく見ると、ずっと平坦な値とか上下する値ではなくX軸、すなわち
秒数の進みに伴って、右上がりの出力になっていることが見て取れます。

今回のテスト用信号の想定を思い出してみると、下記のような条件でした。

・重量120g
・サンプリング周波数100Hz
・3秒間サンプリングしたデータ

ということは、もっと長い時間サンプリングしたデータを準備すると、フィルタ出力は
さらに上がり続けて真値に近づきそうです。

やってみましょう。いきなり結果です↓

![filtered_30sec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/98ac34cf-9de3-4283-bbb9-3f1a55c1e20a.png)

どうでしょうか。30秒間サンプリングしたデータに同じフィルタを適用すると、12秒ぐらいでフィルタ出力は真値近くに収束しています。

ということで、3秒間のデータにフィルタを適用した結果がうまくいっていないように見えたのは、単純にフィルタ出力の立ち上がりに時間がかかっていたためでした。

これがいわゆるフィルタの **「応答遅れ」** とか **「立ち上がり時間」** と呼ばれるやつですね。

フィルタの精度と応答の間には、一般的に精度が上がるほど応答が遅くなるという、
トレードオフの関係があります。

こんな感じで、精度が上がると応答が遅くなる↓

![FIR1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103962/e7742695-c94f-4615-b875-7b823fc6af46.gif)



# まとめ
今回は導入のため、重量計測を例としてフィルタ設計を考えてみました。
重量計測をリアルタイムでやる必要が無ければ、応答遅れを気にする必要はありません。

しかし、例えばコンベアスケールとか振動搬送のようなアプリケーションであれば、外乱がある環境下で応答良く、かつ精度良く計量することが求められます。

したがって重量計測のためのデジタルフィルタ設計のポイントは、 **許容されるノイズの大きさと許容される応答時間の遅れを仕様として把握すること** です。

次回はもう少し話を一般化して、フィルタ特性の解説を行っていきます。