← 解説一覧

重ね合わせ ── 一発の応答を、足し合わせる

🌀 場と保存 波動重ね合わせ畳み込み線形
畳み込みスライダ/フーリエ スケッチブックで遊ぶ ↗

前回 は、点をひとつ叩くと丸い波が広がること(点源の応答)、そしてそれを並べて足すと干渉・ホイヘンス・ビームフォーミングになることを見た。今日は、その「足す」を、もっと素朴で、もっと強力な道具として正面から掴む。

底にあるのは、たったひとつの考えだ ── 一発叩いたときの返事さえ分かっていれば、どんなに複雑な入力に対する答えも、その返事の“足し算”で出てしまう。 これが 重ね合わせ。波でも、回路でも、場でも、同じ手が効く。

一発の応答 ── インパルス応答

まず「一発叩く」を決める。ごく短く、鋭く、一回だけ突く。これを インパルス(撃力)という。── インパルスというと数学っぽく聞こえるけれど、要するに「一瞬だけ、どんと入れる」ことだ。現実に無限に細い針が刺さる、という意味じゃなくて、短いクリックや、ハンマーの一撃を理想化したものだと思えばいい。それに対するシステムの返事が インパルス応答 hh だよ。

もう少し正確に。 その理想化された「一瞬」を、数学では δ(t)\delta(t)(ディラックのデルタ)と書く ── 幅ゼロ・高さ無限で、面積(入れた総量)だけが 1 の“一発”だ。その δ\delta を入れたときの出力こそが、厳密な意味でのインパルス応答 h(t)h(t)。現実に完全な δ\delta は作れないけれど、応答 hh の尾(立ち上がりや減衰)に比べて十分に短い一撃なら、それで十分よく近似できる。だから「ハンマーの一撃に対する返事」でちゃんと正しいんだ。

システムごとに、この「一発の返事 hh」の形は違う。でも、いったん hh が分かると ── 次がすごいんだ。

なぜ「比例」じゃ足りないのか

ここで素朴な疑問が出る。線形なら、出力は入力に比例して y(t)=kx(t)y(t) = k\,x(t) ── ただの定数倍でいいんじゃないの?

実際、そういうシステムもある。たとえば 抵抗器:電圧と電流は V=RIV = R\,I で、いまこの瞬間の入力だけで出力が決まる。ばねも(ゆっくり動かすうちは)F=kxF = kx で、引いた長さに比例した力がその場で返る。これらは 返事がその場で終わる ── 過去を引きずらないから、ほんとうに y=kxy = k\,x で済む。

でも、世の中の多くはそうじゃない。一発叩いた返事が、すぐには終わらず、尾を引く からだ。鐘はポーンとしばらく鳴り続けるし、部屋の残響は遅れて何度も返ってくる。その「尾」── 過去に入れたぶんが、いまもまだ残っている ── こそが応答 hh の正体で、ただの比例では捕まえられない所なんだ。下で、その尾を持つ代表例を2つ見てみよう。

例1:コンデンサ(RC回路)

抵抗 RR とコンデンサ CCRCローパス(入力電圧 → コンデンサ電圧)を考える。ごく短い入力をひと突き入れると、コンデンサの電圧はスッと立ち上がり、そのあと RR を通して ゆっくり放電 していく。その返事(インパルス応答)は

h(t)=1RCet/RC(t0)h(t) = \frac{1}{RC}\,e^{-t/RC}\qquad(t\ge 0)

時定数 RCRC で減っていく尾 ── これが 記憶 だ。RCRC が長いほど、過去を長く引きずる。

時間 t → t=RC で 1/e ≈ 0.37 一発の返事 h(t)=(1/RC)e^(−t/RC) 一定入力への充電カーブ X(1−e^(−t/RC))
緑=一発の返事(インパルス応答)。時定数 RC で減衰する“尾”=記憶。橙=一定入力を入れ続けたときの充電カーブ ── これは「過去の返事を足し続けた」結果(畳み込み)で出てくる。

ためしに一定の入力 x(t)=Xx(t)=X を入れて、過去について足し合わせる(畳み込む)と、

y(t)=0tX1RCe(tτ)/RCdτ=X(1et/RC)y(t) = \int_0^{t} X\cdot\frac{1}{RC}\,e^{-(t-\tau)/RC}\,d\tau = X\bigl(1 - e^{-t/RC}\bigr)

あの見慣れた 充電カーブ が出てくる。これは「過去の入力 × まだ残っている応答」を足した、畳み込みそのもの。y=kxy=k\,x では、この“じわっと立ち上がる”形は絶対に出ない。

tools/rc-impulse全画面で開く ↗

例2:部屋の残響

手をパンと叩くと、直接音のあとに、壁で反射した音が遅れて届き、それがまた反射して…と、だんだん小さくなりながら続く。応答は「減衰するこだまの列」:

h(t)=δ(t)+aδ(tT)+a2δ(t2T)+(0<a<1)h(t) = \delta(t) + a\,\delta(t-T) + a^2\,\delta(t-2T) + \cdots\qquad(0<a<1)

時間 → δ a·δ a²·δ a³·δ a⁴·δ … 0T2T3T4T ⟵ T ⟶ 遅れ T ごとに a 倍ずつ減衰
残響=最初の叩き(緑の δ)のあと、遅れ T ごとに a 倍ずつ小さくなるこだまが並んだもの。この“こだまの列”がインパルス応答 h。これを入力と畳み込むと、原音+遅れて小さくなったコピーの和になる。

δ\delta は“一発の叩き”そのもの=無限に細いスパイク。TT は反射1回ぶんの遅れ、aa は1回ごとの減衰。)これを入力 xx と畳み込んでみよう。鍵は、デルタの ふるい分け(sifting) ── δ\delta と畳み込むことは、ただ「そのぶん時間をずらす」ことに等しい:

x(τ)δ((tnT)τ)dτ=x(tnT)\int x(\tau)\,\delta\big((t-nT)-\tau\big)\,d\tau = x(t-nT)

(積分は τ=tnT\tau=t-nT の一点だけを“拾い出す”からだ。)あとは項ごとにこれを当てるだけ:

y(t)=x(τ)h(tτ)dτ=x(τ)[δ(tτ)+aδ(tτT)+a2δ(tτ2T)+]dτ=x(t)+ax(tT)+a2x(t2T)+\begin{aligned} y(t) &= \int x(\tau)\,h(t-\tau)\,d\tau \\ &= \int x(\tau)\big[\delta(t-\tau) + a\,\delta(t-\tau-T) + a^2\,\delta(t-\tau-2T)+\cdots\big]\,d\tau \\ &= x(t) + a\,x(t-T) + a^2\,x(t-2T) + \cdots \end{aligned}

つまり 原音 + 遅れて小さくなったコピーの足し算。部屋が音にこだまを重ねていく、その操作の正体が畳み込みなんだ。畳み込みの本質は、まさにここにある ── 過去に入れた一つひとつに、いまもまだ残っている応答を掛けて、足し合わせる。離散の和でも、なめらかな積分でも、やっているのは同じ『過去の返事を足す』だよ。

tools/echo-comb全画面で開く ↗

この「尾を引く=記憶」が肝だ。記憶があると、いまの出力は いまの入力だけ では決まらない。少し前に叩いたぶん、もっと前に叩いたぶんの “まだ残っている返事” が、いまも効いている。だから y(t)y(t) は、過去のすべての叩きの「いまだ残っているぶん」を足し合わせたものになる ── ただの比例じゃ済まず、積分 になるのは、これが理由だ。

ここで τ\tau は「過去のいつ叩いたか」、h(tτ)h(t-\tau) は「その叩き(時刻 τ\tau)が、いま(時刻 tt)でも“齢 tτt-\tau”としてどれだけ残っているか」を表す。τ\tau を過去ぜんぶ走らせて足す ── それが、次の畳み込みだ。

(逆に、hh が叩いた瞬間だけで消える=記憶ゼロのシステムなら、過去は効かず、本当に y(t)=kx(t)y(t)=k\,x(t) で済む。それは畳み込みの“いちばん簡単な特別な場合” ── hh が一点に尖ったスパイクのとき、だよ。)

どんな入力も、応答の足し算

ひとつ前提を置く。同じ叩き方をすれば、いつ叩いても同じ形の返事が返ってくる システム(これを 時間不変 という)を考える。叩く時刻が違っても、返事の形は同じ ── ただ位置がずれるだけ。だから「τ\tau の時刻に叩いた返事」は、基準の応答 hh をそのまま τ\tau だけずらした h(tτ)h(t-\tau) で書ける。

複雑な入力は、たくさんの小さなインパルスの列 だと思える。各瞬間に、その時の強さだけ突いている、と。

ここで使うのは「各インパルスの返事を、ただ足せばいい」という一手だ。各インパルスが、自分の強さ倍した hh のコピーを、自分のタイミングに置く。それを全部足したものが、出力 ── そう思える。(この“足せる”がいつ成り立つのか、その条件は最後にちゃんと詰めるよ。)

① 入力 = インパルス(一発の叩き)の列。高さ=強さ。 ② 各インパルスが、応答 h のコピーを その強さ倍・その位置に置く。 ③ 全部足すと、出力。これが「畳み込み」。
どんな入力も「一発の応答 h」を強さ倍して並べ、足し合わせれば出力になる。これが重ね合わせ=畳み込み。

これを式にしてみよう。まず入力を、幅 Δτ\Delta\tau の細い短冊に刻む。ここでひとつ引っかかりやすいのは、「なぜ高さ x(τ)x(\tau) だけでなく Δτ\Delta\tau も掛けるの?」という所。インパルスの“強さ”は、高さそのものじゃなくて、その一瞬でどれだけ入れたか、つまり面積 だからだ。だから時刻 τ\tau の短冊は、高さ x(τ)x(\tau) に幅 Δτ\Delta\tau を掛けた 強さ x(τ)Δτx(\tau)\,\Delta\tau のインパルス1本 とみなせる。

その1本が作る返事は、応答 hh をその強さ倍して、τ\tau だけ遅れて始める:

x(τ)Δτh(tτ)x(\tau)\,\Delta\tau \cdot h(t-\tau)

h(tτ)h(t-\tau) の「tτt-\tau」は、τ\tau に始まった返事を、観測時刻 tt では“齢 tτt-\tau”の所で見ている、という意味だよ。たとえば、2秒の所で叩いた返事を5秒の時点で見るなら、叩いてから3秒たっている ── だから読むのは h(3)h(3)。これを文字で書くと h(tτ)h(t-\tau) になる(叩いてから経った時間ぶん、応答カーブの先を読んでいる、というだけ)。

時間 → τ に叩く 返事 h(τから始まる) ここを読む=h(t−τ) t に観測 齢 t−τ(叩いてから経った時間)
τ に叩いた返事 h は、観測時刻 t では“齢 t−τ”の所まで進んでいる。だから読むのは h(t−τ)。「t−τ」は、叩いてから経った時間そのものだよ。

「足せばいい」なら、出力はすべての短冊の返事の和だ:

y(t)    τx(τ)h(tτ)Δτy(t) \;\approx\; \sum_{\tau} x(\tau)\,h(t-\tau)\,\Delta\tau

刻みを細かくすると、とびとびの和がなめらかな積分になる
短冊(とびとびの和 Σ)を、刻みを細かくしていくと ── なめらかな積分 ∫ になる。

あとは短冊を無限に細くする(Δτ0\Delta\tau \to 0)。和はなめらかな積分に化けて、

y(t)=x(τ)h(tτ)dτy(t) = \int x(\tau)\,h(t-\tau)\,d\tau

この式、新しいことは何ひとつ言っていない。 中身は、ずっと『応答 hh を、強さ倍して、ずらして、足す』のまま ── それを記号に翻訳しただけだ。\int は、その“細かい足し算”の印。これが 畳み込み(コンボリューション)。突然わいてきた式じゃなくて、鎖を波動方程式にした ときと同じ「細かく刻んだ和 → 積分」の手なんだよ。

ここで、少し見方が変わる。さっきまでは「各時刻 τ\tau に置いた返事 h(tτ)h(t-\tau) を、τ\tau について足す」と見ていた。いっぽう、観測時刻 tt のほうを固定して τ\tau を動かすと、h(tτ)h(t-\tau)τ\tau に対して 左右反転した形 に見える。だから教科書では「hh を反転して滑らせる」と言う ── 同じ式を、別の向きから眺めているだけなんだ。

結局やっていることは、hh を反転して、入力の上を滑らせ、重なりを掛けて足す、これだけ。下の「畳み込みスライダ」で、その「滑らせて足す」を手で動かせる。画像なら、小さなカーネル(=2次元の hh)を写真の上で滑らせる『畳み込みを一歩ずつ』も、まったく同じことだよ。

▶ 畳み込みスライダを触る ↗ 画像の畳み込みを一歩ずつ ↗

もうひとつの足し算 ── フーリエ

さっきのインパルスは、複雑な入力を 「時間の一点」ごと に分けて足す方法だった。じつは線形システムには、もうひとつ“相性のいい”分け方がある ── 「振動数ごと」 に分ける、サインの波 だ。どちらも、複雑なものを単純な部品に分けて、あとで足し戻す ── 同じ作戦の、ものさし違いなんだ。

なぜサインなのか。時間で性質が変わらない線形システム(叩く時刻によらず同じ振る舞いをする = さっきの“線形かつ時間不変”)にサインを1本入れると、定常状態では、出てくるのも同じ振動数のサイン(大きさと位相が変わるだけ)。形も振動数も変わらない。サインは、こういうシステムを“素通り”できる特別な形なんだ。

「時間で性質が変わらないシステムなんて、あるの?」と身構えるかもしれないけれど、身近なものは、たいていそうだ ── ギターの弦は、いつ弾いても同じ高さで鳴る。RCフィルタも、部屋の響きも、スピーカーも、朝でも夜でも同じ振る舞いをする。そこに純音(1本のサイン)を入れると、返ってくるのは、大きさや位相こそ変われ 同じ高さのサイン だ。ラの音を入れたのにドが返ってくる楽器なんて、ない。むしろ逆に、入れた音の振動数そのものを変えてしまうもの(歪ませたギターアンプ、無線の周波数逓倍器)のほうが特殊で珍しい ── それらは線形でないか、時間不変でないかの、どちらかなんだ。「振動数が変わらない」は、当たり前すぎて気づかないけれど、サインを主役に押し上げている当の性質だよ。

だから入力を サインの足し算 に分けておくと、システムの仕事は『各サインを、決まった倍率で大きく/小さくするだけ』になって、これ以上ないほど簡単になる。波・回路・場のいたる所にフーリエが顔を出すのは、これが理由だよ。

そして嬉しいことに、かなり広い範囲の形は、いろいろな振動数のサインを足し合わせれば作れる。── では、何のためにサインへ分けるのか。さっきの一手があるからだ:システムは各サインを、決まった倍率で変えるだけ。だから入力をサインに分けておけば、出力は「各振動数を、決まったゲインで強めたり弱めたりした」結果として、すぐ書ける。手強い畳み込みが、振動数ごとの 掛け算 に化けるんだ。

これは実用そのものだ。オーディオの イコライザ(トーンコントロール)は、低音・高音のサインを選んで持ち上げ/削っている。フィルタが「ある周波数を通し、別を遮る」のも、各サインに違う倍率を掛けているだけ。共鳴 は、システムが自分の得意な振動数のサインだけを大きく返す現象だ。どれも「サインに分ける → 振動数ごとに倍率をかける → 足し戻す」で見通せる。『Fourier スケッチブック』に好きな形を描くと、それが回る円(=サイン)の重ね合わせに組み立て直されていくのが見える。点(インパルス)で足すか、サインで足すか ── ものさし(基底)が違うだけで、やることは同じ「単純な部品に分けて、ひとつずつ解いて、足し戻す」。ただ、線形システムにとっては、サインの方が“仕事が楽”な分け方なんだ。

▶ Fourier スケッチブックで描く ↗

(この「各サインがただ倍率を受ける」を畳み込みの言葉で言い直すと、“畳み込み=ただの掛け算”になる。なぜそんなに綺麗になるのかは、信号の回にとっておくよ。)

なぜ足し算でいいのか

ここまで「足せばいい」を、当たり前のように使ってきた。最後に、その“足せる”の正体に触れておきたい。

うっかり「足せるのは線形だから。線形とは足せること」と言うと、ただの堂々巡りになる。だから、足し算を持ち出さずに言い直そう。あるシステムが、次の 2つの振る舞い を持つとき、それを 線形 と呼ぶ:

この2つは、口で言うだけでなく 実際に試せる。たとえばアンプ ── 入力電圧を2倍にして、出力もきっかり2倍になるか(歪み始めるまでは、なる)。あるいは2つの純音を同時に鳴らして、聞こえるのはその2音だけか、それとも元になかった“濁った”音が湧くか。前者なら比例と独立が生きている=線形、後者なら線形が破れている印だ。そして、この2つが成り立つとき “だけ”、複雑な入力を部品に分けて足し戻す、というあの手が使える。つまり「足し算でいい」は線形の言い換えじゃなくて、比例と独立という、確かめられる2つの事実から出てくる帰結 なんだ。

(もうひとつ。h(tτ)h(t-\tau) と“ずらして”書けたのは、この節のはじめに置いた 時間不変(いつ叩いても同じ形の返事)のおかげだ。正確に言うと、畳み込みでぜんぶ表せるのは、線形で、かつ時間不変 なシステム。この2つが揃って初めて、あの手が回る。)

そして、この2つが破れる世界もある。非線形 ── 大波が崩れる所、歪むほど鳴らしたスピーカー、乱流。そこでは2つの波が混ざって、元になかった新しい振動数が生まれたり、足し算があっさり壊れたりする。1と2を一緒に入れても、返事は「1の返事 + 2の返事」にならない。

だから「足し算でいい」は、世界からの 贈り物 みたいなものだ。波や場が、こんなに素直に分解して足せるのは、その多くが(少なくとも小さく叩くうちは)比例と独立を守る = 線形だから。

そして、足し算が効くということは ── たった一発の応答 hh さえ知れば、そのシステムの“ぜんぶ”が分かる、ということでもある。スピーカーのインパルス応答を測れば、どんな曲をどう鳴らすか予測できる。建物の揺れの応答が分かれば、どんな地震波で共振するかが読める。実際に録った部屋の hh を音に畳み込めば、その部屋の残響を“着せ替え”できる(畳み込みリバーブ)。レーダーやソナーは、送った一発のエコー= hh を読んで、相手の形や距離を当てている。一発の返事が、未来ぜんぶの台本になる ── これが重ね合わせの底力だよ。次は、この考えを「場」に持ち込む。空っぽの空間に、源をひとつ置いたときの“返事”を覚えて、それをたくさん足し合わせる ── やることは、今日とまったく同じだ。ただ、その足し算の向こうに、自然界をいちばん深く貫く骨(保存)が見えてくる。