我們以乙個例子來看這個問題:
附線性卷積**:
n=-5:1:50;
n=56;
x=uct(n)-uct(n-10);
h=0.9.^n.*uct(n);
[y,yn]=conv_m(x,n,h,n);
figure(1);
stem(yn,y);
其中圓周卷積是用的我定義好的函式:circonv
function [y,ny]=circonv(xa,na,xb,nb,n)
y=ones(1,n);
x1=ones(1,n);
x2=ones(1,n);
ny=min(na)+min(nb):min(na)+min(nb)+n-1
for i=1:n
if(i<=length(xa))
x1(i)=xa(i);
else
x1(i)=0;
endend
for i=1:n
if(i<=length(xb))
x2(i)=xb(i);
else
x2(i)=0;
endend
for i=1:n
y(i)=0;
for j=1:n
if j<=i
y(i)=y(i)+x1(j)*x2(i+1-j);
else
y(i)=y(i)+x1(j)*x2(n+i+1-j);
endend
end附n點圓周卷積**:
[y1,ny1]=circonv(x,n,h,n,n);
figure(2);
stem(ny1,y1);
其實正常來講,我們計算的圓周卷積都是從0開始的序列,比如(0~n1和0~n2的兩個序列圓周卷積),而上面這一題則要考慮起始點不為0的情況。
所以這樣我們就要考慮基底(na和nb分別相當於x1和x2的自變數)的位置了,如果不考慮基底(即定義函式為function [y,ny]=circonv(xa,xb,n))會導致算得的圓周卷積出現錯位,即不是從0開始的。
上圖為正常的線性卷積後的圖,而下圖是不考慮起始點從-5開始的圓周卷積的圖,可以發現第二個圖是從10開始才有值。
所以做圓周卷積時要考慮起始點的位置,以及我定義的函式是否對所有的情況都滿足這裡我用了一種很巧妙的方法:ny=min(na)+min(nb):min(na)+min(nb)+n-1
就是直接人為的定義了y的基底ny,導致上面10的偏移量被消除了。
————————————————————————————————————————
但是還有一點問題,就是我直接用fft做也會出現10的偏移量,這一點的懷疑是matlab自己定義fft函式的時候是不是不能完全匹配求卷積。
附fft**:
(10的偏移量如圖)
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...
線性卷積與圓周卷積的計算方法
現在很多任務具裡都已經為我們實現好了線性卷積和圓周卷積的函式,所以在實現方面簡單呼叫一下即可。如matlab中,conv用於計算線性卷積,而cconv用來計算圓周卷積 在國內搜了很多計算圓周卷積的例子,居然鮮有人提到cconv函式,而都是人云亦云都抄襲一套自實現函式,真是有點意想不到。下面直接上乾貨...
關於卷積和池化
我們可以看到,卷積過程其實還是基於乙個固定的矩陣,在另外乙個矩陣不斷一格一格掃過去的到的數值的和,產生的乙個新的矩陣,我們以作為比較會發現 粉紅色矩陣和綠色矩陣在根本上有很大不一樣,卷積之後的維數降低了.所以規律可以得到 粉紅色最後的卷積結果矩陣維度 綠色矩陣維數 橙色矩陣維數 1 多通道資料的卷積...