-
deepseek-v3 on-line FFT Demo카테고리 없음 2025. 2. 8. 02:00
Prompt
fast fourier transformation (FFT)에 대해 이해하고 싶습니다. 진폭과 주파수가 다른 sine과 cosine 웨이브들을 각각 5개씩 더한 입력 데이터를 만들고, 이 데이터를 FFT하여 결과에서 입력한 진폭과 주파수를 확인하는 파이썬 예제를 부탁합니다. 그래프는 plotly로 해주세요.
Response
Fast Fourier Transform (FFT)는 시간 도메인의 신호를 주파수 도메인으로 변환하는 알고리즘입니다. 이 변환을 통해 신호를 구성하는 주파수 성분들을 분석할 수 있습니다. 아래는 진폭과 주파수가 다른 sine과 cosine 웨이브를 생성하고, 이를 FFT를 통해 분석하는 파이썬 예제입니다. 그래프는 Plotly를 사용하여 그립니다.
예제 코드
import numpy as np import plotly.graph_objects as go from scipy.fftpack import fft # 파라미터 설정 num_samples = 1000 # 샘플 수 sampling_rate = 1000 # 샘플링 레이트 (Hz) T = 1.0 / sampling_rate # 샘플링 간격 t = np.linspace(0.0, num_samples*T, num_samples, endpoint=False) # 시간 배열 # 진폭과 주파수가 다른 sine과 cosine 웨이브 생성 frequencies = [50, 120, 200, 300, 400] # 주파수 (Hz) amplitudes = [1.0, 0.8, 0.6, 0.4, 0.2] # 진폭 signal = np.zeros(num_samples) for freq, amp in zip(frequencies, amplitudes): signal += amp * np.sin(2.0 * np.pi * freq * t) # sine 웨이브 추가 signal += amp * np.cos(2.0 * np.pi * freq * t) # cosine 웨이브 추가 # FFT 수행 fft_result = fft(signal) fft_magnitude = 2.0/num_samples * np.abs(fft_result[:num_samples//2]) fft_freqs = np.linspace(0.0, 1.0/(2.0*T), num_samples//2) # 입력 신호 플롯 fig_input = go.Figure() fig_input.add_trace(go.Scatter(x=t, y=signal, mode='lines', name='Input Signal')) fig_input.update_layout(title='Input Signal (Sum of Sine and Cosine Waves)', xaxis_title='Time [s]', yaxis_title='Amplitude') fig_input.show() # FFT 결과 플롯 fig_fft = go.Figure() fig_fft.add_trace(go.Scatter(x=fft_freqs, y=fft_magnitude, mode='lines', name='FFT Magnitude')) fig_fft.update_layout(title='FFT Result', xaxis_title='Frequency [Hz]', yaxis_title='Magnitude') fig_fft.show() # 입력한 진폭과 주파수 확인 for freq, amp in zip(frequencies, amplitudes): idx = np.argmin(np.abs(fft_freqs - freq)) print(f"Frequency: {fft_freqs[idx]:.2f} Hz, Magnitude: {fft_magnitude[idx]:.2f}")
실행 결과
Frequency: 50.10 Hz, Magnitude: 1.41 Frequency: 120.24 Hz, Magnitude: 1.13 Frequency: 200.40 Hz, Magnitude: 0.85 Frequency: 299.60 Hz, Magnitude: 0.00 Frequency: 399.80 Hz, Magnitude: 0.00
코드 설명
신호 생성:
frequencies
와amplitudes
리스트에 각 sine과 cosine 웨이브의 주파수와 진폭을 지정합니다.signal
변수에 각 sine과 cosine 웨이브를 더하여 합성 신호를 생성합니다.
FFT 수행:
fft
함수를 사용하여 합성 신호를 주파수 도메인으로 변환합니다.fft_magnitude
는 FFT 결과의 크기를 나타내며,fft_freqs
는 해당 주파수를 나타냅니다.
그래프 그리기:
plotly.graph_objects
를 사용하여 입력 신호와 FFT 결과를 그래프로 표시합니다.- 입력 신호는 시간 도메인에서, FFT 결과는 주파수 도메인에서 표시됩니다.
입력한 진폭과 주파수 확인:
- FFT 결과에서 입력한 주파수와 진폭을 확인하고 출력합니다.
결과 해석
- 입력 신호 그래프: 시간 도메인에서의 합성 신호를 확인할 수 있습니다.
- FFT 결과 그래프: 주파수 도메인에서의 신호를 확인할 수 있으며, 입력한 주파수와 진폭이 FFT 결과에서 어떻게 나타나는지 확인할 수 있습니다.
- 출력된 진폭과 주파수: 입력한 주파수와 진폭이 FFT 결과에서 정확히 나타나는지 확인할 수 있습니다.
이 예제를 통해 FFT를 사용하여 신호의 주파수 성분을 분석하는 방법을 이해할 수 있습니다.