A = convmtx(h,n)
A = convmtx(h,n) returns the
A, such that the product of
x, is the convolution of
h is a column vector of length
the product of
A and a column vector,
n is the convolution of
h is a row vector of length
the product of a row vector,
x, of length
the convolution of
convmtx handles edge conditions
by zero padding.
It is generally more efficient to compute a convolution using
conv when the signals are vectors. For multichannel signals,
convmtx might be more efficient.
Compute the convolution of two random vectors,
b, using both
convmtx. The signals have 1000 samples each. Compare the time spent by the two functions. Eliminate random fluctuations by repeating the calculation 30 times and averaging.
Nt = 30; Na = 1000; Nb = 1000; tcnv = 0; tmtx = 0; for kj = 1:Nt a = randn(Na,1); b = randn(Nb,1); tic n = conv(a,b); tcnv = tcnv+toc; tic c = convmtx(b,Na); d = c*a; tmtx = tmtx+toc; end t1col = [tcnv tmtx]/Nt
t1col = 0.0011 0.0366
t1rat = tcnv\tmtx
t1rat = 34.5178
conv is about two orders of magnitude more efficient.
Repeat the exercise for the case where
a is a mutichannel signal with 1000 channels. Optimize
conv's performance by preallocating.
Nchan = 1000; tcnv = 0; tmtx = 0; n = zeros(Na+Nb-1,Nchan); for kj = 1:Nt a = randn(Na,Nchan); b = randn(Nb,1); tic for k = 1:Nchan n(:,k) = conv(a(:,k),b); end tcnv = tcnv+toc; tic c = convmtx(b,Na); d = c*a; tmtx = tmtx+toc; end tmcol = [tcnv tmtx]/Nt
tmcol = 0.6342 0.2247
tmrat = tcnv/tmtx
tmrat = 2.8228
convmtx is about 3 times as efficient as
convmtx uses the function
toeplitz to generate the convolution