Main Content

convmtx

컨벌루션 행렬

설명

예제

A = convmtx(h,n)A와 요소를 n개 가진 벡터 x의 곱이 hx의 컨벌루션이 되는 컨벌루션 행렬 A를 반환합니다.

예제

모두 축소

신호가 벡터인 경우 conv를 사용하면 convmtx를 사용하는 것보다 보통 더 효율적으로 컨벌루션을 계산할 수 있습니다. 다중채널 신호의 경우, convmtx가 더 효율적일 수 있습니다.

convconvmtx를 모두 사용하여 두 개의 확률 벡터 ab에 대한 컨벌루션을 계산합니다. 이 신호는 각각 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.0060    0.0201

t1rat = tcnv\tmtx
t1rat = 3.3472

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
tmcol = 1×2

    0.2151    0.1016

tmrat = tcnv/tmtx
tmrat = 2.1162

convmtxconv보다 약 3배 더 효율적입니다.

입력 인수

모두 축소

입력 벡터로, 행 또는 열로 지정됩니다.

데이터형: single | double

컨벌루션을 수행할 벡터의 길이로, 양의 정수로 지정됩니다.

  • h가 길이가 m인 열 벡터인 경우, A(m+n-1)×n이고 A와 길이가 n인 열 벡터 x의 곱은 hx의 컨벌루션이 됩니다.

  • h가 길이가 m인 행 벡터인 경우, An×(m+n-1)이고 길이가 n인 행 벡터 xA의 곱은 hx의 컨벌루션이 됩니다.

출력 인수

모두 축소

입력값 h와 벡터 x의 컨벌루션 행렬로, 행렬로 반환됩니다.

알고리즘

  • convmtx는 함수 toeplitz를 사용하여 컨벌루션 행렬을 생성합니다.

  • convmtx는 0 채우기로 경계 조건을 처리합니다.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2006a 이전에 개발됨

참고 항목

| | | |