JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

卷積:系統如何重塑訊號

在第二階你學到,一段短短的測試訊號——[[ee-impulse-response|脈衝響應]]——就能完整地為一個 [[ee-lti-system|LTI 系統]]建立指紋。這一階要把它兌現。卷積就是那唯一的運算:拿任何輸入訊號,配上那一道指紋,就能精準告訴你輸出是什麼。學通「翻轉—平移—相乘—求和」這套配方,你會明白為什麼 **y = x ∗ h** 是地球上每一個線性非時變系統的輸入—輸出定律——從峽谷裡的回音,到照片裡的模糊。

用脈衝拼出任何訊號

想像你想知道一座音樂廳會如何回應一整首交響曲。這聽起來複雜得不可能——數百萬個相互重疊的音符。但在第二階你發現了一條捷徑:拍一次手(一個脈衝),錄下殘響。那一段錄音,也就是脈衝響應 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}(一個雙抽頭的滑動加法器)做卷積。

  1. 翻轉。 把 h 在時間上反轉,得到 h[−k] = {…, 1, 1},由右往左讀。這串翻轉後的數列,就是你要在 x 上滑動的東西。
  2. 平移。 要算輸出取樣 y[n],就把翻轉後的 h 滑到它的參考點落在位置 n 上。每一個輸出取樣,都是這場滑動的一張快照。
  3. 相乘。 凡是翻轉、平移後的 h 與 x 重疊之處,就把重疊的值一對一對相乘。
  4. 求和。 把那些乘積加成單一個數字 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,2,3} ∗ {1,1} 的完整徒手卷積。「翻轉—平移」觀點與「平移—縮放—相加」觀點得到相同答案,理應如此。

連續時間的圖解範例

在連續時間裡,同一套配方變成一幅「滑動—重疊—面積」的圖像,而一個範例勝過一百條公式:把一個 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),尖銳的邊緣被柔化。

盯著那個三角形看,你就抓到了卷積所能給的最深直覺:卷積會平滑、會攤開。輸入裡尖銳的角被磨圓;輸出比任一個輸入都更寬(底寬 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。這就是工程師為何如此執著於頻率響應:它把系統最棘手的那一個運算,變成了小學算術。