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|.