본문 바로가기
개발기록/python

[python] 주파수 신호 분석 방법론 1 - FFT (Fast Fourier Transform)

by spectrum20 2024. 11. 24.
반응형

FFT (Fast Fourier Transform)

: 신호를 다양한 주파수를 갖는 주기함수들로 변환하여, 신호에 대한 주파수 정보제공

 

시간 영역서 주파수 영역으로 신호 변환

  • Sin, Cos 함수로 주기/진폭이 변형된 다양한 주기함수를 탐색 후, 주파수 기준으로 재배열
  • 주로 진동 데이터의 특성 주파수를 찾아내기 위해서 사용
  • 주파수에 대한 정보만 파악하기 때문에, 시간에 대한 정보는 알 수 없음

 

* 주기와 주파수의 관계

frequency (주파수/진동수) : 단위시간 동안 진동한 횟수

T (주기) : 한 번 진동할 때 걸리는 시간

 

 

장점

  • 주파수에 따른 분석 용이
  • 기계적 원인 분석 용이

단점

  • 특정 데이터 형태에서 오차 발생
  • 주파수 영역별 필터 최적화 필요

 

 

코드

라이브러리 imoprt

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal    #science python : scipy
import math

 

주파수 f, 각주파수 w 정의

# 주파수 입력
f1 = 2  
f2 = 8
f3 = 4
f4 = 6
f5 = 10

# w = 2pi*f
w1 = 2*np.pi*f1  
w2 = 2*np.pi*f2
w3 = 2*np.pi*f3
w4 = 2*np.pi*f4
w5 = 2*np.pi*f5

 

샘플링 주파수, 이산함수 정의

# 시간열 생성
t = np.arange(0,10,0.005)    # sampling freq : 200 Hz // sampling time : 10 seconds
x1 = np.concatenate([np.sin(w1*t), np.sin(w2*t), np.sin(w3*t), np.sin(w4*t), np.sin(w5*t)])

t.shape, t_total.shape, x1.shape, x2.shape

→ ((2000, ), (20000, ), (10000, ), (10000, ))

# 샘플링 주파수 (Fs = 데이터 개수/시간)
Fs = int(len(t_total)/t_total[-1])
Fs

→ 200

 

시각화

plt.figure(figsize=(15,12))
plt.subplot(2, 1, 1)
plt.plot(t_total, x1, 'r-', lw = 1)
plt.xlabel('t',fontsize=12)
plt.ylabel('x',fontsize=12)

plt.show()

 

 

 

FTF 연산

NFFT   =  len(x1)
k      =  np.arange(NFFT)
f0     =  k * Fs / NFFT
f0     =  f0[range(math.trunc(NFFT/2))]

Y      =  np.fft.fft(x1)/NFFT
Y      =  Y[range(math.trunc(NFFT/2))]
amp_Hz =  2 * abs(Y)

 

시각화

plt.figure(figsize=(16,5))
plt.plot(f0,amp_Hz,'r.-', lw=1)
plt.xlim(0, 20)
plt.ylim(0)
# plt.xticks(np.arange(0,(Fs/2)+1))
plt.xlabel('frequency(Hz)')
plt.ylabel('amplitude')
plt.grid()

 

 

 

결과

 

 

반응형

댓글