파이썬:푸리에 분석
둘러보기로 이동
검색으로 이동
개요[편집 | 원본 편집]
고속 푸리에 분석[편집 | 원본 편집]
다음과 같이 x와 y, 간격 데이터를 적절히 정리해주면 된다.
# 데이터 처리.
x_vals = df[x].values # x 컬럼(시간 또는 인덱스)
signal_data = df[y].values # 선택된 y 컬럼의 데이터 (numpy 배열)
try:
T = float(T) # 숫자만 받아들일 수 있다.
except: # 입력값이 없는 경우.
# 자동으로 간격 계산 (균등하다고 가정)
x_diff = np.diff(x_vals)
if np.allclose(x_diff, x_diff[0]): # 거의 동일한 간격이면
T = x_diff[0]
else:
T = np.mean(x_diff)
N = len(signal_data) # 데이터 포인트 개수
# 푸리에 변환 계산
fft_result = np.fft.fft(signal_data)
freqs = np.fft.fftfreq(N, d=T)
fft_freqs = freqs[:N // 2]
fft_magnitude = np.abs(fft_result[:N // 2])
# plotly 그래프를 위해 데이터프레임 생성
fft_df = pd.DataFrame({'Frequency_Index': fft_freqs, 'Magnitude': fft_magnitude}) # 'Frequency_Index'로 이름 변경
# 그래프 생성 (plotly line plot)
plot_title = f'{y} 컬럼 푸리에 변환 결과 (샘플링 주기: {T:.4f})' if T > 0 else f'{y} 컬럼 푸리에 변환 결과'
fig = px.line(fft_df, x='Frequency_Index', y='Magnitude',
title=plot_title,
labels={'Frequency_Index': 'Frequency (Relative or Index)', 'Magnitude': 'Magnitude'})
# 그래프 레이아웃 조정 (선택 사항)
fig.update_layout(xaxis_title="주파수 (상대값 또는 인덱스)",
yaxis_title="크기 (Magnitude)")
# 그래프를 HTML div로 변환
plot_div = plot(fig, output_type='div')
context['plot_div'] = plot_div