ケィオスの時系列解析メモランダム

時系列解析、生体情報解析などをやわらかく語ります

【デジタルフィルタの基礎4】ハイパスFIRの設計(その1)—— ローパス使ってハイパス作る

離散時系列に FIR (有限インパルス応答) のハイパスフィルタをかけたいとき、直感的で簡単な作り方があります。それは、
 「元の信号から、ローパスフィルタを通した出力を引くこと」、
ただそれだけです。
 単純で当たり前の話ですが、この方法は数学的にも正しく、実際の信号処理でも広く使われています。たとえば、Detrending Moving Average Analysis (DMA)のようなトレンド除去演算を含む長時間相関解析でも、この方法で時系列に含まれるトレンド成分 (ローパス成分)が除去されています。
 今回は、DMAの理解を意識しながら、「ハイパスFIRの設計(その1)」として、「ローパスを引くだけ」のハイパスフィルタについて解説します。

ローパス FIR フィルタを使ったハイパス FIR フィルタの作成

1. なぜ「ローパスを引くとハイパス」になるのか?

 時系列 \displaystyle{
x[n]
} をローパスフィルタ \displaystyle{
h _ {\mathrm{L}}[n]
} に通した信号を

\displaystyle{
y_{\mathrm{L}}[n] = (h_{\mathrm{L}} * x)[n]
}

とします。ここで、\displaystyle{
(h _ {\mathrm{L}} * x)[n]
} は、離散時系列どうしの畳み込み(convolution) を表す記号です。定義は次のとおりです。

\displaystyle{
(h_{\mathrm{L}} * x)[n] = \sum_{k=-\infty}^{\infty} h_{\mathrm{L}}[k]\, x[n-k]. 
}

ここでは、FIRフィルタのみを考えていますので、実際に畳み込みを計算する k区間は有限で、その区間の外では、h_{\mathrm{L}}[k]=0 です。
 この出力 \displaystyle{
y _ {\mathrm{L}}[n]
} を元の入力信号 \displaystyle{
x[n]
} から引いて、

\displaystyle{
y_{\mathrm{H}}[n] = x[n] - y_{\mathrm{L}}[n]
}

を計算すれば、ハイパス成分を抽出することができます。
 周波数領域のこの手続きを考えれば、

\displaystyle{
\begin{align}
Y_{\mathrm{H}}(f)
&= X(f) - H_{\mathrm{L}}(f) X(f) \\
&= \bigl( 1 - H_{\mathrm{L}}(f) \bigr) X(f)
\end{align}
}

となります。ここで、
X(f) は入力時系列 x[n] の離散時間フーリエ変換

\displaystyle{
X(f) = \sum_{n=-\infty}^{\infty} x[n]\, e^{-j 2\pi f n}
}

H_{\mathrm{L}}(f) はローパス FIR フィルタの周波数応答

\displaystyle{
H_{\mathrm{L}}(f) = \sum_{n=-\infty}^{\infty} h_{\mathrm{L}}[n]\, e^{-j 2\pi f n}
}

Y _ {\mathrm{H}}(f) はハイパス出力 y _ {\mathrm{H}}[n] の離散時間フーリエ変換

\displaystyle{
Y_{\mathrm{H}}(f) = \sum_{n=-\infty}^{\infty} y_{\mathrm{H}}[n]\, e^{-j 2\pi f n}
}

です。
 すなわち、ハイパスの周波数応答は

\displaystyle{
H_{\mathrm{H}}(f) = 1 - H_{\mathrm{L}}(f)
}

となり、ローパスフィルタの特性から直接的に決まります。
 最初に用いるローパスフィルタのカットオフ周波数を \displaystyle{
f _ c
} とすれば、理想的なローパスフィルタの周波数応答は、

\displaystyle{ H_{\mathrm{L}}(f) = \begin{cases} 1, & |f| < f_c\\ 0, & |f| > f_c \end{cases} }

となります (ここでは議論しやすいように理想化したモデルを用いています)。
 したがって、ローパスフィルタの低周波領域 \displaystyle{
|f| \lt f _ c
} では

\displaystyle{ H_{\mathrm{L}}(f) \approx 1 \quad (|f| < f_c) }

となり、対応するハイパスフィルタの周波数応答 H _ {\mathrm{H}}(f) = 1 - H _ {\mathrm{L}}(f) は、

\displaystyle{ H_{\mathrm{H}}(f) \approx 0 \quad (|f| < f_c) }

となります。
 結局のところ、理想ローパスフィルタの周波数応答

\displaystyle{ H_{\mathrm{L}}(f) = \begin{cases} 1, & |f| < f_c\\ 0, & |f| > f_c \end{cases} }

の 1 と 0 を単純に入れ替えれば、

\displaystyle{ H_{\mathrm{H}}(f) = \begin{cases} 0, & |f| < f_c\\ 1, & |f| > f_c \end{cases} }

となり、理想的なハイパスフィルタの特性が得られる、ということを述べているだけです (上の図参照)。

2. インパルス応答の導出

 これまでの説明では、「ローパスフィルタに通した信号を元の信号から引く」という形でハイパス成分を取り出しました。しかし、実際の信号処理では、この 2 段階の計算をわざわざ行わなくても、最初から “ハイパス専用の FIR フィルタ” を 1 回の畳み込みで実装する方法があります。そのためには、ハイパスフィルタの周波数応答に対応する インパルス応答(FIR の係数列)を直接求めればよいわけです。以下では、その手順を説明します。
 手順は単純で、周波数領域での関係

\displaystyle{ H_{\mathrm{H}}(f) = 1 - H_{\mathrm{L}}(f) }

に対応するインパルス応答を時間領域に戻すだけです。
 まず、周波数応答に現れる定数項 1 は、離散時間領域では 単位インパルス(unit impulse) \delta[n] に対応します。離散時間の単位インパルス \delta[n] は、次のように定義される時系列です。

\displaystyle{
\delta[n] =
\begin{cases}
1, & n = 0 \\
0, & n \neq 0.
\end{cases}
}

つまり、時刻 n=0 だけが 1 で、それ以外はすべて 0 です。
 ハイパスフィルタの周波数応答は

\displaystyle{
H_{\mathrm{H}}(f) = 1 - H_{\mathrm{L}}(f)
}

でした。これを時間領域に戻すことを考えれば、

  • 周波数領域の「1」は、時間領域では \delta[n]
  • H _ {\mathrm{L}}(f) は、時間領域では h _ {\mathrm{L}}[n]

となるので、離散時間フーリエ変換の線形性を使うと、時間領域のインパルス応答は次のように求まります。

\displaystyle{
h_{\mathrm{H}}[n]
= \delta[n] - h_{\mathrm{L}}[n].
}

これだけです。

3. 5 点中央移動平均を使ったハイパス FIR の例

 ここでは、比較的簡単な例として、5 点中央移動平均を具体的なローパス FIR フィルタとして、ハイパスフィルタを作ってみます。
 5 点中央移動平均は、現在のサンプルと、その前後 2 点を平均するローパスフィルタです。そのインパルス応答は、

\displaystyle{
h_{\mathrm{L}}[n] =
\begin{cases}
\displaystyle{\frac{1}{5}}, & n = -2,\,-1,\,0,\,1,\,2 \\0, & \text{otherwise}
\end{cases}
}

となります。係数列として書けば、

\displaystyle{
h_{\mathrm{L}}
=\left[\frac{1}{5},\;\frac{1}{5},\;
\frac{1}{5},\;\frac{1}{5},\;
\frac{1}{5}\right]
}

です。
 このインパルス応答の離散時間フーリエ変換

\displaystyle{
H_{\mathrm{L}}(f)
= \sum_{n=-2}^{2} \frac{1}{5}\, e^{-j 2\pi f n}
}

は、

\displaystyle{
H_{\mathrm{L}}(f)= \frac{1}{5}\left(e^{j4\pi f}+ e^{j2\pi f}+ 1+ e^{-j2\pi f}+ e^{-j4\pi f}
\right)
}

です。さらに、指数関数の対称性を使って余弦にまとめると、

\displaystyle{
H_{\mathrm{L}}(f)= \frac{1}{5}\left(1+ 2\cos(2\pi f)+ 2\cos(4\pi f)
\right)
}

となり、周波数応答が低周波で大きく、高周波に向かって減衰することがわかります。
 このローパスフィルタを使ってハイパスフィルタを構成するには、すでに述べた関係

\displaystyle{
H_{\mathrm{H}}(f) = 1 - H_{\mathrm{L}}(f)
}

を用いればよいので、時間領域のインパルス応答は

\displaystyle{
h_{\mathrm{H}}[n] = \delta[n] - h_{\mathrm{L}}[n]
}

となります。

■ インパルス応答

 まず、単位インパルスは

\displaystyle{
\delta[n] =
\begin{cases}
1, & n = 0,\\
0, & n \neq 0
\end{cases}
}

ですから、5 点中央移動平均 \displaystyle{
h _ {\mathrm{L}}[n] = 1/5
}\displaystyle{
n = −2, −1, 0, 1, 2
})を引き算すると、インパルス応答(係数列)は

\displaystyle{
h_{\mathrm{H}}=\left[-\frac{1}{5},\;-\frac{1}{5},\;
\frac{4}{5},\;-\frac{1}{5},\;
-\frac{1}{5}\right]}

となります。
 この形は中心の係数が大きく正、周囲が等しい負の値を持つことで、局所的な変化(差分のような情報)を強調し、ゆっくりした変動を除去する働きをします。

■ 周波数応答

 周波数領域でも、ローパスの補数として

\displaystyle{
H_{\mathrm{H}}(f)
= 1 - \frac{1}{5}\left(1 + 2\cos(2\pi f) + 2\cos(4\pi f)\right)
}

となります。あたりまえですが、通過と阻止の特性が反転するだけです。

4. まとめ

 本稿では、「ローパスを引くだけ」という非常にシンプルな手続きでハイパス FIR フィルタが構成できることを、時間領域と周波数領域の両面から整理して説明しました。
 おそらく多くの方は、「なんとなくこの方法を使っている」「よくわからないままローパスを引いていた」という経験があるかもしれません。しかし、研究を楽しむためには、背景にある数学を一度きちんと理解しておくことも忘れないでください。その理解が、フィルタ設計の応用や改良、さらには DMA のような長時間相関解析のより深い理解につながっていきます。

※ もし記事の中で「ここ違うよ」という点や気になるところがあれば、気軽に指摘していただけると助かります。質問や「このテーマも取り上げてほしい」といったリクエストも大歓迎です。必ず対応するとは約束できませんが、できるだけ今後の記事で扱いたいと思います。それと、下のはてなブログランキングはあまり信用できる指標ではなさそうですが (私のブログを読んでいる人は、実際とても少ないです)、押してもらえるとシンプルに励みになります。気が向いたときにポチッとしていただけたら嬉しいです。