1. 程式人生 > >MATLAB卷積運算(conv)以及通用的卷積函式my_conv的實現

MATLAB卷積運算(conv)以及通用的卷積函式my_conv的實現

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