선형 컨벌루션과 원형 컨벌루션
이 예제에서는 선형 컨벌루션과 원형 컨벌루션 사이의 동치관계를 설정하는 방법을 보여줍니다.
선형 컨벌루션과 원형 컨벌루션은 근본적으로 다른 연산입니다. 그러나, 선형 컨벌루션과 원형 컨벌루션이 동일해지는 조건이 있습니다. 이러한 동치관계를 설정하는 것은 중요한 의미를 가집니다. 두 벡터 x
와 y
의 경우, 원형 컨벌루션은 이 두 벡터의 이산 푸리에 변환(DFT)의 곱에 이산 푸리에 역변환(DFT)을 취한 것과 동일합니다. 선형 컨벌루션과 원형 컨번루션이 동일해지는 조건을 파악하면 DFT를 사용하여 선형 컨벌루션을 효율적으로 계산할 수 있습니다.
N개 점을 가진 벡터 x
와 L개 점을 가진 벡터 y
의 선형 컨벌루션은 길이가 N + L - 1입니다.
x와 y의 원형 컨벌루션이 동일해지려면 DFT를 수행하기 전에 길이가 최소 N + L - 1이 되도록 벡터를 0으로 채워야 합니다. DFT 곱에 역을 취한 다음에는 처음 N + L - 1개 요소만 유지합니다.
두 개의 벡터 x
와 y
를 생성하고 두 벡터의 선형 컨벌루션을 계산합니다.
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으로 채워진 벡터 xpad
와 ypad
의 원형 컨벌루션은 x
와 y
의 선형 컨벌루션과 동일합니다. 출력값의 길이가 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
가 있습니다. 다음 원형 컨벌루션 코드를 사용하여 x
와 y
의 선형 컨벌루션을 구할 수 있습니다.
ccirc2 = cconv(x,y,6);
cconv
는 앞의 예제에 나와 있는 것과 동일한 DFT 기반 절차를 내부적으로 사용합니다.