用脈衝拼出任何訊號
想像你想知道一座音樂廳會如何回應一整首交響曲。這聽起來複雜得不可能——數百萬個相互重疊的音符。但在第二階你發現了一條捷徑:拍一次手(一個脈衝),錄下殘響。那一段錄音,也就是脈衝響應 h,捕捉了這個房間所做的一切。這一階的承諾令人屏息:只要你知道房間如何回應「一次」拍手,你就知道它如何回應「任何」聲音。連接這兩者的橋樑就是卷積,而第一步,是一個把每個訊號都看成一群脈衝的把戲。
從離散時間開始,因為它最乾淨。取任何一個訊號 x[n]——一串數字,每個時間步一個。看其中某一個值,比方說 n = 4 處的值。你可以把它孤立成一個被高度 x[4] 縮放的單一脈衝 δ[n−4]。對每一個取樣點都這麼做,再把它們全部加回去,你就一模一樣地重建出原訊號。什麼都沒丟;你只是把 x[n] 改寫成了一堆被平移、被縮放的脈衝之和。這就是整個基礎,一行寫完:x[n] = Σ x[k]·δ[n−k],對每一個 k 求和。
Decomposing x[n] = {2, 3, 1} (samples at n = 0, 1, 2)
x[n] 2·delta[n-0] 3·delta[n-1] 1·delta[n-2]
| 3 |
3| o = | + | 3 +
2|o | 2 | | 1
1| | o 2 | | | 1
0+--+--+-- ---+---- ----+---- -----+---
0 1 2 0 1 2
one signal = a sum of three shifted, scaled impulses疊加原理給出卷積
現在把那個被分解的訊號餵進 LTI 系統,讓那兩個神奇的性質替你幹活。先盯著一個脈衝看。根據定義,系統對 δ[n] 的回答就是脈衝響應 h[n]。根據非時變性,它對一個「平移後」脈衝 δ[n−k] 的回答,就是「同一道」響應的平移:h[n−k]。根據齊次性,把輸入用 x[k] 縮放,輸出也用 x[k] 縮放:x[k]·δ[n−k] 這一項,產生 x[k]·h[n−k]。
輸入是所有那些脈衝項的「和」,所以由疊加原理,輸出就是所有那些響應的「和」。對每一個 k 加總,你就抵達了——沒有任何信仰的跳躍,只是老老實實地用了 L 與 TI——卷積和:y[n] = Σ x[k]·h[n−k]。我們把它寫成 y = x ∗ h。這不是眾多公式裡的其中一條;它「就是」每一個 LTI 系統完整的輸入—輸出關係。把 x 與 h 交給我,y 就被完全確定了。
x[n] ----> [ LTI system, fingerprint = h[n] ] ----> y[n]
the only thing this box can do is:
y[n] = SUM over k of x[k] * h[n-k]
= x[n] * h[n]
Continuous-time twin (the integral version):
y(t) = INTEGRAL x(tau) * h(t - tau) d tau
= x(t) * h(t)翻轉—平移—相乘—求和:實作一遍
盯緊 h[n−k] 裡的指標。當 k 往前跑,引數 n−k 卻往「後」跑——脈衝響應在時間上以翻轉的姿態出現,再平移去對齊取樣點 n。這就給出了那套著名的四步機械配方。我們徒手磨一個小例子,讓它不再只是符號:把 x = {1, 2, 3}(位在 n = 0,1,2)與 h = {1, 1}(一個雙抽頭的滑動加法器)做卷積。
- 翻轉。 把 h 在時間上反轉,得到 h[−k] = {…, 1, 1},由右往左讀。這串翻轉後的數列,就是你要在 x 上滑動的東西。
- 平移。 要算輸出取樣 y[n],就把翻轉後的 h 滑到它的參考點落在位置 n 上。每一個輸出取樣,都是這場滑動的一張快照。
- 相乘。 凡是翻轉、平移後的 h 與 x 重疊之處,就把重疊的值一對一對相乘。
- 求和。 把那些乘積加成單一個數字 y[n]。滑動一步,再為下一個輸出取樣重複一遍。
x = {1, 2, 3} h = {1, 1} y = x * h (length 3+2-1 = 4)
n=0: x: 1 2 3
flip h: 1 1 -> overlap (1*1) = 1 => y[0]=1
n=1: x: 1 2 3
flip h: 1 1 -> (1*1)+(2*1) = 3 => y[1]=3
n=2: x: 1 2 3
flip h: 1 1 -> (2*1)+(3*1) = 5 => y[2]=5
n=3: x: 1 2 3
flip h: 1 1 -> (3*1) = 3 => y[3]=3
y = {1, 3, 5, 3}
Quick check by overlap-add (no flipping):
1*{1,1} = {1,1}
2*{1,1} = {2,2}
3*{1,1} = {3,3}
----------------------
sum = {1,3,5,3} <- same answer, shift-scale-add view連續時間的圖解範例
在連續時間裡,同一套配方變成一幅「滑動—重疊—面積」的圖像,而一個範例勝過一百條公式:把一個 1 秒的矩形脈衝跟它自己做卷積。從物理上想——你讓一個系統開啟一秒(輸入脈衝 x),而系統自己的脈衝響應 h 恰好也是一個 1 秒的矩形(它會「保持」一秒)。當你把翻轉後的 h 滑過 x,輸出 y(t) 就是那不斷變化的重疊面積。
x(t): rect, 1 wide, height 1 h(t): rect, 1 wide, height 1
Slide flipped h across x; y(t) = area of overlap:
t<0 no overlap yet y = 0
t=0 edges just touch y = 0
0<t<1 overlap GROWS linearly y = t (ramp up)
t=1 full overlap, area = 1 y = 1 (peak)
1<t<2 overlap SHRINKS linearly y = 2 - t (ramp down)
t=2 edges part y = 0
y(t)
1 | /\
| / \
| / \
| / \
0 |______/________\________ t
0 1 2
rect * rect = TRIANGLE (1 wide -> 2 wide, half as tall... no:
peak 1, base 2 — wider AND smoother)盯著那個三角形看,你就抓到了卷積所能給的最深直覺:卷積會平滑、會攤開。輸入裡尖銳的角被磨圓;輸出比任一個輸入都更寬(底寬 2,正如離散情形裡的 M+N−1)。把 x 換成一段真實的音訊波形、把 h 換成一個房間的脈衝響應,這同一套「重疊再相加」,就字面意義上是殘響的計算方式。把它們換成一排影像像素與一個小小的鼓包形 h,這完全相同的運算,就是你照片編輯器裡的模糊。
從脈衝到步階,以及頻率的一瞥
卷積立刻解釋了一個你或許在第二階遇過的關係:步階響應就是脈衝響應與單位步階的卷積。單位步階 u[n] 不過是一串在 n = 0 開啟的 1。把 h 與那串 1 卷積,意味著在每一個輸出取樣,把 h 到那一點為止的所有值加起來——與步階的卷積,就是脈衝響應的累進累加。所以步階響應,就是 h 的累進和(在連續時間裡,是累進積分)。對步階響應做差分,又能把 h 還原回來。它們是同一道指紋的兩種觀看方式。
h[n] = {1, 1, 1} (a 3-tap averager, unscaled)
u[n] = {1, 1, 1, 1, ...} (unit step)
step response s[n] = h * u = running sum of h:
s[0] = 1
s[1] = 1+1 = 2
s[2] = 1+1+1 = 3
s[3] = 1+1+1 = 3 (h has run out; sum stays flat)
s[4] = 3 ... -> settles at the DC gain = sum(h) = 3
And to recover h: difference the step response
h[n] = s[n] - s[n-1] = {1, 1, 1} <- back to the fingerprint還有最後一份禮物,而它正是後續各階的頭條。時域裡的卷積誠實卻費力——翻轉、平移、相乘、求和,每一個輸出取樣都來一遍。令人驚奇的事實是:這套雜亂的時域苦工,到了頻域竟變成單純的乘法。把一個純正弦波餵進 LTI 系統,出來的是同頻率的正弦波,只是被重新縮放並延遲;把所有頻率上的那些縮放列成一張表,就是頻率響應 H,也就是 h 的傅立葉變換。於是時域裡的 y = x ∗ h,到了頻域就是 Y = X·H。這就是工程師為何如此執著於頻率響應:它把系統最棘手的那一個運算,變成了小學算術。