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

파이썬 Matplotlib로 신호(Signal) 플롯 그리는 방법 완벽 가이드

데이터 분석이나 신호 처리 작업을 하다 보면 노이즈가 섞인 신호를 시각화해야 하는 경우가 자주 발생합니다. 이번 글에서는 파이썬의 대표적인 시각화 라이브러리인 MatplotlibNumPy를 활용해 신호 플롯을 그리는 방법을 단계별로 자세히 알아보겠습니다.

신호 플롯 그리기: 단계별 절차

  • 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
  • 매 실행 시 동일한 결과를 얻을 수 있도록 랜덤 시드(seed) 값을 고정합니다.
  • 샘플링 간격(sampling interval)을 나타내는 dt를 초기화하고, 이를 바탕으로 샘플링 주파수를 계산합니다.
  • 시간 축인 t에 대한 데이터 포인트를 생성합니다.
  • 노이즈를 생성하기 위해 NumPy를 사용하여 nse, r, cnse, s 값을 구합니다.
  • subplots() 메서드로 figure와 서브플롯을 생성합니다.
  • 플롯의 제목을 설정합니다.
  • ts 데이터 포인트를 플롯에 그립니다.
  • x축과 y축의 레이블을 지정합니다.
  • 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("Signal")
axs.plot(t, s, color='C0')
axs.set_xlabel("Time")
axs.set_ylabel("Amplitude")

plt.show()

실행 결과

위 코드를 실행하면 아래와 같은 그래프가 출력됩니다. 진폭 0.1의 사인파에 지수적으로 감쇠하는 노이즈가 더해진 형태의 신호가 시간 축을 따라 자연스럽게 표현됩니다.

파이썬 Matplotlib로 신호(Signal) 플롯 그리는 방법 완벽 가이드

코드 핵심 포인트 정리

  • np.random.seed(0): 시드 값을 고정하여 매번 같은 난수가 생성되도록 함으로써 결과의 재현성을 확보합니다.
  • dt와 Fs: 샘플링 간격(dt)이 작아질수록 샘플링 주파수(Fs)는 커지며, 더욱 촘촘하고 정밀한 신호 표현이 가능합니다.
  • np.convolve(): 백색 잡음(nse)을 지수 감쇠 함수(r)와 컨볼루션하여 색상 잡음(colored noise) 형태의 cnse를 생성합니다.
  • 신호 합성: 기본 사인파(0.1 × sin(4πt))에 노이즈 성분을 더해 실제 환경에서 관측되는 것과 유사한 신호를 만들어 냅니다.

이처럼 Matplotlib와 NumPy를 조합하면 몇 줄의 코드만으로도 현실적인 신호 데이터를 손쉽게 시각화할 수 있습니다. 샘플링 간격이나 노이즈 강도를 조절하며 다양한 실험을 해보시길 권장합니다.