공학/기계진동

[기계진동] FFT(Fast Fourier Transform)와 IFFT(Inverse Fast Fourier Transform) (with Python)

슬기나무 2020. 10. 2. 23:11
반응형

이번 포스팅에서는 파이썬을 이용하여 FFT(Fast Fourier Transform)와

 

IFFT(Inverse Fast Fourier Transform)을 해보겠습니다.

 

FFT를 하는 주된 이유는 시간대역 데이터의 주파수 특성을 파악하여 분석&활용 위함이며,

 

그렇기 때문에 공학 모든 분야에서 아주 필수적인 연산이라고 할 수 있습니다.

 

수식을 유도하며 좀 더 이론적으로 접근하길 원하시는 분은 위키백과를 참고하시기 바라며....

 

여기서는 잘 써먹는 데에 초점을 맞춰보려합니다. ^^;;;

 

import numpy as np
import matplotlib.pyplot as plt

dt = 0.01
Fs = 1/dt
t_end = 1
len_data = int(t_end/dt + 1)
t = np.arange(len_data)*dt
n = np.arange(len_data)
T = len_data/Fs
freq = n/T

sin_20Hz = np.array([])
sin_45Hz = np.array([])
fn_sin = np.array([])

for i in range(0, len_data):
    sin_20Hz = np.append(sin_20Hz, np.sin(2.0 * np.pi * 20.0 * dt * i))
    sin_45Hz = np.append(sin_45Hz, np.sin(2.0 * np.pi * 45.0 * dt * i))

fn_sin = sin_45Hz + sin_20Hz

Y_raw = np.fft.fft(fn_sin)/len_data

y = np.fft.ifft(Y_raw)*len_data

plt.figure()
plt.plot(t, fn_sin)
plt.axis([0, 1, -2, 2])
plt.grid(True)
plt.xlabel('Second [s]')
plt.ylabel('Amplitude [m]')

plt.figure()
plt.plot(t, y)
plt.axis([0, 1, -2, 2])
plt.grid(True)
plt.xlabel('Second [s]')
plt.ylabel('Amplitude [m]')

plt.figure()
plt.stem(freq, np.abs(Y_raw)*2)
plt.axis([0, 100, 0, 2])
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [m]')
plt.grid(True)

plt.show()

크기는 1로 동일하며 각각 20Hz, 45Hz의 주파수를 가지는 sin함수를 이용하여

 

2종류의 주파수 성분을 가지는 함수 fn_sin를 만들었습니다.

 

그 후 numpy 라이브러리에 내장되어 있는 fft 함수를 이용하여 fn_sin을

 

주파수역으로 변환하여 실수부와 허수부를 가지는 Y_raw를 만들었습니다.

 

위에서 설명한 연산의 결과를 아래에 나타내었습니다.

 

그림1. 원래 사인 함수(위)와 FFT->IFFT한 결과(아래)

 

 

그림 1의 위 그래프는 20Hz, 45Hz 주파수 성분을 가지는 원 함수를 나타낸 것이고,

 

아래는 원 함수를 FFT -> IFFT한 결과를 나타낸 그림입니다.

 

데이터의 왜곡없이 잘 복원된 것을 확인할 수 있습니다.

 

 

그림2. 원 함수의 FFT 결과

 

그림 2는 원함수를 FFT후 주파수 별 크기로 나타낸 것입니다.

 

sampling frequency가 100Hz(sampling time의 역수)이므로 100Hz까지 값이 보이지만,

 

우리가 의미있게 분석할 수 있는 영역은 그 절반인 50Hz까지입니다(Nyquist frequency).

 

50Hz 내 영역의 결과를 살펴보면, 20Hz, 45Hz 주파수 성분의 peak는 그런대로 표현되었는데

 

아무래도 좀 거슬립니다...

 

계산하면서 유효숫자때문에 발생하는 오차 때문일까요?

 

sampling frequency를 키워보았습니다 (100Hz -> 1000Hz)

 

그림3. sampling frequency 10배 증가

 

말끔하네요 ^^;

 

원 함수의 주파수 성분에 대한 peak 가 잘 나타나고,

 

크기 또한 모두 1인 것을 확인할 수 있습니다.

 

반응형