MATLAB卷積運算(conv)以及通用的卷積函式my_conv的實現
阿新 • • 發佈:2018-12-09
conv(向量卷積運算)
兩個向量卷積,簡單理解其實就是多項式乘法。 比如:p=[1 2 3],q=[1 1]是兩個向量,p和q的卷積計算方法如下: 把p的元素作為一個多項式的係數,多項式按升冪(或降冪)排列,比如就按升冪吧,寫出對應的多項式:1+2x+3x^2;同樣的,把q的元素也作為多項式的係數按升冪排列,寫出對應的多項式:1+x。
卷積就是“兩個多項式相乘取係數”。 (1+2x+3x^2)×(1+x)=1+3x+5x^2+3x^3 所以p和q卷積的結果就是[1 3 5 3]
注意:當確定是前一個序列用升冪或是降冪排列後,後一個序列也都要按這個方式排列,否則結果是不對的。
p = [1 2 3];q=[1 1]; conv(p,q)
ans =
1 3 5 3
當然MATLAB的卷積函式還有conv2(二維矩陣卷積運算)和convn(n維卷積運算),可以去參考文件瞭解
那麼這裡的問題是,當兩個序列不是從0開始時,必須對conv函式稍加擴充套件:
function [ y,ny ] = convu( h,nh,x,nx ) %CONVU 通用卷積函式 % function [ y,ny ] = convu( h,nh,x,nx ) % y為卷積結果向量,ny是y的位置向量,h和x是有限長序列 nys = nh(1)+nx(1); nyf = nh(end)+nx(end); y = conv(h,x); ny = nys:nyf; end
知道了conv的這些用法之後,我便好奇想conv的實現過程:接下來是不使用conv的卷積函式,解釋了 conv內部的計算過程:
function y = my_conv( x,h ) %MY_CONV 重寫MATLAB內建卷積函式conv() % function y = my_conv( x,h )用來計算y(n) = h(n)*x(n)的卷積 nx = length(x); nh = length(h); y = zeros(1,nx+nh-1); for index = 1:nx indexSum = x(index)*h; y(1,index:index+nh-1) = y(1,index:index+nh-1)+indexSum; end end
function [ y,ny ] = my_convu( x,nx,h,nh )
%MY_CONVU 通用的卷積函式(不使用conv()實現)
% function [ y,ny ] = my_convu( x,nx,h,nh )
% 用來計算y(n) = h(n)*x(n)的卷積
% % y為卷積結果向量,ny是y的位置向量,h和x是有限長序列
nys = nx(1)+nh(1);
nyf = nx(end)+nh(end);
y = my_conv(h,x);
ny = nys:nyf;
end
測試my_conv函式:
%% 2.計算兩個有限長序列的卷積
xn = [1 1 1 1 ];
hn = [1 1 1 1 ];
yn = my_conv(xn,hn);
%% 3.編寫通用卷積函式function [ y,ny ] = convu( h,nh,x,nx )
%如果h(n)=x(n)=R5(N+2),則計算y(n)=h(n)*x(n)的程式如下:
h = ones(1,5);nh = -2:2;
x = h;nx = nh;
[y,ny] = my_convu(h,nh,x,nx);
yn =
1 2 3 4 3 2 1
y =
1 2 3 4 5 4 3 2 1