-
[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
'python > 신호및시스템 - python' 카테고리의 다른 글
[python] 신호 및 시스템 - 임펄스 함수 (0) 2021.07.31 [python] 신호 및 시스템 - 램프 함수 (0) 2021.07.26 [python] 신호 및 시스템 - 계단 함수 (0) 2021.05.22 [python] 신호 및 시스템 - 환경설정 (0) 2021.03.22