이번 시간에는 마지막 1-dimensional vectorization을 다뤄보려고 한다. 왜 이렇게 많이 반복하는지 궁금한 독자들도 있겠지만 생각보다 다른 곳에서 Vectorization을 집중적으로 배워볼 기회가 흔치 않기 때문에 이 강의를 통해서라도 최대한 익숙해졌으면 하는 바람에서 3번째 예제까지 다뤄보려고 한다. 위에 보이는 것처럼 NumPy Master Class이지 않은가.
이번 시간에는 Fourier Transform을 이용하여 Vectorization을 연습해보려고 한다. 이때 모든 주파수에 대해 연산하면 2차원이 되므로 f=10일 때를 구해보도록 하자. 많은 독자들이 이미 이론적으로 충분히 배웠을 것이고, 모르는 독자들도 연산에만 집중해도 충분하다. 그리고 fft라는 NumPy의 method가 있지만 Vectorization의 방법론을 배우기 위하여 이 fft는 사용하지 않도록 하겠다.
먼저 Foureir Transform의 식은 다음과 같다.
$X(10) = \sum_{n= -\infty}^{\infty} x[n]*e^{-j2 \pi 10n}$
그러면 우리의 신호를 다음과 같이 만들어보자.
import numpy as np
import matplotlib.pyplot as plt
import time
from scipy.io import wavfile
fs, data = wavfile.read('./test_audio.wav')
data = (data[:,0] + data[:,1])/2
fig, ax = plt.subplots(figsize = (15,6))
ax.plot(data)
test audio file을 불러와 stereo를 mono로 바꾼 모습이다.
먼저 for loop을 이용해 Fourier Transform을 구해보자.
cf) $X(10) = \sum_{n= -\infty}^{\infty} x[n]*e^{-j2 \pi 10n}$
tic = time.time()
PI = np.pi
DTFT_10 = 0
for i in range(len(data)):
DTFT_10 += data[i] * np.exp(-2j*PI*10*i)
toc = time.time()
for_time = toc - tic
print("Elapsed Time:", for_time, 'sec')
print("DTFT_10:", DTFT_10)
tic = time.time()
PI = np.pi
DTFT_10 = np.sum(data * np.exp(-2j*PI*10*np.arange(len(data))))
toc = time.time()
vec_time = toc - tic
print("Elapsed Time:", vec_time, 'sec')
print("DTFT_10:", DTFT_10)
print("Elapsed Time Ratio:", for_time/vec_time)
이번에는 10배의 성능개선을 확인할 수 있다. 우리가 앞에서 너무 극단적인 예시를 많이 들어서 10배면 뚜렷한 개선이라고 느껴지지 않을 수 있지만, 현실에선 2배 차이만 나도 엄청난 성능개선이 아닌가. 10배 차이면 이 전 예제들보단 개선효과가 덜 하지만 충분히 가치있는 Vectorization이라고 할 수 있다.
'NumPy Master Class' 카테고리의 다른 글
Chapter4 Vectorization: Notebook5 2-dim Vectorization Example2 (0) | 2020.01.09 |
---|---|
Chapter4 Vectorization: Notebook4 2-dim Vectorization Example1 (0) | 2020.01.09 |
Chapter4 Vectorization: Notebook2 1-dim Vectorization Example2 (0) | 2020.01.09 |
Chapter4 Vectorization: Notebook1 1-dim Vectorization Example1 (0) | 2020.01.09 |
Chapter3 Mathematical Functions: Notebook5 Handling Complex Numbers (0) | 2020.01.09 |