www.gusucode.com > signal 案例源码程序 matlab代码 > signal/EfficientComputationOfConvolutionExample.m
%% Efficient Computation of Convolution % It is generally more efficient to compute a convolution using |conv| when % the signals are vectors. For multichannel signals, |convmtx| might be % more efficient. % Copyright 2015 The MathWorks, Inc. %% % Compute the convolution of two random vectors, |a| and |b|, using both % |conv| and |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 t1rat = tcnv\tmtx %% % |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 tmrat = tcnv/tmtx %% % |convmtx| is about 3 times as efficient as |conv|.