python/신호및시스템 - python

[python] 신호 및 시스템 - 컨볼루션

왜왜왜왜 2021. 8. 9. 00:48

컨볼루션은 합성곱이라고도 부릅니다

식은 아래와 같고 미국 위키백과에 아주 잘 설명해주는 그림이 있습니다.

 

https://upload.wikimedia.org/wikipedia/commons/6/6a/Convolution_of_box_signal_with_itself2.gif

 

식과 그림을 잘 관찰하면 컨볼루션은 한 신호를 뒤집어서 조금씩 이동할 때 겹치는 면적임을 알수있습니다.

 

 

위 그림처럼 구형파를 구현해보겠습니다.

이산시간 컨볼루션

import numpy as np
import matplotlib.pylab as plt

n = np.arange(10)
x = np.heaviside(n-3, 1) - np.heaviside(n-6, 1)
Convolution = np.convolve(x, x, 'same')

plt.stem(n, x)
plt.show()
plt.stem(n, Convolution)
plt.show()

 

연속시간 컨볼루션

이산시간 컨볼루션을 그대로 사용하면 아래와 같이 높이가 30까지 올라갑니다.

dt = 0.1
t = np.arange(0, 10, dt)
x = np.heaviside(t-3, 1) - np.heaviside(t-6, 1)
Convolution = np.convolve(x, x, 'same')

plt.stem(t, x)
plt.show()
plt.stem(t, Convolution)
plt.show()

시간 간격인 dt를 0.01로 더 세밀하게 하면 300으로 올라갑니다.

 

왜 이렇게 되느냐면 컨볼루션 부분을 보면 np.convolve(x, x, 'same') 시간이 없는 x라는 리스트만 입력으로 받습니다.

앞에서 컨볼루션의 정의를 생각해보면 두 신호의 겹치는 넓이입니다.

넓이는 가로X세로입니다. 이산시간에서는 가로의 길이가 1이므로 생략되었지만

연속시간일 때는 가로길이 즉 셈플링 시간이 있어야 됩니다.

 

따라서 올바르게 작성하면 아래와 같습니다.

dt = 0.1
t = np.arange(0, 10, dt)
x = np.heaviside(t-3, 1) - np.heaviside(t-6, 1)
Convolution = np.convolve(x, x, 'same')*dt

plt.plot(t, x)
plt.show()
plt.plot(t, Convolution)
plt.show()

 

소스코드 : https://github.com/QubitKiwi/Signals-and-Systems/blob/main/4.%20convolution.ipynb