DSP 03 · LTI システムと畳み込み

Chapter 03

LTI システムと畳み込み

「フィルタ」と呼んでいるものの数学的な正体は LTI システム(線形時不変システム) である。 この章で「フィルタはインパルス応答\(h[n]\)で完全に決まる」ことと、畳み込みの公式を導出する。

この章で証明する、ちょっと信じがたい主張. 目の前に中身の見えない黒い箱(フィルタ)がある。回路図もソースコードも分からない。 ところが——その箱を一発「ポン」と叩いて、返ってきた音を録音するだけで、 その箱がこの世のあらゆる入力に対してどう応答するかが、完全に予測できてしまう

常識的にはおかしい。「一発叩いた音」なんて、その箱の性質のごく一部しか分かりそうにない。 ところが箱が 2 つの条件(線形性時不変性)を満たしていれば、これが厳密に成り立つ。 そしてオーディオのフィルタ、イコライザ、リバーブ——実用フィルタはほぼ全部この 2 条件を満たす。

この章は、その「一発叩けば全部分かる」を数式にした畳み込みという演算の話である。 名前は物々しいが、中身は「遅らせて、音量を変えて、足す」だけの、極めて素朴な操作にすぎない。

1. システムとは

入力信号\(x[n]\)を受け取り出力信号\(y[n]\)を返す「箱」をシステムと呼ぶ:

\[ y[n] = \mathcal{T}\{x[n]\} \]

(\(\mathcal{T}\)は「箱が中でやっている処理」を表す記号。Transform の T。 中身が足し算なのか掛け算なのか分からないので、とりあえず名前だけ付けておく、という程度の意味。)

例:\(y[n] = \frac{1}{2}(x[n] + x[n-1])\)(隣り合う 2 サンプルの平均 = 簡単なローパスフィルタ)。

なぜこれがローパス(低音を通し高音を削る)になるのか. 隣り合う 2 つの値を平均する、という操作を思い浮かべてほしい。

つまり「隣と平均する = ならす = 尖った変化を鈍らせる」。写真のぼかしフィルタと同じ理屈である。

2. 線形性と時不変性

線形性 (Linearity)

任意の信号\(x_1, x_2\)と定数\(a, b\)に対して:

\[ \mathcal{T}\{a x_1[n] + b x_2[n]\} = a \mathcal{T}\{x_1[n]\} + b \mathcal{T}\{x_2[n]\} \]

直感: 「重ね合わせが効く」。2 つの音を混ぜてからフィルタに通しても、別々に通してから混ぜても結果が同じ。

具体的には次の 2 つを同時に要求している:

線形でない例(=この章の理論が使えない箱).

逆に言えば、イコライザやリバーブのような「音色は変えるが、音量を上げても素直に比例する」処理は線形。 本シリーズが扱う IIR フィルタは全部こちら側である。

時不変性 (Time-Invariance)

入力を\(n_0\)サンプル遅らせると、出力もそっくりそのまま\(n_0\)サンプル遅れる:

\[ \mathcal{T}\{x[n]\} = y[n] \quad \Longrightarrow \quad \mathcal{T}\{x[n - n_0]\} = y[n - n_0] \]

直感: 「システムの性質が時間によって変わらない」。今日通しても明日通しても同じ音になるエフェクター。 言い換えると「箱の性質が時計を見ていない」——いつ入力が来たかによって処理内容が変わらない、ということ。

時不変でない例.

なお IIR フィルタも、動作中につまみを回せばその瞬間は時変システムになる (だから 07 章で「係数を動的に変えるときは安定性に注意」という話が出てくる)。 つまみを固定している限りは時不変。

この 2 つを満たすシステムが LTI システム。実用フィルタ(IIR/FIR)はすべて LTI である。

3. 畳み込みの導出 — LTI システムはインパルス応答で完全に決まる

インパルス応答の定義

システムに単位インパルス\(\delta[n]\)を入れたときの出力をインパルス応答と呼ぶ:

\[ h[n] = \mathcal{T}\{\delta[n]\} \]

直感: 「一発だけ叩いたときの応答」。お寺の鐘を一回突いたときの「ゴーン…(余韻)」が鐘というシステムのインパルス応答。

導出

これから何をするか. 「一発叩いた音\(h[n]\)さえ分かれば、あらゆる入力への応答が分かる」を証明する。 筋道はたった 3 手で、しかも新しい道具は一切使わない:

  1. 入力をインパルスの寄せ集めにバラす(01 章でやった分解)
  2. 線形性を使って「バラしてから通す」に切り替える
  3. 時不変性を使って、ずれたインパルスの応答が「ずれた\(h\)」だと言う

これだけで畳み込みの公式が出てくる。では始める。

01 章で導出した信号の分解を出発点にする:

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

これをシステムに入力する:

\[ y[n] = \mathcal{T}\left\{\sum_{k=-\infty}^{\infty} x[k] \delta[n-k]\right\} \]

ステップ 1(線形性を使う): 和の各項は「定数\(x[k]\)× 信号\(\delta[n-k]\)」の形(\(k\)は和のインデックスであり、信号としての時間変数は\(n\)であることに注意)。線形性より\(\mathcal{T}\)を和の中に入れ、定数を外に出せる:

\[ y[n] = \sum_{k=-\infty}^{\infty} x[k] \mathcal{T}\{\delta[n-k]\} \]

ステップ 2(時不変性を使う):\(\mathcal{T}\{\delta[n]\} = h[n]\)だから、入力を\(k\)遅らせた\(\delta[n-k]\)に対する出力は\(h[n-k]\):

\[ \mathcal{T}\{\delta[n-k]\} = h[n-k] \]

代入して:

\[ \boxed{y[n] = \sum_{k=-\infty}^{\infty} x[k] h[n-k] \equiv (x * h)[n]} \]

これが畳み込み和 (convolution sum)。∎

この結果の重み

直感: 畳み込みは「重み付き残響の重ね合わせ」

\(y[n] = \sum_k x[k] h[n-k]\)は次のように読める:

過去の各時刻\(k\)に入力された値\(x[k]\)が、それぞれ「\(h\)の形の余韻」を高さ\(x[k]\)倍で発生させる。 時刻\(n\)の出力は、いま鳴っているすべての余韻の合計。

鐘を連打すると、各打撃の「ゴーン」が重なり合って聞こえる。あれが畳み込みである。

畳み込みの分解図
図: 上段の 3 本のインパルスがそれぞれ「\(h\)の形の余韻」を自分の高さ倍で発生させ(中段)、時刻ごとにそれらを合計したものが出力(下段)。畳み込み和の各項が中段の 1 本ずつに対応する。

4. 畳み込みの性質(すべて導出)

(a) 可換性:\(x * h = h * x\)

\[ (x*h)[n] = \sum_{k=-\infty}^{\infty} x[k] h[n-k] \]

変数変換\(m = n - k\)(つまり\(k = n - m\)。\(k\)が\(-\infty \to \infty\)を動くとき\(m\)も\(\infty \to -\infty\)の全整数を動く):

\[ (x*h)[n] = \sum_{m=-\infty}^{\infty} x[n-m] h[m] = \sum_{m=-\infty}^{\infty} h[m] x[n-m] = (h*x)[n] \qquad \blacksquare \]

意味: 「入力とインパルス応答の役割は対称」。実装上どちらをずらしながら掛けてもよい。

(b) 結合性:\((x * h_1) * h_2 = x * (h_1 * h_2)\)

\[ \big((x*h_1)*h_2\big)[n] = \sum_{m} (x*h_1)[m] h_2[n-m] = \sum_{m} \left(\sum_{k} x[k] h_1[m-k]\right) h_2[n-m] \]

和の順序を交換(絶対収束を仮定)し、\(l = m - k\)と変数変換(\(k\)固定で\(m\)が全整数を動けば\(l\)も全整数を動く):

\[ = \sum_{k} x[k] \sum_{m} h_1[m-k] h_2[n-m] = \sum_{k} x[k] \sum_{l} h_1[l] h_2[(n-k)-l] = \sum_{k} x[k] (h_1 * h_2)[n-k] \]

これは\(x * (h_1 * h_2)\)の定義そのもの。∎

意味: フィルタの直列接続は、インパルス応答同士の畳み込みを持つ 1 つのフィルタと等価。 しかも可換性より接続順序を入れ替えても結果は同じ。これが 09 章の「biquad 縦続接続」の理論的根拠。

(c) 分配性:\(x * (h_1 + h_2) = x * h_1 + x * h_2\)

\[ \big(x*(h_1+h_2)\big)[n] = \sum_k x[k](h_1[n-k] + h_2[n-k]) = \sum_k x[k]h_1[n-k] + \sum_k x[k]h_2[n-k] \]

(有限の値をとる 2 つの和への分割)。これは\((x*h_1)[n] + (x*h_2)[n]\)。∎

意味: フィルタの並列接続は、インパルス応答の和を持つ 1 つのフィルタと等価。

5. 因果性

定義: 出力\(y[n]\)が現在と過去の入力(\(x[m], m \leq n\))だけで決まるシステムを因果的 (causal) という。

LTI システムが因果的 ⟺\(h[n] = 0 (n < 0)\)の導出:

(\(\Leftarrow\))\(h[n-k] \)は\(n - k < 0\)すなわち\(k > n\)で 0。よって

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

となり、未来の入力\(x[k](k>n)\)は出力に影響しない。因果的である。

(\(\Rightarrow\)) 対偶を示す。ある\(n_0 < 0\)で\(h[n_0] \neq 0\)とする。入力\(x[n] = \delta[n]\)を考えると \(y[n_0] = h[n_0] \neq 0\)。つまり入力が時刻 0 に来るより前の時刻\(n_0\) に出力が出ている。 これは「原因より先に結果が出る」ことなので因果的でない。∎

直感: リアルタイム動作するフィルタは未来のサンプルを読めないので必ず因果的。 IIR フィルタは通常、因果的なものとして設計・実装する。

6. BIBO 安定性(IIR 理解の要)

そもそも「安定」とは何が起きないことか. スピーカーがマイクに近づいたときの「ピーーー!」というハウリング——あれは音が マイク→アンプ→スピーカー→マイク…とループを回るたびに大きくなり、際限なく成長した結果である。 IIR フィルタも自分の出力を入力に戻す(フィードバック)仕掛けなので、設計を誤ると全く同じことが起きる。 入力は小さいのに出力だけが青天井に膨らんでいく——これが「不安定」。

「安定」とはその逆で、まともな大きさの入力を入れている限り、出力もまともな大きさに収まること。 これを数学の言葉にしたのが以下の定義である。

定義: 有界な入力(\(|x[n]| \leq B_x < \infty\)がすべての\(n\)で成立)に対して、出力も必ず有界になるとき、 システムは BIBO 安定 (Bounded-Input Bounded-Output stable) という。

(「有界」= 大きさに上限がある、の意。\(B_x\)はその上限値。 「どんなに大きくても\(B_x\)は超えない入力」を入れたら「出力にも何らかの上限がある」ことを要求している。 なお\(B_x\)がいくつであれ構わない——1 でも 100 万でもよく、有限でありさえすればよい。)

定理

\[ \text{LTI システムが BIBO 安定} \quad \Longleftrightarrow \quad \sum_{k=-\infty}^{\infty} |h[k]| < \infty (\text{インパルス応答が絶対総和可能}) \]

導出(十分性:\(\sum|h| < \infty \Rightarrow\)安定)

\(|x[n]| \leq B_x\)とする。三角不等式より:

\[ |y[n]| = \left|\sum_{k} h[k] x[n-k]\right| \leq \sum_{k} |h[k]| |x[n-k]| \leq B_x \sum_{k} |h[k]| < \infty \]

出力はすべての\(n\)で有界。∎

導出(必要性: 安定\(\Rightarrow \sum|h| < \infty\)。対偶で示す)

\(\sum_k |h[k]| = \infty\)と仮定し、出力が発散する有界入力を具体的に作る。

これから何をするか(作戦の説明). 示したいのは「余韻の総量\(\sum|h|\)が無限なら、そのシステムは不安定」。 不安定とは「有界な入力なのに出力が発散するような、意地悪な入力が 1 つでも存在する」ということなので、 そういう入力を実際に 1 つ作ってみせれば証明完了になる(反例を挙げる、という証明法)。

どう作るか。畳み込み\(y[0] = \sum_k h[k]x[-k]\)は「\(h\)の各値に入力の各値を掛けて足す」計算だから、 \(h[k]\)が正の場所では\(x\)も正、\(h[k]\)が負の場所では\(x\)も負にしてやれば、 掛け算の結果が全部プラスになり、打ち消し合いが一切起きず、最大限に積み上がる。 つまり「符号を\(h\)にぴったり合わせた入力」が最も意地悪な入力である。 しかも各サンプルは\(\pm 1\)か 0 なので、入力としては全くまともな大きさ(有界)。これが以下の\(x[n]\)の正体。

次の入力を考える(各サンプルは\(\pm1\)か 0 なので明らかに有界、\(B_x = 1\)):

\[ x[n] = \operatorname{sgn}(h[-n]) = \begin{cases} +1 & (h[-n] > 0)\\ 0 & (h[-n] = 0)\\ -1 & (h[-n] < 0) \end{cases} \]

時刻\(n = 0\)の出力を計算する:

\[ y[0] = \sum_{k} h[k] x[0-k] = \sum_{k} h[k] x[-k] = \sum_{k} h[k] \operatorname{sgn}(h[k]) = \sum_{k} |h[k]| = \infty \]

(\(h[k]\operatorname{sgn}(h[k]) = |h[k]|\)を使った。) 有界な入力なのに出力が無限大になったので BIBO 安定ではない。∎

直感