신호가 벡터인 경우 conv를 사용하면 convmtx를 사용하는 것보다 보통 더 효율적으로 컨벌루션을 계산할 수 있습니다. 다중채널 신호의 경우, convmtx가 더 효율적일 수 있습니다.
conv와 convmtx를 모두 사용하여 두 개의 확률 벡터 a와 b에 대한 컨벌루션을 계산합니다. 이 신호는 각각 1000개의 샘플을 가집니다. 두 함수에 소요된 시간을 비교합니다. 계산을 30번 반복하고 이에 대한 평균값을 구해 불규칙적인 변동을 제거합니다.
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 = 1×2
0.0009 0.0070
t1rat = tcnv\tmtx
t1rat =
7.7797
conv가 수십 배 더 효율적입니다.
a가 1000개 채널을 갖는 다중채널 신호인 경우에 대해 위의 예제를 반복해 봅니다. 사전 할당을 수행하여 conv의 성능을 최적화합니다.
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