FIRフィルタとは? 有限インパルス応答から畳み込み・線形位相・安定性を理解する

ノイズだらけのセンサ信号から本当の波形だけを取り出したい。音楽の低音だけを持ち上げたい。無線の受信信号から目的のチャンネルだけを抜き出したい。こうした「信号から欲しい成分だけを通す」操作の主役が FIRフィルタ(Finite Impulse Response filter、有限インパルス応答フィルタ) です。

FIRフィルタは、オーディオのイコライザ、通信機のチャネル選択、心電図の前処理、地震計のデータ処理、レーダーやSDR(ソフトウェア無線)まで、ディジタル信号処理のあらゆる現場で使われています。多くの解説書は「窓関数法で係数を決めましょう」といきなり設計手順から入りますが、この記事はあえて遠回りします。まず 「FIRフィルタとは結局のところ何をしている箱なのか」 を、インパルス応答 という一点から腹落ちさせることを目標にします。

この視点が手に入ると、次のことが一本の線でつながって見えるようになります。

  • なぜFIRフィルタは「畳み込み」で計算できるのか
  • なぜ係数を左右対称にするだけで「位相が歪まない(線形位相)」という特別な性質が手に入るのか
  • なぜFIRフィルタは設計を間違えても 絶対に発散しない(常に安定) のか

本記事の内容

  • インパルス応答という「フィルタの正体」の直感的理解
  • FIR(有限)と IIR(無限)の違いを応答の形で捉える
  • 畳み込みが動作原理そのものであることの導出
  • 線形位相・群遅延・安定性という3つの重要性質を式と図で理解する
  • Pythonでの挙動確認(ノイズ除去・波形歪み・周波数応答)

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

より実務的な設計手順(窓関数の選び方、仕様からタップ数を決める公式など)に踏み込みたい場合は、姉妹記事の FIRフィルタの設計(窓関数法)ディジタルフィルタ設計 — FIR/IIR が対になります。本記事はその土台となる「概念」を担当します。

インパルス応答 — フィルタの正体は「1発の衝撃への反応」

フィルタを「中身のわからないブラックボックス」だと思ってください。この箱が何をするものなのかを知りたい。一番てっとり早い調べ方は何でしょうか。

答えは「叩いてみる」ことです。太鼓でも、鐘でも、空き部屋でも、一瞬の衝撃を与えて、その余韻(残響)を聞けば、その物体の性質がわかります。鐘なら澄んだ音が長く伸び、座布団を叩けば「ボスッ」と一瞬で終わる。この「余韻の形」こそが、その系の個性そのものです。

ディジタル信号処理でこの「一瞬の衝撃」にあたるのが 単位インパルス $\delta[n]$ です。

$$ \delta[n] = \begin{cases} 1 & (n = 0) \\ 0 & (n \neq 0) \end{cases} $$

時刻 $0$ だけ値が $1$ で、あとは全部 $0$ という、最もシンプルな信号です。これをフィルタに入れたときに出てくる出力を インパルス応答 と呼び、$h[n]$ と書きます。

FIRの概念図: 単位インパルスを入れて出てくる有限長の応答h[k]

この図が本記事のすべての出発点です。左の「トン」という1発($\delta[n]$)を箱に入れると、右のような「余韻」$h[k]$ が出てきます。この余韻がフィルタの性格を完全に決めています。そして重要なのは、余韻が 有限個の値で終わっている こと。これが Finite(有限)Impulse Response という名前の由来です。

なぜインパルス応答さえわかればフィルタのすべてがわかるのか。それは、あらゆる入力信号が「インパルスの寄せ集め」として書けるからです。この事実が次に見る「畳み込み」に直結します。

なぜ「有限」なのか — FIR と IIR の違い

「有限インパルス応答」という名前は、裏を返せば「無限インパルス応答」も存在することを示唆しています。実際、フィルタは応答の続き方で2種類に分かれます。

  • FIR(有限インパルス応答): 余韻が有限時間できっちり $0$ になる
  • IIR(無限インパルス応答): 余韻が理論上いつまでも続く(減衰はするが完全には $0$ にならない)

座布団を叩いた「ボスッ」がFIR、鐘を鳴らした「ゴーン……」が減衰しながら永遠に続くIIR、とイメージすると掴みやすいでしょう。

FIRとIIRのインパルス応答の比較(有限長 vs 無限に尾を引く)

左のFIRは、ある時刻でピタッと $0$ になり、それ以降は完全に無音です。右のIIRは、指数的に小さくなりながらも尾を無限に引き続けます。この「有限か無限か」という一見些細な違いが、あとで見る 安定性線形位相 という2つの決定的な性質の分かれ目になります。

では、この有限個のインパルス応答 $h[n]$ を使って、任意の入力に対する出力はどう計算されるのでしょうか。ここで畳み込みが登場します。

FIR の動作原理は「畳み込み」そのもの

任意の信号はインパルスの重ね合わせ

どんな離散信号 $x[n]$ も、時刻をずらしたインパルスに、それぞれの高さを掛けて足したものとして表せます。

$$ x[n] = \sum_{k=-\infty}^{\infty} x[k]\,\delta[n-k] $$

これは当たり前のことを言っているだけです。「時刻 $k$ における信号の値 $x[k]$ は、時刻 $k$ に立てた高さ $x[k]$ のインパルスである」——それを全時刻について足し合わせれば元の信号に戻る、というだけの話です。

線形時不変なら出力はインパルス応答の重ね合わせ

ここでフィルタが 線形時不変(LTI) だと仮定します。線形とは「2倍の入力には2倍の出力」「和の入力には出力の和」、時不変とは「入力を10サンプル遅らせれば出力も同じ形で10サンプル遅れるだけ」という性質です。ほとんどの実用フィルタはこの性質を持ちます。

このとき、入力 $\delta[n]$ に対する出力が $h[n]$ なら、時間をずらした $\delta[n-k]$ に対する出力は(時不変性より)$h[n-k]$、それを $x[k]$ 倍したものの総和(線形性より)が出力になります。

$$ y[n] = \sum_{k=-\infty}^{\infty} x[k]\,h[n-k] $$

これが 畳み込み(convolution) です。総和の添字を入れ替える($h$ 側を基準にする)と、より実装に近い次の形になります。

$$ \begin{equation} y[n] = \sum_{k} h[k]\,x[n-k] \end{equation} $$

FIRフィルタでは $h[k]$ が $k = 0, 1, \dots, M-1$ の 有限個 しかないので、総和は有限項で打ち切られます。

$$ y[n] = \sum_{k=0}^{M-1} h[k]\,x[n-k] = h[0]x[n] + h[1]x[n-1] + \cdots + h[M-1]x[n-(M-1)] $$

つまりFIRフィルタの計算は、「現在と過去 $M-1$ サンプルの入力に、係数 $h[k]$ を掛けて足すだけ」 です。この $h[k]$ を タップ係数、$M$ を タップ数 と呼びます。設計で決める「係数」とは、インパルス応答そのものだったわけです。

FIRの畳み込み演算の図解

図は $h = [0.5, 0.3, 0.2]$ という3タップのFIRで、時刻 $n=4$ の出力を計算する様子です。$h[0]$ を今の入力 $x[4]$ に、$h[1]$ を1つ前の $x[3]$ に、$h[2]$ を2つ前の $x[2]$ に掛けて足すと、$0.5\times2 + 0.3\times3 + 0.2\times1 = 2.1$ が出力 $y[4]$ になります。窓を1サンプルずつ右にずらしながらこの積和を繰り返すのが畳み込みです。

この「重み付き和」という単純な仕組みが、実は非常に強力です。まずは一番シンプルなFIRフィルタで、その働きを体感してみましょう。

最も簡単なFIR — 移動平均フィルタ

すべての係数を $1/M$ にした $h[k] = 1/M$ のFIRフィルタは、直近 $M$ サンプルの単純平均を出力します。これが誰もが一度は使ったことのある 移動平均フィルタ です。

$$ y[n] = \frac{1}{M}\sum_{k=0}^{M-1} x[n-k] $$

平均を取ればランダムなノイズは打ち消し合って小さくなり、ゆっくり変化する本体の信号は残ります。これが立派な「ローパスフィルタ(低い周波数を通す)」になっています。

移動平均フィルタによるノイズ除去

正弦波に大きなノイズ(灰色)を乗せた信号を、9点移動平均($M=9$)に通した結果がオレンジです。真の信号(緑)に対する平均二乗誤差は、ノイズありの $0.216$ から $0.019$ へと約1桁改善しました。たった「9個を平均する」だけのFIRで、これだけノイズが落ちるわけです。

ただし移動平均は「素朴すぎる」ローパスフィルタでもあります。ここから係数を賢く選んでいくと、通す周波数と止める周波数の境目を鋭くできる——それが窓関数法などの「設計」の話です。本記事では設計そのものには深入りせず、FIRが持つ「設計法によらない普遍的な性質」を見ていきます。その筆頭が線形位相です。

FIR 最大の武器 — 線形位相

位相が歪むと波形が崩れる

フィルタには「振幅特性(どの周波数をどれだけ通すか)」だけでなく「位相特性(どの周波数をどれだけ遅らせるか)」があります。ここが見落とされがちですが極めて重要です。

もし周波数ごとに遅れる量がバラバラだと、信号を構成する各周波数成分の到着タイミングがズレて、波形の形そのものが崩れます。音声なら音がにじみ、画像なら輪郭がぼやけ、通信なら符号が隣と干渉します。これを避けたいなら、すべての周波数を同じ時間だけ遅らせる必要があります。この「全周波数で遅延が一定」を実現するのが 線形位相 です。

線形位相と非線形位相の波形歪みの比較

同じように高域を落とすフィルタでも、線形位相FIR(緑、遅延ぶんを補正して重ねたもの)は入力パルス(灰色)の角の形をほぼ保っているのに対し、非線形位相のフィルタ(赤)は立ち上がりが崩れ、パルスの前後がにじんでいます。振幅特性が似ていても、位相が悪いと波形はここまで変わります。

なぜ対称係数で線形位相になるのか

FIRの美点は、この線形位相を 「係数を左右対称にするだけ」 で厳密に達成できることです。IIRでは(一般には)不可能な芸当です。なぜ対称性が線形位相を生むのか、周波数応答を書き下して確かめましょう。

長さ $M$ のFIRの周波数応答は、インパルス応答の離散時間フーリエ変換(DTFT)で与えられます。

$$ H(e^{j\omega}) = \sum_{n=0}^{M-1} h[n]\,e^{-j\omega n} $$

ここで係数が対称、すなわち $h[n] = h[M-1-n]$ だと仮定します。総和の中心 $\alpha = \frac{M-1}{2}$ をくくり出すために、共通因子 $e^{-j\omega\alpha}$ を外に出します。

$$ H(e^{j\omega}) = e^{-j\omega\alpha}\sum_{n=0}^{M-1} h[n]\,e^{-j\omega(n-\alpha)} $$

いま指数の肩は中心 $\alpha$ からのズレ $(n-\alpha)$ になっています。対称性から、中心を挟んで対になる項 $n$ と $M-1-n$ は同じ係数 $h[n]$ を持ち、中心からのズレは $\pm(n-\alpha)$ と符号だけが逆です。この対になる2項を足すと、オイラーの公式でコサインにまとまります。

$$ h[n]\left(e^{-j\omega(n-\alpha)} + e^{+j\omega(n-\alpha)}\right) = 2h[n]\cos\big(\omega(n-\alpha)\big) $$

したがって総和全体は 実数値の関数 $A(\omega)$ になり、周波数応答は次の形に整理できます。

$$ H(e^{j\omega}) = A(\omega)\,e^{-j\omega\alpha}, \qquad A(\omega)\in\mathbb{R} $$

ここが核心です。位相 $\angle H(e^{j\omega})$ は、実数 $A(\omega)$ の符号を除けば $-\omega\alpha$ という $\omega$ の一次関数(直線) になっています。位相が周波数に対して直線 —— これがまさに「線形位相」の定義です。傾きは $-\alpha = -\frac{M-1}{2}$ で、これは後述の群遅延そのものです。

対称な係数と線形位相

左は対称なFIR係数で、点線の対称中心 $n=(M-1)/2$ を軸に鏡像になっています。この形なら上の導出が成り立ち、位相は厳密に直線になります。右のように対称性を崩すと、この打ち消しが働かず位相は曲がります。「係数を対称に置く」というただそれだけの設計上の約束が、波形を守る強力な性質を生むわけです。

群遅延 — 遅れは「一定」

線形位相の「遅れの一定さ」を定量化するのが 群遅延 $\tau_g(\omega)$ で、位相を周波数で微分した符号反転として定義されます。

$$ \tau_g(\omega) = -\frac{d}{d\omega}\angle H(e^{j\omega}) $$

線形位相なら位相が $-\omega\alpha$ なので、微分すると $\tau_g(\omega) = \alpha = \frac{M-1}{2}$ となり、周波数によらず一定です。

群遅延: 線形位相なら一定

線形位相FIR(緑)の群遅延は、全周波数にわたって水平な直線 $\frac{M-1}{2}=20$ サンプルです。すべての周波数成分が仲良く20サンプルずつ遅れるので、波形が崩れません。一方、非線形位相のフィルタ(赤)の群遅延は周波数ごとにうねっており、成分ごとに遅れがバラバラ=波形が崩れることを意味します。「一定の遅れ」は単なる時間シフトなので、あとで差し引けば元の波形が取り戻せます。

線形位相は「波形を守る」性質でした。もう一つ、FIRには設計者を安心させる決定的な性質があります。安定性です。

FIR はなぜ「常に安定」なのか

フィルタ設計で怖いのは、出力が発散して無限大に飛んでいってしまう 不安定 な状態です。IIRフィルタは過去の出力を戻す「フィードバック」を持つため、係数を誤ると出力がループの中で雪だるま式に増幅され、簡単に発散します。だからIIR設計では「極を単位円の内側に置く」という安定性の確認が欠かせません。

ところがFIRは、この心配が 原理的に存在しません。理由は式の形にあります。FIRの出力は

$$ y[n] = \sum_{k=0}^{M-1} h[k]\,x[n-k] $$

で、右辺には過去の入力 $x$ しか現れず、過去の出力 $y$ が一切戻ってきません(フィードフォワードのみ)。したがって入力が有界、つまりある値 $B$ を超えなければ、出力は必ず次の範囲に収まります。

$$ |y[n]| \le \sum_{k=0}^{M-1} |h[k]|\,|x[n-k]| \le B\sum_{k=0}^{M-1} |h[k]| $$

係数は有限個なので $\sum|h[k]|$ は必ず有限の値です。よって出力も必ず有限 —— これが BIBO安定(有界入力・有界出力) です。FIRは係数をどう選ぼうと、有限個である限り絶対に発散しません。

FIRの安定性(BIBO安定)の直感

図はFIRとIIRの式を並べたものです。FIR(上)は入力だけの重み付き和なので、上の不等式がそのまま安定性の証明になります。IIR(下)は過去の出力 $y[n-k]$ を戻す項を持ち、この係数 $a_k$ の選び方しだいでフィードバックループが発散しうる。FIRの「安定性がタダで手に入る」という気楽さは、この構造的な違いから来ています。

この安定性は、周波数応答を決める「零点・極」の配置からも説明できます。次に周波数の世界からFIRを眺めてみましょう。

周波数応答と零点 — 時間の係数と周波数特性のつながり

ここまで時間領域(サンプル列)で見てきましたが、フィルタの「どの周波数を通すか」は周波数領域で見るのが自然です。すでに使ったとおり、周波数応答はインパルス応答のフーリエ変換です。

$$ H(e^{j\omega}) = \sum_{n=0}^{M-1} h[n]\,e^{-j\omega n} $$

時間領域の係数 $h[n]$ を決めることは、そのまま周波数特性 $H(e^{j\omega})$ を決めること と同じ、という関係がここに表れています。

FIRの周波数応答(振幅と位相)

41タップのローパスFIRの周波数応答です。上段の振幅は、遮断周波数 $0.25\pi$ までを通し、それ以上の帯域を阻止域として約 $-60$ dB まで大きく減衰させています。下段の位相はほぼ直線で、線形位相が実現できていることが確認できます(振幅が谷でゼロを横切るたびに位相が $\pi$ 跳ぶのは、$A(\omega)$ の符号反転によるもので、線形位相と矛盾しません)。

$z$ 変換で見ると、FIRの伝達関数は $H(z) = \sum_{n=0}^{M-1} h[n] z^{-n}$ という 多項式 です。分母が $1$(定数)なので、極はすべて原点 $z=0$ に集まり、零点だけが複素平面上に散らばります。振幅特性の「谷」は、零点が単位円 $|z|=1$ に近い角度で作られます。

FIRの零点-極点配置(z平面)

零点(青丸)が単位円の周りに配置され、極(赤×)はすべて原点に集中しています。極が原点にある=必ず単位円の内側にあるので、この配置からもFIRが常に安定であることが読み取れます。周波数応答の形は、零点をどこに置くかで決まるわけです。

最後に、設計の自由度=タップ数がフィルタ性能にどう効くかを見ておきます。

タップ数が決める性能 — 鋭さと計算量のトレードオフ

FIRの唯一にして最大の設計パラメータは タップ数 $M$ です。$M$ を増やすほど、通過域と阻止域の境目(遷移帯域)を急峻にでき、阻止域も深くできます。

タップ数による遷移帯域の変化

同じ遮断周波数 $0.25\pi$ でも、$M=11$(青)ではなだらかにしか落ちないのに対し、$M=81$(緑)では崖のように急峻に落ちています。「よく効くフィルタ」が欲しければタップを増やせばよい、というシンプルな関係です。

ただしタダではありません。タップ数 $M$ を増やすと、1サンプルあたりの積和が $M$ 回に比例して増え、群遅延 $\frac{M-1}{2}$ も大きくなります。鋭さ(性能)と、計算量・遅延(コスト)のトレードオフ です。同じ鋭さをより少ないタップで実現する工夫が Parks-McClellan(Remez)法による等リップル設計 や、乗算を使わない CICフィルタ といった発展的な設計法です。

まとめ

本記事では、FIRフィルタを「設計手順」ではなく「概念」から解き明かしました。

  • インパルス応答 $h[n]$ こそフィルタの正体 — 1発の衝撃 $\delta[n]$ への余韻がフィルタの性格を完全に決める。それが有限個で終わるのがFIR、無限に続くのがIIR
  • 動作原理は畳み込み — 任意の信号をインパルスの重ね合わせと見なすと、出力は $y[n]=\sum_k h[k]x[n-k]$ という「過去入力の重み付き和」になる。係数(タップ)=インパルス応答そのもの
  • 線形位相 — 係数を左右対称 $h[n]=h[M-1-n]$ にすると位相が厳密に直線になり、群遅延が一定($\frac{M-1}{2}$)。波形を歪ませないという、IIRには真似できない強み
  • 常に安定 — フィードバックが無いので、有限個の係数である限りBIBO安定が自動的に成り立つ。発散しようがない
  • タップ数 $M$ が鋭さと計算量・遅延のトレードオフを決める唯一の主パラメータ

「インパルス応答」という一点から出発すると、畳み込み・線形位相・安定性が、バラバラの事実ではなく一本の線でつながって見えてきます。この土台の上に、実際に係数を決める「設計」の技術が乗ります。

次のステップとして、以下の記事も参考にしてください。