Matplotlib에서 pylab의 specgram() 함수와 동일한 방식으로 스펙트로그램을 그리려면 아래 단계를 따르면 됩니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 간의 여백을 조정합니다.
- numpy를 사용하여 t, s1, s2, nse, x, NFFT, Fs 데이터 포인트를 생성합니다.
- subplots() 메서드에 nrows=2를 지정하여 새로운 그림을 생성하거나 기존 그림을 활성화합니다.
- plot() 메서드로 t와 x 데이터 포인트를 시간 영역 파형으로 그립니다.
- 점선 스타일의 그리드를 배치하고 X축 여백을 설정합니다.
- specgram() 메서드를 사용하여 스펙트로그램을 그립니다.
- 스펙트로그램 축에도 같은 스타일의 그리드를 적용합니다.
- show() 메서드로 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt import numpy as np plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True dt = 0.0005 t = np.arange(0.0, 20.0, dt) s1 = np.sin(2 * np.pi * 100 * t) s2 = 2 * np.sin(2 * np.pi * 400 * t) s2[t <= 10] = s2[12 <= t] = 0 nse = 0.01 * np.random.random(size=len(t)) x = s1 + s2 + nse NFFT = 1024 Fs = int(1.0 / dt) fig, (ax1, ax2) = plt.subplots(nrows=2) ax1.plot(t, x) ax1.grid(axis="x", ls="dotted", lw=2, color="red") ax1.margins(x=0) Pxx, freqs, bins, im = ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900) ax2.grid(axis="x", ls="dotted", lw=2, color="red") plt.show()
코드 설명
이 예제에서는 100Hz 사인파(s1)와 10~12초 구간에만 존재하는 400Hz 사인파(s2), 그리고 약간의 무작위 잡음(nse)을 합성한 신호 x를 사용합니다.
첫 번째 서브플롯(ax1)에는 신호의 시간 영역 파형이 표시되고, 두 번째 서브플롯(ax2)에는 specgram()으로 계산된 스펙트로그램이 표시됩니다. 여기서 NFFT=1024는 FFT 윈도우 크기, Fs는 샘플링 주파수(2000Hz), noverlap=900은 인접 세그먼트 간 겹치는 샘플 수를 의미합니다.
실행 결과
위 코드를 실행하면 상단에 원본 신호의 파형이, 하단에 시간-주파수 분포를 보여주는 스펙트로그램이 함께 출력됩니다. 스펙트로그램에서 100Hz 성분은 전체 구간에 걸쳐 나타나고, 400Hz 성분은 10~12초 사이에서만 진한 색으로 표시되는 것을 확인할 수 있습니다.