이번 포스팅에서는 FFT 를 이용한 고속 convolution 에 대해 알아본다.
일반적으로 conv(x, y) 은 filter() 함수로 구현되는 선형 convolution 이다.
선형 convolution 은 x 또는 y 의 길이가 증가할수록 그 복잡도는 급격히 증가하는 특징이 있다.
이러한 선형 convolution 은 순환(Circular) convolution 을 이용하여 구현이 가능하며, 순환 convolution 은 FFT(Fast Fourier Transform) 와 IFFT(Inverse Fast Fourier Transform)를 이용하여 구현이 가능하다.
일단 선형 convolution 을 순환 convolution 으로 변환하는 과정에 대해 살펴 보자.
x=[1 2 3 4]
y=[1 4 5]
위 신호를 이용하여 다음과 같이 convolution 을 하면
Z=conv(x,y)
Z =
1 6 16 26 31 20
Z는 6 개의 인자를 갖는 수가 나온다. 이는 x 의 길이가 4 이고 y 의 길이가 3 이므로 length(x) + length(y) – 1 = 4+3-1 = 6 에 따른 결과 이다.
위에서 실행한 conv() 을 순환 convolution 함수 cconv() 을 이용하여 구성해 보자. 참조 : cconv() 함수는 signal Processing Toolbox 에 포함되어 있다.
- x 값을 6 개의 인자를 갖도록 뒤 부분에 0 을 2개 채워준다.
x1=[1 2 3 4 0 0]
- y 값도 6 개의 인자를 갖도록 뒤 부분에 0 을 3개 채워준다.
y1=[1 4 5 0 0 0]
- 위 두 벡터를 순환 convlution 한다.
Z_cconv=cconv(x1,y1, 6)
Z_cconv =
1.0000 6.0000 16.0000 26.0000 31.0000 20.0000
위 결과를 보면 선형 convolution 과 순환 convolution 의 결과가 동일함을 확인 할 수 있다.
이제 순환 convolution 과 FFT 사이의 관계를 알아보자.
(x 와 y 의 circular convolution) = IFFT(FFT(x)∙FFT(y)) 의 관계가 있다.
위에서 실행했던 순환 convolution 을 FFT, IFFT 를 이용하여 처리해 보자.
Z_fast=ifft(fft(x,6).*fft(y,6)) 을 실행하면 다음과 같은 결과가 나오며 이는 처음 실행했던 선형 convolution 의 결과와 동일한 것을 확인 할 수 있다.
Z_fast=
1.0000 6.0000 16.0000 26.0000 31.0000 20.0000
'programming language > MATLAB' 카테고리의 다른 글
MATLAB piecewise 수식 표현 (0) | 2011.03.26 |
---|---|
MATLAB global keyword (0) | 2011.03.26 |
MATLAB Tex character 수학 기호 넣기 (0) | 2011.03.25 |
MATLAB Rayleigh random variable 생성 (2) | 2011.03.23 |
MATLAB random number 생성 (32) | 2011.03.23 |
MATLAB PDF, CDF, CCDF (6) | 2011.03.23 |
MATLAB 함수 만들기, inline, function handle (0) | 2011.03.21 |
MATLAB cross product, 삼각형의 면적, 평행 육면체의 부피 (0) | 2011.03.21 |
댓글