今回から新たに「フィルタリング」。 まずはその簡単な例として「移動平均」の話を、テキスト第5章に沿って進める。
フィルタリング
「フィルター (filter)」とは、与えられた入力のうち、特定の成分を取り除く (あるいは弱める) 働きをするもの。 例えば以下。
- 瀘過 (液体中の不純物を取り除く)
- カメラのレンズにつけるフィルター (特定の光を弱める)
- インターネットのフィルタリング (特定サイトへのアクセスの制限)
- 測定データに含まれている、不必要なものを取り除く (弱める)
誤差の除去、雑音・ノイズの除去。
簡単なフィルター: 移動平均
移動平均は「平滑化」という効果をもつフィルターの一種である。
\(N\) 個のデータ \(\{x_1,x_2,\cdots,x_N\}\) の移動平均を \(\{y_i\}\) と書くと、\(i\) 番目の移動平均 \(y_i\) とは、\(x_i\) の周囲の数点の値だけを使って平均値をとったものである。 例えば、 \begin{equation} y_i=\frac{x_{i-1}+x_i+x_{i+1}}{3} \tag{5.1} \end{equation} 最初のいくつかを具体的に書くと \begin{equation} \begin{split} y_2&=\dfrac{x_1+x_2+x_3}{3} \\ y_3&=\dfrac{x_2+x_3+x_4}{3} \\ y_4&=\dfrac{x_3+x_4+x_5}{3} \end{split} \tag{5.2} \end{equation} などとなる。 右辺に現れているデータの番号が「移動」しているのに注意。 このように、平均をとるために使う区間 (専門用語で「窓」) が移動していくことが「移動平均」という呼び名の由来である。
上の例では「自分とその前後1つずつを使った平均」をとっているが、もちろん他のとり方もOK。 例えば「自分とその前後 \(m\) 個ずつを使った平均」(式(5.3))だったり、「自分とその前の \(m\) 個を使った平均」(式(5.4))などもよく使われる例である。
移動平均の効果 (ローパスフィルター)
周期的に変化する信号を入力として与えた時に、移動平均はどんな値を出力するか? を調べてみる。 例えば、振幅 \(A\)、周期 \(K\) の正弦波 \begin{equation} {x_i}=A\cos\left(\dfrac{2\pi}{K}i\right) \tag{5.6} \end{equation} を入力として与えてみる (ただし \(K\ge2\) を仮定)。
式(5.1)の「自分とその前後1個ずつ」で移動平均をとってみると \begin{align} y_i& =\dfrac{x_{i-1}+x_i+x_{i+1}}{3} =\dfrac{1}{3}A\cos\left[\dfrac{2\pi}{K}\left(i-1\right)\right] +\dfrac{1}{3}A\cos\left[\dfrac{2\pi}{K}{i}\right] +\dfrac{1}{3}A\cos\left[\dfrac{2\pi}{K}\left(i+1\right)\right] \notag\\& =\dfrac{1}{3}\left[1+2\cos\left(\dfrac{2\pi}{K}\right)\right]{A}\cos\left(\dfrac{2\pi}{K}{i}\right) =\dfrac{1}{3}\left[1+2\cos\left(\dfrac{2\pi}{K}\right)\right]{x_i} \tag{5.7} \end{align} 即ち、入力されたもとの信号 (式(5.6)) と比べて、振幅が \(\dfrac{1}{3}\left[1+2\cos\left(\dfrac{2\pi}{K}\right)\right]\) 倍されたものが出力されている。 しかも、振幅の拡大(縮小)のされ方が、入力された信号の周期 \(K\)によって異なっていることに注意。
周期 \(K\) | 4 | 6 | 8 | 12 |
振幅の 拡大率 |
\(\dfrac{1}{3}\) | \(\dfrac{2}{3}\) | \(\dfrac{1+\sqrt{2}}{3}\) | \(\dfrac{1+\sqrt{3}}{3}\) |
\(=\dfrac{1}{3}\left(1+2\cos\dfrac{\pi}{2}\right)\) | \(=\dfrac{1}{3}\left(1+2\cos\dfrac{\pi}{3}\right)\) | \(=\dfrac{1}{3}\left(1+2\cos\dfrac{\pi}{4}\right)\) | \(=\dfrac{1}{3}\left(1+2\cos\dfrac{\pi}{6}\right)\) |
- 短い周期で変動する成分を弱め、長い周期で変動する成分を優先的にとり出す
- 速く変動する (高周波) 成分を弱め、ゆっくり変動する (低周波)成分を優先的にとり出す
移動平均がもつローパスフィルターとしての性質は、平均をとるのに使うデータの範囲を変えると変わる。 具体的には、平均をとるのに使うデータの個数を増やすと、低周波側の成分がより強調されるようになる。 また、大雑把に言うと、自分と前後 \(m\) 個ずつでとった移動平均では、
- \(2m+1\) より短い周期で変動する成分を弱め、\(2m+1\) より長い周期で変動する成分を優先的にとり出す
- \(\dfrac{1}{2m+1}\) より速い振動数で変動する (高周波) 成分を弱め、\(\dfrac{1}{2m+1}\) より遅い振動数で変動する (低周波) 成分を優先的にとり出す
なお当然のことであるが、実際の場面で移動平均をとるようなデータには、異なる周期で変動する成分が多数含まれているはずである。 移動平均をとることによって、それぞれの成分の振幅が、それぞれの変動の周期に応じて拡大 (縮小) される。 最終的にはそれらを合計したものが出力されてくる。
ハイパスフィルター
ローパスフィルターの反対に、
- 長い周期で変動する成分を弱め、短い周期で変動する成分を優先的にとり出す
- ゆっくり変動する (低周波) 成分を弱め、速く変動する (高周波) 成分を優先的にとり出す
簡単なハイパスフィルターの例は、入力データからローパスフィルターの出力値を引くと得られる。 例えば、入力 \(x_i\) から「自分自身とその前後1個ずつ」でとった移動平均 \(y_i\) を引いた値 \(z_i\) を調べると、 \begin{equation} z_i=x_i-y_i =x_i-\frac{1}{3}\left[1+2\cos\left(\dfrac{2\pi}{K}\right)\right]x_i =\frac{2}{3}\left[1-\cos\left(\dfrac{2\pi}{K}\right)\right]x_i \tag{5.14} \end{equation} 今度は 周期 \(K\) が大きいほど、振幅は縮小されやすい ことになっている。
ところで、ハイパスフィルターの式を書き直すと、 \begin{equation} x_i-y_i =\dfrac{-x_{i-1}+2x_{i}-x_{i+1}}{3} =\dfrac{(x_{i}-x_{i-1})+(x_{i}-x_{i+1})}{3} \tag{5.15} \end{equation} すなわちハイパスフィルターとは、\(i\) 番目のデータと両隣のデータとの差 を計算していることになる。
上の話をさらに一般化すると、
- 移動しながら「微分」をとれば、ハイパスフィルターの効果がある
- 細かな凹凸を強調する (画像処理の「エッジ検出」とか)
- 移動しながら「積分」をとれば、ローパスフィルターの効果がある
- 細かな凹凸を削ってなめらかにする (平滑化)
移動平均と「窓」
この部分は、これまでの記述よりもいっそう「抽象的」な記述を (わざと) している。 この理由は、「フィルタリング」についてさらに知識を深めようとする人 (がいるといいなぁ) が、高度な教科書を読み進めようとした際に「テイストの違いに面喰らってしまう」ことを少しでも避けようと意図してのことである。
例えば \(y_i=\dfrac{x_{i-1}+x_i+x_{i+1}}{3}\) という移動平均において、 \begin{equation} w_j=\left\{ \begin{array}{ll} 0 & \text{(下記以外のとき)} \\ 1/3 & \text{($j=-1,0,1$ のとき)} \\ \end{array} \right. \tag{5.16} \end{equation} という関数 \(w_j\) を考えると、上の移動平均の定義式は \begin{equation} y_i =\sum_{j=-\infty}^{\infty}{x_{i-j}}{w_j} =\sum_{k=-\infty}^{\infty}{x_k}{w_{i-k}} \tag{5.17} \end{equation} と書き直せる。 この形の式は、第03回でやった「重みつき平均」とよく似ていることに注意。 しかも \(\displaystyle\sum_{j=-\infty}^{\infty}w_j=1\) になっていることから、\(w_j\) が「確率」のような意味になっている。
ここで出てきた「ある範囲以外では0」となるような関数 \(w_j\) は「窓関数 (window function)」と呼ばれる。 「窓関数」\(w_j\) の幅や形をどうとるか? によって、異なった性質をもつフィルターを作ることができる。 例えば \begin{equation} w_j=\left\{ \begin{array}{ll} 0 & \text{(下記以外のとき)} \\ 1/5 & \text{($j=-2,-1,0,1,2$ のとき)} \\ \end{array} \right. \tag{5.19} \end{equation} ととることにすれば、「自分とその前後2つずつをとった移動平均」が求まる。
上の式をより一般的な形に書き直すと、 \begin{equation} y(t) =\int_{-\infty}^{\infty}{x(t-s)}{w(s)}ds =\int_{-\infty}^{\infty}{x(\tau)}{w(t-\tau)}d\tau \tag{5.22} \end{equation} などと書ける。 こういった積分は「畳み込み」「重畳積分」「コンボリューション (convolution)」などと呼ばれ、いろんな場面でよく出てくる (系の応答をみたい時など)。