반응형
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()
결과
반응형
'개발기록 > python' 카테고리의 다른 글
[python] 주파수 신호 분석 방법론 3 - Wavelet 변환 (0) | 2024.11.26 |
---|---|
[python] 주파수 신호 분석 방법론 2 - STFT (Short Time Fourier Transform) (1) | 2024.11.25 |
[python] selenium-stealth 셀레늄 감지 방지 (구글 크롬) (1) | 2024.11.15 |
구글 코랩(Colab) 사용하기 (+구글 드라이브 연결, 압축풀기) (0) | 2024.11.07 |
[python] Selenium 요소 클릭, 선택 (checkbox, radio button, select box) (0) | 2024.10.14 |
댓글