Matplotlib의 magnitude_spectrum() 메서드를 사용하면 신호의 크기 스펙트럼(진폭 스펙트럼)을 손쉽게 시각화할 수 있습니다. 이 글에서는 난수 기반 노이즈 데이터를 생성한 뒤, 이를 FFT 변환하여 크기 스펙트럼을 플롯하는 전체 과정을 단계별로 살펴보겠습니다.
구현 단계
- 그림 크기(figure size)를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- 재현 가능한 결과를 위해 NumPy의 랜덤 시드(random seed) 값을 설정합니다.
- 샘플링 간격 dt를 초기화하고, 이를 바탕으로 샘플링 주파수(sampling frequency)를 계산합니다.
- 시간 축에 해당하는 임의의 데이터 포인트 t를 생성합니다.
- 노이즈를 생성하기 위해 NumPy를 사용해 nse(정규분포 난수), r(지수 감소 함수), cnse(컨볼루션된 노이즈), 그리고 최종 신호 s를 만듭니다.
- subplots() 메서드를 사용해 figure와 서브플롯 집합을 생성합니다.
- 플롯의 제목을 설정합니다.
- magnitude_spectrum() 메서드로 크기 스펙트럼을 플롯합니다.
- show() 메서드를 호출하여 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
np.random.seed(0)
dt = 0.01 # 샘플링 간격
Fs = 1 / dt # 샘플링 주파수
t = np.arange(0, 10, dt)
# 노이즈 생성:
nse = np.random.randn(len(t))
r = np.exp(-t / 0.05)
cnse = np.convolve(nse, r) * dt
cnse = cnse[:len(t)]
s = 0.1 * np.sin(4 * np.pi * t) + cnse
fig, axs = plt.subplots()
axs.set_title("Magnitude Spectrum")
axs.magnitude_spectrum(s, Fs=Fs, color='C1')
plt.show()실행 결과
위 코드를 실행하면 4π 주파수의 사인파 성분과 컨볼루션된 노이즈가 합쳐진 신호 s의 크기 스펙트럼이 표시됩니다. x축은 주파수(Hz), y축은 정규화된 크기(magnitude)를 나타내며, 특정 주파수 대역에서 에너지가 집중되는 모습을 확인할 수 있습니다.
핵심 포인트 정리
- magnitude_spectrum()은 내부적으로 FFT(고속 푸리에 변환)를 수행하여 시간 도메인 신호를 주파수 도메인으로 변환합니다.
- Fs 파라미터에 샘플링 주파수를 전달하면 x축이 올바른 주파수 값으로 표시됩니다.
- color 파라미터를 사용해 플롯의 색상을 자유롭게 지정할 수 있습니다(예: 'C1', 'r', 'b' 등).