ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    코드 설명

    1. 신호 생성:

      • frequenciesamplitudes 리스트에 각 sine과 cosine 웨이브의 주파수와 진폭을 지정합니다.
      • signal 변수에 각 sine과 cosine 웨이브를 더하여 합성 신호를 생성합니다.
    2. FFT 수행:

      • fft 함수를 사용하여 합성 신호를 주파수 도메인으로 변환합니다.
      • fft_magnitude는 FFT 결과의 크기를 나타내며, fft_freqs는 해당 주파수를 나타냅니다.
    3. 그래프 그리기:

      • plotly.graph_objects를 사용하여 입력 신호와 FFT 결과를 그래프로 표시합니다.
      • 입력 신호는 시간 도메인에서, FFT 결과는 주파수 도메인에서 표시됩니다.
    4. 입력한 진폭과 주파수 확인:

      • FFT 결과에서 입력한 주파수와 진폭을 확인하고 출력합니다.

    결과 해석

    • 입력 신호 그래프: 시간 도메인에서의 합성 신호를 확인할 수 있습니다.
    • FFT 결과 그래프: 주파수 도메인에서의 신호를 확인할 수 있으며, 입력한 주파수와 진폭이 FFT 결과에서 어떻게 나타나는지 확인할 수 있습니다.
    • 출력된 진폭과 주파수: 입력한 주파수와 진폭이 FFT 결과에서 정확히 나타나는지 확인할 수 있습니다.

    이 예제를 통해 FFT를 사용하여 신호의 주파수 성분을 분석하는 방법을 이해할 수 있습니다.