# 3.2 脈衝響應&卷積 ## DT卷積 我們需要一步一步推導出需要的式子。首先,我們要將事情變得複雜一點。考慮任何一個信號$x[n]$,我們都可以利用unit impulse將它改寫成: $$ x[n] = \sum_{k=-\infty}^{\infty} x[k]\delta[n-k] $$ 回憶一下,$\delta[n-k]$是一根在$n=k$處的柱子,我們給它賦予一個高度,是$x[n]$在此點的值。再將這些柱子加起來,就會得到原本一連串的$x[n]$。注意,**$x[k]$在此是一個常數**,僅有$\delta[n-k]$是信號。 看起來對事情沒什麼幫助。但如果我們考慮將這個信號送進一個LTI系統,有趣的事就發生了: 1. 輸出會等於這一連串的輸入相加(因為線性)。 2. $\delta[n-k]$的輸出會是$\delta[n]$的輸出,只不過有著$k$單位的延遲(因為時不變)。 我們定義: :::danger **脈衝響應** (Impulse Response) $h[n]$是一個系統$F$對$\delta[n]$的輸出。也就是: $$ h[n] \triangleq F\{\delta[n]\} $$ ::: 那麼,我們就可以得到: $$ F\{x[n]\}=F\{\sum_{k=-\infty}^{\infty} x[k]\delta[n-k]\}=\sum_{k=-\infty}^{\infty} x[k]\cdot F\{\delta[n-k]\}=\sum_{k=-\infty}^{\infty} x[k]h[n-k] $$ 注意到我們只需要知道一個系統會怎樣對待一個unit impulse,我們就可以透過一個很神奇的數學運算,得到它對**任意輸入信號**的輸出。我們定義這樣的運算叫做**卷積**(convolution)。 :::danger **DT卷積** $$ (f*g)[n] = \sum_{k=-\infty}^{\infty} f[k]g[n-k] $$ ::: ## CT卷積 我個人認為,對於CT卷積的推導除了複雜以外還沒什麼建設性,還不如直接目測出他的連續對應版。所以我直接說出答案: :::danger **脈衝響應** (Impulse Response) $h(t)$是一個系統$F$對$\delta(t)$的輸出。也就是: $$ h(t) \triangleq F\{\delta(t)\} $$ ::: :::danger **CT卷積** $$ (f*g)(t) = \int_{-\infty}^{\infty} f(\tau)g(t-\tau)\,d\tau $$ ::: ## 卷積的重要性質 最重要的性質就是我們剛剛推導的: **對於LTI系統而言,系統的輸出,等於輸入信號和其脈衝響應的卷積。** 寫成數學式子: :::danger $$ y=x*h $$ ::: 另外,我們看最一開始的式子,告訴我們: :::danger $$ x=x*\delta $$ ::: 下面的關係式應該也不難驗證: :::danger $$ \sum_{k=-\infty}^{n} f[k]=f*u $$$$ \int_{-\infty}^{t} x(\tau) d\tau=x*u $$ ::: **以上這三個性質是最重要的**,在後續的推導會用到。其餘的就是一些計算技巧。大多可以從定義出發直接推得,在這邊就略過證明。 1. 交換律: $f*g=g*f$ 2. 對加法分配律: $f*(g+h)=f*g+f*h$ 3. 對數乘結合律: $a(f*g)=(af)*g=f*(ag)$ 4. 結合律: $f*(g*h)=(f*g)*h$ 5. 微分/差分/偏微分: $(f*g)'=f'*g=f*g'$ 6. 複數共軛: $\overline{f*g}=\bar{f}*\bar{g}$ ## 卷積的視覺化 維基百科上的這張圖很好的解釋了卷積「看起來」是什麼樣子: 我們翻轉其中一個信號,然後左右滑動,看看它們相乘起來的積分是多少。 ![image](https://hackmd.io/_uploads/BJSkwhfAeg.png) 在需要手算的時候,可以畫圖輔助,會幫助很大。 ## 範例 這裡我們舉一個CT的例子。考慮: - $x(t)=t^2,\,(0\le t\le2)$ - $y(t)=3t+2,\,(0\le t\le3)$ 其他地方我們都假設為0。 接下來就是一頓計算。我們利用上面的圖,知道$y(t)$現在是被左右翻轉的,而$x(t)$是固定住的。我們慢慢增加$t$值來把$y$向右滑動。 在$0\le t\le 2$時,$x,y$並未完全重疊。而$y$只有$0\sim t$的部分有值。所以是$\int_{0}^t \tau^2(3(t-\tau)+2)\,d\tau$。 在$2\le t\le 3$時,$x,y$並完全重疊。滑動的$y$可以整個包住固定的$x$,所以是$\int_{0}^2 \tau^2(3(t-\tau)+2)\,d\tau$。 在$3\le t\le 5$時,$x,y$並未完全重疊。而$y$已經滑動到超出了$x$的範圍,因此只有$t\sim2$的部分有值。所以是$\int_{t}^2 \tau^2(3(t-\tau)+2)\,d\tau$。 其餘部分,因為$x,y$完全分離,是0。 完整的答案會是: $$ (x*y)(t) = $$ \begin{cases} \frac{1}{4}t^4 + \frac{2}{3}t^3, & 0 \le t \le 2, \\[6pt] 8t - \frac{20}{3}, & 2 < t \le 3, \\[6pt] 8t - \frac{20}{3} - t(t-3)^3 + \frac{3}{4}(t-3)^4 - \frac{2}{3}(t-3)^3, & 3 < t \le 5, \\[6pt] 0, & \text{otherwise.} \end{cases} 就這麼兩個簡單的函數,卷積完一樣是這坨醜到不行的東西。幸好在之後的課程裡面我們不太會這樣手算一堆卷積。取而代之的是我們要用一些技巧,簡化計算系統輸出的方式。畢竟這樣暴力解卷積一看就不是什麼好方法。 ## 其他卷積的例子 有很多我們已經習以為常的運算,其實都用到了卷積的概念。 ### 整數乘法 我們在小學二年級第一次學了卷積。考慮以下乘法: ``` 3 1 x) 2 5 ------- ``` 我們在做的其實是一個卷積: - 個位數: 5x1 - 十位數: 5x3 + 2x1 - 百位數: 2x3 所以其實我們可以把它想成$[3,1]*[2,5]$: - $(x*y)[0] = x[0]y[0] = 3\times2$ - $(x*y)[1] = x[1]y[0]+x[0]y[1] = 1\times2+3\times5$ - $(x*y)[2] = x[1]y[1] = 1\times5$ ### 多項式的乘法 舉例來說,$(x^2+3x+5)(7x^3+6x+2)$,其實就是$[5,3,1]$和$[2,6,0,7]$的卷積。所以如果要問$x^3$的係數是多少? 答案就是這兩個卷積的$n=3$。也就是: $$ (x*y)[3] = x[0]y[3] + x[1]y[2] + x[2]y[1] + x[3]y[0] $$$$ = 5\times7+3\times0+1\times6+0\times2=41 $$ 貼心提醒,算這些用卷積不會比較快。我也強烈不推薦你先教小學生卷積再教他們二位數乘法。我只是點出卷積的一些例子。