카테고리 없음

claude-haiku on-line FFT Demo

hsl7 2025. 2. 8. 12:09

Prompt

fast fourier transformation (FFT)에 대해 이해하고 싶습니다. 진폭과 주파수가 다른 sine과 cosine 웨이브들을 각각 5개씩 더한 입력 데이터를 만들고, 이 데이터를 FFT하여 결과에서 입력한 진폭과 주파수를 확인하는 파이썬 예제를 부탁합니다. 그래프는 plotly로 그려주세요.

Response

FFT를 사용하여 신호를 분석하는 예제를 만들어보겠습니다.

import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 시간 도메인 설정
t = np.linspace(0, 1, 1000)

# 입력 신호 생성 (5개의 sine과 5개의 cosine 파형)
amplitudes_sin = [1.0, 0.8, 0.6, 0.4, 0.2]
frequencies_sin = [5, 10, 15, 20, 25]
amplitudes_cos = [0.9, 0.7, 0.5, 0.3, 0.1]
frequencies_cos = [7, 12, 17, 22, 27]

signal = np.zeros_like(t)
for amp, freq in zip(amplitudes_sin, frequencies_sin):
    signal += amp * np.sin(2 * np.pi * freq * t)
for amp, freq in zip(amplitudes_cos, frequencies_cos):
    signal += amp * np.cos(2 * np.pi * freq * t)

# FFT 수행
n = len(t)
fft_result = np.fft.fft(signal)
frequencies = np.fft.fftfreq(n, t[1] - t[0])
magnitudes = np.abs(fft_result) / n * 2

# 플롯 생성
fig = make_subplots(rows=2, cols=1, subplot_titles=('Time Domain Signal', 'Frequency Domain (FFT)'))

# 시간 도메인 신호 플롯
fig.add_trace(
    go.Scatter(x=t, y=signal, name='Signal'),
    row=1, col=1
)

# 주파수 도메인 플롯 (양의 주파수만)
positive_freq_mask = frequencies >= 0
fig.add_trace(
    go.Scatter(
        x=frequencies[positive_freq_mask],
        y=magnitudes[positive_freq_mask],
        name='FFT Magnitude'
    ),
    row=2, col=1
)

# 레이아웃 설정
fig.update_layout(
    height=800,
    showlegend=True,
    title_text="Signal Analysis with FFT"
)
fig.update_xaxes(title_text="Time (s)", row=1, col=1)
fig.update_xaxes(title_text="Frequency (Hz)", row=2, col=1)
fig.update_yaxes(title_text="Amplitude", row=1, col=1)
fig.update_yaxes(title_text="Magnitude", row=2, col=1)

fig.show()

이 코드는:

  1. 주어진 진폭과 주파수로 신호를 생성
  2. FFT를 수행하여 주파수 성분 분석
  3. 시간 도메인과 주파수 도메인 그래프를 생성

주파수 도메인 그래프에서 입력한 주파수(5, 7, 10, 12, 15, 17, 20, 22, 25, 27 Hz)에서 피크가 나타나며, 피크의 높이는 입력한 진폭과 일치합니다.

실행 결과

  • 주파수를 잘 보기 위해 주파수 도메일 그래프를 확대

  • 주파수와 진폭 결과를 별도로 출력하지 않았다.