1. 程式人生 > >線性卷積與圓周卷積

線性卷積與圓周卷積

1.圓周卷積(circular convolution)

圓周卷積,也叫迴圈卷積,兩個長度為N的有限場序列x(n)h(n)的迴圈卷積定義為


即迴圈卷積相當於週期延拓後的序列x~(n)h~(n)做週期卷積後再取主值區間,若x(n)和h(n)的離散傅立葉變換為X(K)H(K),則有


時域中的迴圈卷積對應於其離散傅立葉變換的乘積,迴圈卷積的結果y(n)長度為N
關於圓周卷積的計算,可以看另一篇的圖解計算

2.線性卷積(linear convolution)

  通常所說的卷積就是指線性卷積,設x(n)、h(n)長度分別為M和N,則它們的線性卷積結果為


得到的y(n)長度為M+N-1,同樣,根據卷積定理可以知道,時域卷積等於頻域相乘

 

 

注意,現在只是頻域DTFT相乘相等,而離散傅立葉變換相乘並不相等,DFT是在DTFT基礎上再進行了頻域取樣,即對ω 離散化。
  要讓線性卷積的時域結果與頻域相乘的逆變換相等,首先容易想到的就是對H(ω )和X(ω)做相同的頻域取樣,也就是對x(n)、h(n)做相同點數的DFT,即讓兩序列在時域做圓周卷積,那麼現在問題是,做多少點數的DFT能讓圓周卷積等於線性卷積呢?
  
  線性卷積最常見,直接套用公式計算,這裡就不圖解。
  
結論:利用迴圈卷積計算線性卷積的條件為迴圈卷積長度

LM+N1
利用迴圈卷積計算線性卷積的具體步驟為:

  1. 將序列x(n)h(n)補零延長,使其長度LN1=N+M1,若採用基-2 FFT,還應使L為不小於N1的2的最小整數次冪;
  
  2. 做x(n)h(n)的長度為L的FFT得到X(k)H(k),並求它們的積Y(k)=X(k)H(k);
  
  3. 求Y(k)的iFFT並取前N1點,獲得線性卷積的結果y(n)=IFFT[Y(k)],0

nN1

  說的好像很簡單的樣子,那就用程式碼驗證下
  

x1 = [1,7,8,9,5,4,6,3,2];
x2 = [5,8,9,6,3,4,8,2,1,7,5,6,7];
conv(x1,x2)
L = 21;
ifft(fft(x1,L).*fft(x2,L))

上面程式中x1的長度為9,x2的長度為13,用matlab的conv函式直接計算出時域線性卷積,然後我們再驗證下頻域相乘,改變L值使分別L=13、21、23看看,與conv的結果對比,可以驗證,只有當L>=9+13時才會得到與conv一樣的結果。

  那為什麼要講線性卷積轉化為迴圈卷積呢,那是因為時域中的迴圈卷積對應於其離散傅立葉變換的乘積,在兩個卷積項非常長且長度相差不大時,轉換到頻域利用FFT計算量會大大減小。
  當兩個卷積項長度相差很大時,又該怎麼辦呢,這又引出了下一個問題,重疊相加法與重疊保留法