設h(n)和x(n)都是有限長序列,長度分別為n和m。它們的線性卷積和迴圈卷積分別表示如下: yc
(n)=
h(n)
∗x(n
)=∑m
=0n−
1h(m
)x(n
−m)
yl(n
)=h(
n)ⓛx
(n)=
[∑m=
0l−1
h(m)
x((n
−m))
l]rl
(n)
其中 l≥m
ax[n
,m] ,
x((n
))l=
∑∞i=
−∞x(
n+il
) 只有當迴圈卷積長度l≥
n+m−
1 時,線性卷積等於迴圈卷積 即 y
c(n)
=[∑i
=−∞∞
yl(n
+il)
]rl(
n)否則時域混疊
所謂重疊保留法,就是對輸入序列進行分段 (設長度為m),但相鄰兩段必須重疊v個點,然後計算各段與h(n) (設長度為n) 的l(l≥m)點迴圈卷積,得到輸出序列ym
(n) ,m表示第m段的迴圈卷積計算輸出。最後,從ym
(n) 中選取b個樣值順序連線得到y(
n)。
其中v=n-1,b=m-v=m-n+1,b應取ym
(n) 中第v+1 ~v+b共計b個樣值,若記n=0,1,……,m-1,則b的取值為n=n-1,n,……,m-1時的ym
(n) 的值。
由線性卷積的定義可以看出,當計算n=
n0時的線性卷積時,與x(
n0) 及其前n-1個值有關。所以計算h(
n)∗x
m(n)
時,結果(共n+m-1個數值)的前n-1個值與後n-1個值是有誤的,只有中間的m-n-1個值是正確的,即是應當選取的b個樣值。因為計算h(
n)∗x
m(n)
時,n<0及n>m-1時認為xm
(n)=
0 ,而實際xm
(n) 的前面xm
−1(n
) 與後面xm
+1(n
) 是不一定為零的。故對輸入序列進行分段時,相鄰兩段必須重疊v個點,有誤點的卷積值要再次計算。
實際中計算機計算迴圈卷積要快於線性卷積,當l=m時,ym
(n)=
h(n)
ⓛxm(
n),yml
(n)=
h(n)
∗xm(
n),由線性卷積與迴圈卷積的關係式可以看出ym
l(n)
在做以l為週期的延拓時相鄰兩次延拓重疊了n-1個點,即l點迴圈卷積的結果(長度為m)與線性卷積結果(長度為n+m-1,取前m項比較)相比,前n-1個值有誤(混疊),後m-(n-1)個值相等。恰好與實際相比ym
l(n)
結果的前n-1項也是有誤的(見上一段分析),故迴圈卷積與直接計算線性卷積的分析結果一致,都捨去前n-1個值而保留接下來的m-(n-1)個值。
當取l>m時,ym
l(n)
在做以l為週期的延拓時相鄰兩次延拓重疊小於n-1個點,但由於受限仍然應捨去前n-1個值而保留接下來的m-(n-1)個值。原因見直接計算線性卷積的分析。
ⓛ:代表l點迴圈卷積
*:代表線性卷積
線性卷積與圓周卷積的計算方法
現在很多任務具裡都已經為我們實現好了線性卷積和圓周卷積的函式,所以在實現方面簡單呼叫一下即可。如matlab中,conv用於計算線性卷積,而cconv用來計算圓周卷積 在國內搜了很多計算圓周卷積的例子,居然鮮有人提到cconv函式,而都是人云亦云都抄襲一套自實現函式,真是有點意想不到。下面直接上乾貨...
訊號卷積(線性卷積)
從數學上講,卷積就是一種運算。定義函式 f,g 的卷積 f g t 如下 1.連續形式 f g t int f tau g t tau d tau 那這個怎麼理解呢?函式 g t 可以理解為衝擊響應,即乙個衝擊訊號經過乙個線性系統後產生的輸出函式,假設它的影象長成下面這個樣子 在 0 時刻輸入了乙個...
迴圈卷積與線性卷積
迴圈卷積 針對的是兩個長度都為n的序列,對兩個序列做fft,然後再做ifft得到的結果就是迴圈卷積,結果的長度也是n。直接計算步驟 序列a與序列b,長度都是n,新的序列c 1 把b倒過來。翻轉 2 把b向右平移乙個元素。最右側的元素補到左邊。3 計算此時a和b對應元素的積的和。將其加到c的末尾。4 ...