이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

선형 컨벌루션과 원형 컨벌루션

이 예제에서는 선형 컨벌루션과 원형 컨벌루션 사이의 동치관계를 설정하는 방법을 보여줍니다.

선형 컨벌루션과 원형 컨벌루션은 근본적으로 다른 연산입니다. 그러나, 선형 컨벌루션과 원형 컨벌루션이 동일해지는 조건이 있습니다. 이러한 동치관계를 설정하는 것은 중요한 의미를 가집니다. 두 벡터 xy의 경우, 원형 컨벌루션은 이 두 벡터의 이산 푸리에 변환(DFT)의 곱에 역 이산 푸리에 변환(DFT)을 취한 것과 동일합니다. 선형 컨벌루션과 원형 컨번루션이 동일해지는 조건을 파악하면 DFT를 사용하여 선형 컨벌루션을 효율적으로 계산할 수 있습니다.

N개 점을 가진 벡터 xL개 점을 가진 벡터 y의 선형 컨벌루션은 길이가 N + L - 1입니다.

xy의 원형 컨벌루션이 동일해지려면 DFT를 수행하기 전에 길이가 최소 N + L - 1이 되도록 벡터를 0으로 채워야 합니다. DFT 곱에 역을 취한 다음에는 처음 N + L - 1개 요소만 유지합니다.

두 개의 벡터 xy를 생성하고 두 벡터의 선형 컨벌루션을 계산합니다.

x = [2 1 2 1];
y = [1 2 3];
clin = conv(x,y);

출력값은 길이가 4+3-1입니다.

길이가 4+3-1이 되도록 두 벡터 모두를 0으로 채웁니다. 두 벡터의 DFT를 구하고, DFT를 곱한 후 이 곱에 대한 역 DFT를 구합니다.

xpad = [x zeros(1,6-length(x))];
ypad = [y zeros(1,6-length(y))];
ccirc = ifft(fft(xpad).*fft(ypad));

0으로 채워진 벡터 xpadypad의 원형 컨벌루션은 xy의 선형 컨벌루션과 동일합니다. 출력값의 길이가 4+3-1이므로 ccirc의 모든 요소를 유지합니다.

선형 컨벌루션의 출력값과 DFT 곱의 역을 플로팅하여 동치관계임을 표시합니다.

subplot(2,1,1)
stem(clin,'filled')
ylim([0 11])
title('Linear Convolution of x and y')

subplot(2,1,2)
stem(ccirc,'filled')
ylim([0 11])
title('Circular Convolution of xpad and ypad')

길이가 12가 되도록 벡터를 채우고 DFT 곱의 역 DFT를 사용하여 원형 컨벌루션을 구합니다. 선형 컨벌루션과 동일한 결과를 생성하기 위해 처음 4+3-1개 요소만 유지합니다.

N = length(x)+length(y)-1;
xpad = [x zeros(1,12-length(x))];
ypad = [y zeros(1,12-length(y))];
ccirc = ifft(fft(xpad).*fft(ypad));
ccirc = ccirc(1:N);

Signal Processing Toolbox™에는 두 벡터의 원형 컨벌루션을 반환하는 함수 cconv가 있습니다. 다음 원형 컨벌루션 코드를 사용하여 xy의 선형 컨벌루션을 구할 수 있습니다.

ccirc2 = cconv(x,y,6);

cconv는 앞의 예제에 나와 있는 것과 동일한 DFT 기반 절차를 내부적으로 사용합니다.