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축이 단순한 인덱스가 아닌 실제 주파수 값으로 표현되어, 피크가 나타나는 위치를 정확한 주파수로 해석할 수 있습니다.
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

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