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

Matplotlib에서 pylab의 specgram()처럼 스펙트로그램을 그리는 방법

Matplotlib에서 pylab의 specgram() 함수와 동일한 방식으로 스펙트로그램을 그리려면 아래 단계를 따르면 됩니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 간의 여백을 조정합니다.
  • numpy를 사용하여 t, s1, s2, nse, x, NFFT, Fs 데이터 포인트를 생성합니다.
  • subplots() 메서드에 nrows=2를 지정하여 새로운 그림을 생성하거나 기존 그림을 활성화합니다.
  • plot() 메서드로 tx 데이터 포인트를 시간 영역 파형으로 그립니다.
  • 점선 스타일의 그리드를 배치하고 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초 사이에서만 진한 색으로 표시되는 것을 확인할 수 있습니다.