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

파이썬 Matplotlib로 각도(위상) 스펙트럼 그리기 – 단계별 완벽 가이드

신호 처리에서 각도 스펙트럼(angle spectrum)은 주파수 영역에서 각 주파수 성분의 위상(phase)이 어떻게 분포되어 있는지 보여주는 그래프입니다. 파이썬의 Matplotlib는 phase_spectrum() 메서드를 기본 제공하기 때문에 복잡한 FFT 계산을 직접 구현하지 않고도 위상 스펙트럼을 손쉽게 시각화할 수 있습니다.

아래 단계를 순서대로 따라 하면 누구나 각도 스펙트럼을 그릴 수 있습니다.

구현 단계

  1. 그림(figure) 크기를 설정하고 서브플롯 사이와 주변의 여백(padding)을 조정합니다.
  2. 재현 가능한 결과를 위해 난수 시드(random seed) 값을 지정합니다.
  3. 샘플링 간격 dt를 초기화하고, 이를 바탕으로 샘플링 주파수(Fs = 1/dt)를 계산합니다.
  4. np.arange()를 사용해 시간 축 데이터 t를 생성합니다.
  5. numpy를 활용해 노이즈 성분인 nse(백색 잡음), r(지수 감소 함수), cnse(컨볼루션된 잡음)와 최종 신호 s를 만듭니다.
  6. subplots() 메서드로 그림과 서브플롯 집합을 생성합니다.
  7. set_title()로 플롯의 제목을 지정합니다.
  8. phase_spectrum() 메서드로 각도 스펙트럼을 그립니다. 이때 Fs 매개변수에 샘플링 주파수를 전달합니다.
  9. 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("Phase Spectrum")
axs.phase_spectrum(s, Fs=Fs, color='C2')

plt.show()

실행 결과

위 코드를 실행하면 진폭 0.1의 사인파와 컨볼루션된 잡음이 합성된 신호 s의 각도(위상) 스펙트럼이 그려집니다. 그래프의 x축은 주파수(Hz)를, y축은 해당 주파수 성분의 위상 값을 나타내며, 사인파 성분과 잡음 성분이 주파수 영역에서 어떻게 위상 분포를 형성하는지 한눈에 확인할 수 있습니다.

파이썬 Matplotlib로 각도(위상) 스펙트럼 그리기 – 단계별 완벽 가이드

핵심 포인트 정리

  • phase_spectrum(x, Fs)는 입력 신호 x의 FFT를 계산한 뒤 각 주파수 성분의 위상을 반환합니다.
  • Fs는 샘플링 주파수로, x축의 주파수 스케일을 결정하는 중요한 매개변수입니다.
  • color 매개변수를 사용하면 그래프 선의 색상을 자유롭게 지정할 수 있습니다(예: 'C2').
  • np.random.seed()를 설정해 두면 실행할 때마다 동일한 난수가 생성되어 결과를 재현할 수 있습니다.