本文關注數字信號的卷積、反捲積基本概念的理解與矩陣實現

卷積

LTI(線性時不變)系統常用卷積來表徵。卷積的定義為:

y[n] =x[n]*h[n]= sum_{k=-infty}^{infty}{x[k]h[n-k]}

這個描述加上公式,如同一記悶棍,直接把很多初學者打翻在地。類似的形式很多教材都在用,我當年深受其害。

下面提供一個思路來理清卷積與LTI的概念與關聯。

LTI (線性時不變系統)這個名字裏就包含了它的兩個關鍵概念。

線性

假設輸入1,輸出2。如果輸入3,那麼輸出就是6。輸入增加,輸出等比例增加,就是線性。

時不變

如果t=0時刻輸入x[0]=1,輸出y[0]=2。那麼t=1時刻輸入x[1]=1, 輸出y[1]=2。不同的時刻給以相同的輸入,系統會做出相同的反應,就是時不變。

卷積計算過程

通過一個例子來理解一下計算過程(自己用筆寫一下效果更好)。

假設一個系統的衝激響應(impulse response)是h[n]=[3, 2, 1]。(為了簡便使用整數)

意思是如果輸入x[0]=1,則輸出y[0]=3; y[1]=2; y[2]=1。(就是這麼拖泥帶水,如果每個輸入只產生一個輸出,就用不到卷積了)

如果給一串輸入會怎樣呢?例如x[n]=[2, 0, 1] ,過程是這樣的:

t=0: 輸入x[0]=2,輸出應為y[0]=6,(「線性」特點:輸入翻倍,輸出翻倍)

t=1: 輸入x[1]=0,無輸入,對應無輸出,但因為還殘留對x[0]的響應,所以輸出y[1]=4

t=2: 輸入x[2]=1,對應輸出y[2]=3,(「時不變」特點:無論何時輸入同樣的內容,會有同樣的響應),同時系統此時仍殘留對x[0]的響應為2,所以最終輸出y[2]=3+2=5.(再次應用「線性」特點)

t=3/t=4時刻,系統已沒有輸入,只有殘留的對x[2]的響應,所以輸出y[3]=2, y[4]=1.

所以結果是,x[n]=[2, 0, 1]輸入到衝激響應為h[n]=[3, 2, 1]的系統中,產生了輸出y[n]=[6, 4, 5, 2 ,1]。這個結果與應用卷積公式算得的結果是一樣的。

[2,0,1]*[3,2,1]=[6,4,5,2,1]

所以卷積並不是什麼神奇的操作,本質是一個時刻的輸入產生一串輸出,它下一時刻的輸出疊加(線性)到對下一時刻的輸入的響應(時不變)上了。或者換個說法是,當前時刻的輸出,除了對當前輸入的響應之外,還要加上之前輸入的影響。

反捲積

反捲積就是卷積的逆運算,已知輸出y[n]和衝激響應h[n],求輸入x[n]的過程,或者已知輸入輸出求衝激響應。過程不贅述。

卷積與反捲積的矩陣實現

根據前面所說的卷積計算概念,可以有以下兩種實現方法:

這兩種方法是等價的,對於複雜輸入和響應,這樣計算就太費勁了。而矩陣計算是自帶乘積求和屬性的,所以藉助計算機來用矩陣來計算卷積是非常方便的。

可以通過構造輸入矩陣或者響應矩陣來實現上面兩種計算方法:

y=Hx=egin{bmatrix} 3 & 0 & 0 \ 2 & 3 & 0 \ 1 & 2 & 3 \ 0&1&2\0&0&1end{bmatrix}egin{bmatrix} 2 \  0 \ 1end{bmatrix}=egin{bmatrix} 6 \ 4 \ 5 \ 2\1end{bmatrix}

y=hX=egin{bmatrix} 3 & 2 & 1end{bmatrix}egin{bmatrix} 2&0&1&0&0 \  0 &2&0&1&0\ 0&0&2&0&1end{bmatrix}=egin{bmatrix} 6 & 4 & 5 & 2&1end{bmatrix}

而對於反捲積,就是求逆運算

x=H^{-1}y

上面的例子不能直接逆運算,因為H不是方陣,沒有逆。但如果我們將t=3/t=4時刻的輸出去掉(因為這時輸入已經結束了)。

y=Hx=egin{bmatrix} 3 & 0 & 0 \ 2 & 3 & 0 \ 1 & 2 & 3end{bmatrix}egin{bmatrix} 2 \  0 \ 1end{bmatrix}=egin{bmatrix} 6 \ 4 \ 5 end{bmatrix}

逆運算直接用matlab或octave計算:

>> H

H =

3 0 0

2 3 0

1 2 3

>> y

y =

6

4

5

>> x=inv(H)*y

x =

2.00000

0.00000

1.00000

總結

這裡為了說明方便使用了離散的整數數值,理解了核心概念,就可以將卷積的理解帶入到連續信號、二維圖像等應用中去。


推薦閱讀:
相關文章