python/신호및시스템 - python
[python] 신호 및 시스템 - 컨볼루션
왜왜왜왜
2021. 8. 9. 00:48
컨볼루션은 합성곱이라고도 부릅니다
식은 아래와 같고 미국 위키백과에 아주 잘 설명해주는 그림이 있습니다.
식과 그림을 잘 관찰하면 컨볼루션은 한 신호를 뒤집어서 조금씩 이동할 때 겹치는 면적임을 알수있습니다.
위 그림처럼 구형파를 구현해보겠습니다.
이산시간 컨볼루션
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