위상 스펙트럼(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)입니다.
- r과 cnse: 지수 감쇠 함수를 잡음과 컨볼루션(convolution)하여 시간에 따라 상관관계가 있는 컬러드 노이즈를 만듭니다.
- s: 진폭 0.1, 주파수 2Hz의 사인파(sin(4πt))에 컬러드 노이즈를 합친 최종 신호입니다.
- axs.phase_spectrum(s, Fs=Fs, color='C2'): 신호 s의 위상 스펙트럼을 계산해 그리며, 색상은 'C2'(녹색 계열)로 지정합니다.
실행 결과
코드를 실행하면 x축은 주파수(Hz), y축은 위상(degrees)을 나타내는 위상 스펙트럼 그래프가 출력됩니다.
