Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib에서 X축에 올바른 주파수를 표시하며 신호의 FFT 그래프 그리는 방법

Matplotlib에서 신호의 FFT(고속 푸리에 변환)를 그릴 때, X축에 올바른 주파수 값을 표시하는 것은 정확한 주파수 분석을 위해 매우 중요합니다. 이 글에서는 NumPy와 Matplotlib을 활용해 올바른 주파수 축과 함께 FFT 스펙트럼을 시각화하는 방법을 단계별로 살펴보겠습니다.

구현 단계

  • 그림(figure) 크기를 설정하고, 서브플롯 사이 및 주변 여백(padding)을 조정합니다.

  • 샘플 개수 N과 주기 개수 m 변수를 초기화하여 정규화된 주파수 nu를 계산합니다.

  • NumPy를 사용해 사인파 형태의 신호를 생성하고, np.fft.fft()로 1차원 이산 푸리에 변환(DFT)을 계산합니다.

  • np.fft.fftfreq() 함수를 사용해 이산 푸리에 변환의 샘플 주파수 배열을 반환받습니다.

  • X축에는 주파수(freq)를, Y축에는 FFT 결과의 크기 스펙트럼(실수부 제곱 + 허수부 제곱)을 플롯합니다.

  • plt.show() 메서드를 호출하여 그래프를 화면에 표시합니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

N = 256
t = np.arange(N)
m = 4
nu = float(m)/N

signal = np.sin(2*np.pi*nu*t)

ft = np.fft.fft(signal)

freq = np.fft.fftfreq(N)

plt.plot(freq, ft.real**2 + ft.imag**2)

plt.show()

코드 설명

위 코드에서 N=256은 신호의 총 샘플 수를 의미하고, m=4는 전체 구간 동안 반복되는 사인파의 주기 개수입니다. 따라서 정규화된 주파수 nu는 4/256 = 0.015625가 됩니다.

np.fft.fft(signal)은 시간 영역의 신호를 주파수 영역으로 변환하며, 결과는 복소수 배열입니다. 여기서 실수부와 허수부를 각각 제곱한 후 더하면 전력 스펙트럼(power spectrum)을 얻을 수 있습니다.

np.fft.fftfreq(N)은 각 FFT 빈(bin)에 해당하는 주파수 값을 반환합니다. 이 함수 덕분에 X축이 단순한 인덱스가 아닌 실제 주파수 값으로 표현되어, 피크가 나타나는 위치를 정확한 주파수로 해석할 수 있습니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

Matplotlib에서 X축에 올바른 주파수를 표시하며 신호의 FFT 그래프 그리는 방법

결과 그래프를 보면 ±0.015625 위치에서 두 개의 대칭적인 피크가 나타나는데, 이는 입력 신호가 정규화 주파수 0.015625(즉, 샘플링 레이트의 1/64)인 사인파였음을 정확히 보여줍니다. 실수 신호의 FFT는 양의 주파수와 음의 주파수 영역에 대해 대칭 구조를 가지므로, 두 개의 피크가 관찰되는 것이 정상입니다.