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

파이썬 Matplotlib에서 위상 스펙트럼(Phase Spectrum)을 그리는 방법

위상 스펙트럼(Phase Spectrum)은 신호를 구성하는 각 주파수 성분이 가진 위상 정보를 시각화한 그래프입니다. 파이썬의 Matplotlib에서는 phase_spectrum() 메서드를 사용하면 별도의 푸리에 변환 과정 없이 손쉽게 위상 스펙트럼을 그릴 수 있습니다.


위상 스펙트럼을 그리는 단계

  • 그림(figure) 크기를 설정하고 서브플롯 사이와 주변의 여백(padding)을 조정합니다.
  • 결과의 재현성을 위해 난수 시드(seed) 값을 설정합니다.
  • 샘플링 간격 dt를 초기화하고, 이를 이용해 샘플링 주파수(Fs)를 계산합니다.
  • t에 대한 임의의 데이터 포인트를 생성합니다.
  • 노이즈를 만들기 위해 NumPy를 사용해 nse, r, cnse, s를 생성합니다.
  • subplots() 메서드를 사용해 figure와 서브플롯 세트를 만듭니다.
  • 플롯의 제목을 설정합니다.
  • phase_spectrum() 메서드로 위상 스펙트럼을 그립니다.
  • show() 메서드를 호출해 그림을 화면에 표시합니다.

예제 코드

아래 예제에서는 사인파 신호에 지수적으로 감쇠하는 필터를 적용한 컬러드 노이즈(colored noise)를 더한 신호 s를 생성한 뒤, 이 신호의 위상 스펙트럼을 그립니다.

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("Phase Spectrum")
axs.phase_spectrum(s, Fs=Fs, color='C2')

plt.show()

코드 설명

  • np.random.seed(0): 매번 동일한 난수가 생성되도록 시드를 고정합니다.
  • dt = 0.01: 초당 100개의 샘플을 수집하는 샘플링 간격이며, 샘플링 주파수는 Fs = 1/dt = 100Hz가 됩니다.
  • nse: 정규분포를 따르는 백색 잡음(white noise)입니다.
  • rcnse: 지수 감쇠 함수를 잡음과 컨볼루션(convolution)하여 시간에 따라 상관관계가 있는 컬러드 노이즈를 만듭니다.
  • s: 진폭 0.1, 주파수 2Hz의 사인파(sin(4πt))에 컬러드 노이즈를 합친 최종 신호입니다.
  • axs.phase_spectrum(s, Fs=Fs, color='C2'): 신호 s의 위상 스펙트럼을 계산해 그리며, 색상은 'C2'(녹색 계열)로 지정합니다.

실행 결과

코드를 실행하면 x축은 주파수(Hz), y축은 위상(degrees)을 나타내는 위상 스펙트럼 그래프가 출력됩니다.

파이썬 Matplotlib에서 위상 스펙트럼(Phase Spectrum)을 그리는 방법