파이썬:푸리에 분석

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동

개요[편집 | 원본 편집]

고속 푸리에 분석[편집 | 원본 편집]

다음과 같이 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