Convolution은 linear time invariant (LTI) system에서 zero-state response를 구하는데 사용되는 연산임.
- DIP 등에서는 Linear Shift Invariant (LSI) system에서의 output image를 구하는데 사용되며, 주로 spatial domain filter들을 직접 spatial domain에서 구하는데 사용됨 (box filter, sobel filter등등)
DFT (Discrete Fourier Transform)에서는 실제로 cyclic convolution이 이루어지나, 여기선 linear convolution에 초점을 맞춘다.
cyclic convolution(or circular convolution)은 다음을 참고.
2022.11.18 - [.../Signals and Systems] - [SS] Circular Convolution
python에서의 convolution 구현은 대부분의 library들이 크게 3가지 모드로 동작하도록 되어있음. (딥러닝용 TF 등의 경우, same
, valid
만을 지원하는 경우가 대부분.)
Linear convolution의 수식과 수행방식을 표로 살펴보면 다음과 같음.
$$x[n]\otimes h[n]=\sum^\infty_{\tau=-\infty} x[\tau]h[t-\tau]$$
참고로 표로 표현된 다음의 수행방식은 $x[n]$의 sample의 수가 4개이고, $h[n]$의 sample의 수가 3개인 경우임.
동작방식은 다음의 3개의 모드로 나뉨.
full
mode : linear convolution에서 가질 수 있는 결과를 모두 출력length(x)+length(h)-1
- 앞뒤로 불완전한 결과(padding된 element가 연산에 들어감)를 포함.
- 많은 경우 zero padding이 사용되므로 여기서도 zero padding을 사용함.
- 이론적으로 많이 보여지나, 다른 모드들보다 사용이 덜 한 편임.
same
mode : input signal과 같은 길이를 출력length(x)
- full mode보다 짧지만, 역시 출력의 앞뒤에 불완전한 결과들을 포함.
- 가장 많이 애용되는 모드로, 입력과 같은 길이의 출력을 반환한다.
valid
mode : padding된 요소가 결과에 영향을 주지 않음.length(x)-length(h)+1
- 불완전한 결과는 빠지나, input signal보다 짧은 출력을 가지게 됨.
same
모드와 함께 많이 사용되는 방식
Python code
가장 많이 사용되는 것은 numpy
에서 제공하는 convolve
이라고 할 수 있음(Python에서 NumPy는 거의 필수적으로 import해서 사용하므로, 가장 쉽게 접근가능하다고 볼 수 있음.)
단, scipy.signal
에서 제공하는 convolve
도 거의 유사하나 수행방식을 조금 더 제어할 수 있음 (method
파라메터를 통해, Fourier transform을 하여 처리할지 아니면, 직접 time domain에서 처리할지를 선택가능함.)
import numpy as np
from scipy import signal
# h = np.array([1/5,1/5,1/5,1/5,1/5])
h = np.ones(4)
h = 1/4 * h
x = np.array([1,0,1,0,1,0,1,0])
# x = np.array([2,1,0,1,2,1,0,1,2,1,0,1])
y_full = np.convolve(x,h,mode='full') #, method='direct')
y_valid = np.convolve(x,h,mode='valid')#, method='direct')
y_same = np.convolve(x,h,mode='same') #, method='direct')
# scipy.signal구현
# y_full = signal.convolve(x,h,mode='full' , method='direct')
# y_valid = signal.convolve(x,h,mode='valid', method='direct')
# y_same = signal.convolve(x,h,mode='same' , method='direct')
print(f'len(h)={len(h)}, len(x)={len(x)}')
print(f'full mode : {len(y_full)}, valid mode : {len(y_valid)}, same mode : {len(y_same)}')
print(f'full : y={np.round(y_full,4)}')
print(f'valid: y={np.round(y_valid,4)}')
print(f'same : y={np.round(y_same,4)}')
결과는 다음과 같음.
len(h)=4, len(x)=8
full mode : 11, valid mode : 5, same mode : 8
full : y=[0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0. ]
valid: y=[0.5 0.5 0.5 0.5 0.5]
same : y=[0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.25]
- 일종의 LPF로서
full
과same
의 결과에는 앞 뒤에 zero padding된 $h[n]$과의 연산 결과가 포함되어 있음. - 특히 zero padding된 $h[n]$과의 연산 결과 중 앞부분은 transient response라고도 불림.
2D등으로 확장할 경우 scipy.signal.convolve2d
를, Fast Fourier Transform을 이용하려면 scipy.signal.fftconvolve
를 사용하면 된다.scipy.signal.correlation
도 제공한다. 실제로 deep learning에서의 conv layer들은 실제 구현은 correlation이다.
'... > Signals and Systems' 카테고리의 다른 글
[SS] z-Transform : Introduction (1) | 2022.11.30 |
---|---|
[SS] Resolution of DFT (0) | 2022.11.25 |
[SS] Circular Convolution (0) | 2022.11.18 |
[SS] Properties of (unilateral) Laplace Transform (0) | 2022.10.25 |
[SS] Laplace Transform : $\sin^2 \Omega_0 t u(t)$ (0) | 2022.10.24 |