現在很多任務具裡都已經為我們實現好了線性卷積和圓周卷積的函式,所以在實現方面簡單呼叫一下即可。如matlab中,
conv
用於計算線性卷積,而cconv
用來計算圓周卷積
在國內搜了很多計算圓周卷積的例子,居然鮮有人提到cconv函式,而都是人云亦云都抄襲一套自實現函式,真是有點意想不到。
下面直接上乾貨,簡單介紹一下線性卷積和圓周卷積的計算方法
線性卷積的計算網上有很多,這裡就不一一介紹了。我個人使用的方式也很好理解,
例如x(n) =
h(n) =
可以通過將x(n)中的每個數字從左往右乘以h(n)
1| 2 4 6 1 3
5| 10 20 30 5 15
7| 14 28 42 7 21
..................
以此類推,如下圖示,乘積後的結果再錯位相加。得到的結果即為線性卷積結果。
介紹圓周卷積的方法真的比較少,大多講訴的都不易理解。我個人的計算方法是這樣的,參考鏈結可以看這裡。
首先,將h(n)根據x位數在尾部補零,即為 h(n) = .
第二步,將h翻摺,開始位移。
在位移一步時,剩下的位子,將尚未移動的部分填充。
第三步,填充後,對應的每一位相乘後再相加。
對應上面的結果就是
1*2+5*0+7*0+3*0+2*3+1*1+6*6+9*4 = 2+0+0+0+6+1+36+36=81
這個實際上就是圓周卷積的y[0]
後面重複上面的步驟,位移,填充,相乘相加,直到h位移結束
示例圖如下,
這裡可以看到,圓周卷積和線性卷積的結果不是完全一致的。相同部分我用綠色標註出來了。有乙個結論,關於圓周卷積和線性卷積。大家可以記一下
一般的,如果兩個有限長序列的長度為n1 和 n2,且滿足 n1>=n2 ,則圓周卷積的後這裡n1=8,n2=5,所以8-5+1=4個點後的結果一致。n1-n2+1個點,與線性卷積的結果一致。
那麼是不是必然這樣嗎?
如果n1>2*n2的話,這種方法的圓周卷積出來的結果是完全一致的。
下面是乙個例子,
上面資料一致性的討論(特別是完全一致時)是基於我在本文中的圓周卷積實現方法的前提下說的
matlab中的cconv函式計算出來的圓周卷積是和線性卷積一致的,並且它的結果是浮點型。效果如下,
C語言實現線性卷積和圓周卷積
已知x n 求x n x n x n x n x n x n include graphics.h include include include include 線性卷積 void conv int x,int y else if m 4 m 0 else y n 1 x m x s 圓周卷積 n...
迴圈卷積與線性卷積
迴圈卷積 針對的是兩個長度都為n的序列,對兩個序列做fft,然後再做ifft得到的結果就是迴圈卷積,結果的長度也是n。直接計算步驟 序列a與序列b,長度都是n,新的序列c 1 把b倒過來。翻轉 2 把b向右平移乙個元素。最右側的元素補到左邊。3 計算此時a和b對應元素的積的和。將其加到c的末尾。4 ...
迴圈卷積和線性卷積的關係
迴圈卷積和線性卷積的關係 一般訊號處理濾波器 時域資料 與 濾波器係數的線性卷積,但卷積的運算量比較大,所以用頻域的相乘來替代時域卷積,而頻域的相乘等於時域迴圈卷積,所以要有乙個迴圈卷積和線性卷積轉換的過程,如下matlab例子 x 3 2 1 2 5 y 7 1 8 5 1 n length x ...