第8章

フーリエ変換の性質(2): たたみこみと積 — 線形時不変システムの入出力

この章のねらい

  • たたみこみの定義と「反転してスライドして積和」の操作を言語化できる
  • LTIシステムの出力が入力とインパルス応答のたたみこみになる筋道を追える
  • たたみこみ⇔積の関係を理解し、フィルタリングの原理として読める

8.1 たたみこみ

やる夫

たたみこみって言葉、聞いたことだけはあるお。なんか強そうな名前だお。漢字で書くと「畳み込み」だお?

やらない夫

そうだ。英語だと convolution。信号処理でいちばん使う演算と言っていい。まず定義を出すが、最初は記号の見た目に怯むな。連続信号 x(t)x(t)h(t)h(t) のたたみこみ (xh)(t)(x * h)(t) はこう定義される。

(xh)(t)=x(τ)h(tτ)dτ(8.1)(x * h)(t) = \int_{-\infty}^{\infty} x(\tau)\, h(t - \tau)\, d\tau \tag{8.1}

離散信号なら積分が和になるだけだ。

(xh)[n]=k=x[k]h[nk](8.2)(x * h)[n] = \sum_{k=-\infty}^{\infty} x[k]\, h[n - k] \tag{8.2}
やる夫

積分の中に τ\tautτt - \tau が両方いて、外に tt がいるお。第7章の置換のときよりこんがらがってるお。

やらない夫

落ち着け。記号の山に見えるが、やってる操作は4ステップの単純作業だ。離散版 (8.2) で説明する。出力の1点 y[n]y[n] を作るのに、

  1. h[k]h[k]左右反転して h[k]h[-k] にする
  2. それを nn だけスライドして h[nk]h[n-k] にする
  3. x[k]x[k]h[nk]h[n-k]各点で掛ける
  4. 全部足し合わせる

これを nn を1つずつずらしながら繰り返すと、出力 y[n]y[n] が全部埋まる。「反転・スライド・積和」だ。

やる夫

反転してスライドして、重なってるところを掛けて足す…。言葉にすると、そんなに怖くないお。でも、なんで反転するんだお? 普通に重ねちゃダメなのかお?

やらない夫

いい質問だ。式 (8.2) を見ろ。x[k]x[k] の引数は kkhh の引数は nkn - k。2つの引数を足すと k+(nk)=nk + (n - k) = n で、いつも nn に揃う。「足して nn になる組み合わせの積を全部集める」のがたたみこみだ。hh 側の引数が nkn - kkk について減っていくから、hh は反転して見える。理屈はあとから効いてくるから、今は手を動かして体感しろ。下のデモだ。

CONVOLUTION — STEP BY STEP INTERACTIVE
再生(または位置 n のスライダー)で、反転した h(アンバー)が x(緑)の上を左から右へ滑っていく。重なった部分だけ中段に積の棒が立ち、その総和が下段の出力 y[n] の高さになる。重なりが増えるほど出力が伸び、すれ違うと減る——これが「反転・スライド・積和」の全貌。
やる夫

おお、アンバーの hh がにゅるっと右へ滑っていくお! 重なった部分だけ真ん中に積の棒が立って、その合計が下の出力の高さになるお。nn を増やすと出力がだんだん埋まっていくお!

やらない夫

それがたたみこみの全貌だ。最初に xxhh がちょっとだけ重なり始め、完全に重なるあたりで出力が最大になり、すれ違って離れていく。台形みたいな形の出力ができただろ。式の意味なんて、この動きを一度見れば腹に落ちる。

8.2 線形時不変システムとたたみこみ

やる夫

定義はわかったお。でも「いちばん使う演算」って言ってたわりに、今のところただの数式遊びだお。何の役に立つんだお?

やらない夫

ここからが本題だ。システムの話をする。システムとは、信号を入れたら別の信号が出てくる箱だ。マイク、スピーカー、アンプ、エコー、フィルタ――全部システムだ。入力 xx に対して出力 yy を返す。この箱の中身が次の2つの性質を持つとき、特別に扱いやすくなる。

やらない夫

1つ目、線形性。入力を定数倍したら出力も同じだけ定数倍され、2つの入力の和を入れたら出力もそれぞれの和になる。式で書くと、入力 x1x_1 に出力 y1y_1x2x_2y2y_2 が対応するとき、

ax1+bx2    ay1+by2(8.3)a\, x_1 + b\, x_2 \;\longrightarrow\; a\, y_1 + b\, y_2 \tag{8.3}

「重ね合わせが効く」ということだ。

2つ目、時不変性。入力を時間でずらしたら、出力も同じだけずれるだけで、形は変わらない。

x[n]y[n]ならx[nn0]y[nn0](8.4)x[n] \to y[n] \quad\text{なら}\quad x[n - n_0] \to y[n - n_0] \tag{8.4}

「いつ入れても同じ反応をする」ということだ。この2つを持つ箱を線形時不変システム、略して LTI システムと呼ぶ。

やる夫

線形で、時間にかかわらず同じ反応をする箱。…なんとなく行儀のいい箱って感じだお。で、それがたたみこみとどうつながるんだお?

やらない夫

筋道を立てる。まず、どんな入力信号もデルタ(インパルス)の足し合わせに分解できる。離散の単位インパルス δ[n]\delta[n] は、n=0n=0 で 1、それ以外で 0 の信号だ。これを使うと任意の信号は

x[n]=kx[k]δ[nk](8.5)x[n] = \sum_{k} x[k]\, \delta[n - k] \tag{8.5}

と書ける。x[k]x[k] という高さの棒を、時刻 kk の位置に立てたものを全部足す、というだけの当たり前の式だ。

やる夫

それはわかるお。棒グラフを1本ずつバラして書いただけだお。

やらない夫

その「1本の棒」をシステムに入れたとき、何が出てくるかを名前で呼ぶ。単位インパルス δ[n]\delta[n] を入れたときの出力をインパルス応答と呼び、h[n]h[n] と書く。箱を「ポン」と1回だけ叩いたときの反応だ。

ここで2つの性質を使う。まず時不変性 (8.4) より、kk だけ遅れたインパルス δ[nk]\delta[n-k] を入れれば、出力も kk だけ遅れて h[nk]h[n-k] になる。次に線形性 (8.3) より、x[k]x[k] 倍したインパルスの入力には x[k]h[nk]x[k]\, h[n-k] が応える。そして入力は (8.5) のとおりインパルスのだから、出力もそれぞれの応答の和になる。

y[n]=kx[k]h[nk]=(xh)[n](8.6)y[n] = \sum_{k} x[k]\, h[n - k] = (x * h)[n] \tag{8.6}
やる夫

出た! 8.1 で見たたたみこみの式だお! インパルスにバラして、1本ずつの反応を足し戻したら、たたみこみになったお!

やらない夫

そう、それが結論だ。LTI システムの出力は、入力とインパルス応答のたたみこみになる。そしてこの式が言っているのはもっと強いことだ。h[n]h[n] さえ分かっていれば、どんな入力 x[n]x[n] に対する出力も計算できる。

**LTI システムは、インパルス応答 h[n]h[n] ただ1つで完全に決まる。**箱を1回叩いて反応を記録すれば、その箱の振る舞いを全部知ったことになる。

やる夫

1回叩けば全部わかる…。なんか診察みたいだお。ハンマーでポンと叩いて反射を見るやつだお。

やらない夫

その例えは悪くない。インパルス応答はシステムの「指紋」だ。

8.3 たたみこみと積の関係

やらない夫

さて、ここでフーリエ変換を持ち出す。たたみこみ y=xhy = x * h の両辺をフーリエ変換すると何が起きるか。結論から書く。

xh    X(ω)H(ω)(8.7)x * h \;\longleftrightarrow\; X(\omega)\, H(\omega) \tag{8.7}

時間領域のたたみこみは、周波数領域では単なる掛け算になる。

やる夫

ええっ!? あんなにこねくり回した反転・スライド・積和が、周波数の世界では「掛けるだけ」になるのかお!?

やらない夫

なる。導出のスケッチを見せよう。連続版で y(t)=x(τ)h(tτ)dτy(t) = \int x(\tau) h(t-\tau)\, d\tau をフーリエ変換する。

Y(ω)=[x(τ)h(tτ)dτ]ejωtdtY(\omega) = \int_{-\infty}^{\infty} \left[ \int_{-\infty}^{\infty} x(\tau)\, h(t - \tau)\, d\tau \right] e^{-j\omega t}\, dt

積分の順序を入れ替えて、内側で tt について積分する。h(tτ)h(t-\tau) の部分には第7章でやった時間シフトの性質が効く。h(tτ)h(t - \tau)tt で変換すると ejωτH(ω)e^{-j\omega\tau} H(\omega) だ。

Y(ω)=x(τ)ejωτH(ω)dτ=H(ω)x(τ)ejωτdτ=H(ω)X(ω)Y(\omega) = \int_{-\infty}^{\infty} x(\tau)\, e^{-j\omega\tau} H(\omega)\, d\tau = H(\omega) \int_{-\infty}^{\infty} x(\tau)\, e^{-j\omega\tau}\, d\tau = H(\omega)\, X(\omega)

残った積分は X(ω)X(\omega) そのもの。だから Y(ω)=X(ω)H(ω)Y(\omega) = X(\omega) H(\omega) だ。

やる夫

第7章の時間シフトがここで効くのかお。性質がつながってるお。…でも、なんで掛け算なんてきれいなことになるんだお。直観が欲しいお。

やらない夫

直観もある。複素指数 ejωte^{j\omega t} を LTI システムに入れると何が出てくるか考えろ。たたみこみで計算すると、

h(τ)ejω(tτ)dτ=ejωth(τ)ejωτdτ=H(ω)ejωt\int h(\tau)\, e^{j\omega(t - \tau)}\, d\tau = e^{j\omega t} \int h(\tau)\, e^{-j\omega\tau}\, d\tau = H(\omega)\, e^{j\omega t}

つまり ejωte^{j\omega t} を入れると、同じ ejωte^{j\omega t} が、H(ω)H(\omega) 倍されて出てくる。形は変わらず大きさと位相だけが変わる。

やる夫

入れたものと同じ形が、定数倍で出てくる…。なんか線形代数で聞いたお。固有ベクトルと固有値だお!

やらない夫

ど真ん中だ。複素指数 ejωte^{j\omega t} は LTI システムの固有関数で、その固有値が H(ω)H(\omega) だ。だから話は単純になる。フーリエ変換は信号を複素指数の重ね合わせに分解する操作だった。各成分はシステムを通っても形を変えず、ただ H(ω)H(\omega) 倍されるだけ。だから周波数ごとに X(ω)X(\omega)H(ω)H(\omega) を掛ければそれが出力のスペクトル――それが (8.7) の正体だ。

やらない夫

この H(ω)H(\omega)周波数応答と呼ぶ。インパルス応答 hh をフーリエ変換したものだ。H(ω)|H(\omega)| は「周波数 ω\omega の成分を何倍にするか」を表す。ある周波数で H|H| が大きければその成分は強められ、小さければ弱められる。これがまさにフィルタリングだ。下のデモで体感しろ。

MOVING AVERAGE FILTER INTERACTIVE
タップ数 M を増やしてみる。ガタガタだった緑の出力がツルツルに滑らかになり、下段の周波数応答 |H| の通過域が狭まって、ピンクの妨害(高周波)が削られていく。これが「時間のたたみこみ=周波数の掛け算」=移動平均が低域通過フィルタとして働く証拠。M を上げるほど高周波は消えるが本物の細かい変化もなまる、というトレードオフも見える。
やる夫

タップ数 M を増やすと、ガタガタしてた緑の出力がツルツルになっていくお! 下の周波数応答を見ると、高い周波数のところがどんどん潰れてるお。妨害のピンクの線のあたりがちゃんと低くなってるお!

やらない夫

それが「時間のたたみこみ=周波数の掛け算」の威力だ。移動平均という単純なたたみこみが、周波数の世界では「高い周波数を削る低域通過フィルタ」として働いている。MM を増やすと通過域が狭くなるから、邪魔な高周波がよく消える代わりに、本物の信号の細かい変化までなまる。このトレードオフをどう設計するかが、フィルタ設計の話だ――それは第12章でみっちりやる。

8.4 周波数領域のたたみこみ

やらない夫

(8.7) は「時間のたたみこみ=周波数の積」だった。第7章で見た双対性を思い出せ。鏡の反対側、つまり「時間の積」をフーリエ変換するとどうなると思う?

やる夫

双対だから…逆になるんだお? 時間で掛けたら、周波数ではたたみこみになる、とか?

やらない夫

そのとおり。

x(t)y(t)    12π(XY)(ω)(8.8)x(t)\, y(t) \;\longleftrightarrow\; \frac{1}{2\pi}\, (X * Y)(\omega) \tag{8.8}

時間領域で2つの信号を掛けると、周波数領域ではそれらのスペクトルのたたみこみになる(係数 1/2π1/2\pi が付くのは連続フーリエ変換の流儀の都合だ)。(8.7) とちょうど役割が入れ替わっている。

やる夫

きれいに裏返ってるお。…でも、時間で2つの信号を掛けるって、どういうときにやるんだお?

やらない夫

いちばん大事な例が窓掛けだ。現実には信号を無限の長さで観測できない。ある有限の区間だけ切り出す。これは元の信号に、その区間だけ 1 で外が 0 の「窓」を掛ける操作だ。x(t)×w(t)x(t) \times w(t)、まさに時間領域の積だ。

すると (8.8) より、観測したスペクトルは「本物のスペクトル X(ω)X(\omega)」と「窓のスペクトル W(ω)W(\omega)」のたたみこみになる。たたみこみは反転スライド積和でぼやける操作だったろ。

やる夫

あ、まずいお。本物のスペクトルが、窓のスペクトルでぼかされちゃうってことかお? 鋭いはずの線がにじむお!

やらない夫

そのとおり。信号に窓を掛ける=スペクトルがにじむ。これは避けられない代償で、にじみ方をなるべくマシにするために色々な窓関数(ハン窓・ハミング窓など)が考案された。その話は第11章でじっくりやる。今は「時間で切り取るとスペクトルがぼやける、その理由が (8.8) だ」とだけ覚えておけ。

やる夫

性質の章、伏線だらけだお。第11章と第12章への置き土産が両方ここにあるんだお。

この章のまとめ
  • たたみこみ (xh)[n]=kx[k]h[nk](x*h)[n] = \sum_k x[k]h[n-k] は「反転・スライド・積和」。足して nn になる組の積を全部集める操作
  • LTI システム(線形・時不変)の出力は、入力とインパルス応答のたたみこみ y=xhy = x * h。だから LTI はインパルス応答 hh ひとつで完全に決まる
  • たたみこみ⇔積: xhX(ω)H(ω)x * h \leftrightarrow X(\omega)H(\omega)。複素指数は LTI の固有関数で固有値が周波数応答 H(ω)H(\omega)。「時間のたたみこみは周波数の掛け算」=フィルタリングの原理
  • 双対で、時間の積⇔周波数のたたみこみ x(t)y(t)12π(XY)(ω)x(t)y(t)\leftrightarrow \frac{1}{2\pi}(X*Y)(\omega)。窓掛けでスペクトルがにじむ理由(第11章への伏線)