이번 포스팅에서는 파이썬을 이용하여 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의 위 그래프는 20Hz, 45Hz 주파수 성분을 가지는 원 함수를 나타낸 것이고,
아래는 원 함수를 FFT -> IFFT한 결과를 나타낸 그림입니다.
데이터의 왜곡없이 잘 복원된 것을 확인할 수 있습니다.
그림 2는 원함수를 FFT후 주파수 별 크기로 나타낸 것입니다.
sampling frequency가 100Hz(sampling time의 역수)이므로 100Hz까지 값이 보이지만,
우리가 의미있게 분석할 수 있는 영역은 그 절반인 50Hz까지입니다(Nyquist frequency).
50Hz 내 영역의 결과를 살펴보면, 20Hz, 45Hz 주파수 성분의 peak는 그런대로 표현되었는데
아무래도 좀 거슬립니다...
계산하면서 유효숫자때문에 발생하는 오차 때문일까요?
sampling frequency를 키워보았습니다 (100Hz -> 1000Hz)
말끔하네요 ^^;
원 함수의 주파수 성분에 대한 peak 가 잘 나타나고,
크기 또한 모두 1인 것을 확인할 수 있습니다.
'공학 > 기계진동' 카테고리의 다른 글
[기계진동] 등가스프링 상수 구하기 (0) | 2021.04.19 |
---|---|
[기계진동] 공진(Resonance)과 고유진동수(Natural frequency) (1) | 2021.03.14 |
[기계진동] 맥놀이(Beat) 현상 (0) | 2021.01.10 |
[기계진동] 모드 해석(Modal analysis)이란? (2) | 2020.11.23 |
[기계진동] Spectral Leakage와 Aliasing (0) | 2020.11.15 |