신호 분석에서 전력 스펙트럼 밀도(Power Spectral Density, PSD)는 신호의 전력이 주파수 영역에 걸쳐 어떻게 분포되어 있는지 보여주는 중요한 지표입니다. Matplotlib에서는 psd() 메서드를 사용하여 손쉽게 PSD 그래프를 그릴 수 있습니다.
아래 단계를 따라 Matplotlib으로 전력 스펙트럼 밀도를 플롯할 수 있습니다.
- 그림 크기 설정: figure 크기를 지정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
- 시간 간격 정의: 변수 dt(샘플링 간격)를 초기화합니다.
- 데이터 생성: NumPy를 사용하여 t, nse, r, cnse, s 등의 데이터 포인트를 만듭니다.
- figure와 subplots 생성: 하나의 figure 안에 두 개의 축(ax0, ax1)을 가진 서브플롯을 만듭니다.
- 원본 신호 플롯:
plot()메서드를 사용하여 시간(t)과 신호(s)를 그립니다. - PSD 플롯:
psd()메서드를 호출하여 전력 스펙트럼 밀도를 계산하고 시각화합니다. - 결과 출력:
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.01 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(2 * np.pi * t) + cnse fig, (ax0, ax1) = plt.subplots(2, 1) ax0.plot(t, s) ax1.psd(s, 512, 1 / dt) plt.show()
코드 설명
위 예제에서는 먼저 샘플링 간격 dt = 0.01을 설정하고, 0부터 10까지의 시간 배열 t를 생성합니다. 이후 무작위 잡음(nse)을 지수 감소 커널(r)과 컨볼루션하여 색상 잡음(colored noise)인 cnse를 만들고, 여기에 사인파 성분을 더해 최종 신호 s를 구성합니다.
첫 번째 서브플롯(ax0)에는 시간 영역의 원본 신호가 표시되고, 두 번째 서브플롯(ax1)에는 psd(s, 512, 1 / dt)를 통해 주파수 영역의 전력 스펙트럼 밀도가 표시됩니다. 여기서 512는 NFFT(FFT 길이), 1/dt는 샘플링 주파수를 의미합니다.
출력 결과

실행 결과를 보면 위쪽 그래프에는 시간에 따른 신호 파형이 나타나고, 아래쪽 그래프에는 해당 신호의 주파수별 전력 분포가 확인됩니다. 특히 1Hz 부근에서 사인파 성분에 의한 뚜렷한 피크를 관찰할 수 있습니다.