[파이썬][Scipy] scipy.signal 예제

scipy.signal 모듈은 신호 처리 및 필터링과 관련된 다양한 작업을 수행하는데 사용됩니다. 아래 예제에서는 신호 필터링과 FFT (Fast Fourier Transform)를 사용한 주기성 데이터 분석에 대한 간단한 예제를 제공합니다.

먼저, 필요한 모듈을 가져옵니다:

mport numpy as np
import matplotlib.pyplot as plt
from scipy import signal

예제 1: 신호 필터링

이 예제에서는 잡음이 섞인 신호를 만들고 이를 필터링하여 잡음을 제거합니다.

# 원본 신호 생성 (50 Hz 사인파에 5 Hz 주파수의 잡음 추가)
fs = 1000  # 샘플링 주파수
t = np.arange(0, 1, 1/fs)
signal_noise = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 5 * t)

# Low-pass 필터 디자인 (주파수 컷오프 100 Hz)
nyquist = 0.5 * fs
cutoff = 100
normal_cutoff = cutoff / nyquist
b, a = signal.butter(4, normal_cutoff, btype='low', analog=False)

# 필터 적용
filtered_signal = signal.lfilter(b, a, signal_noise)

# 결과 시각화
plt.figure(figsize=(10, 6))
plt.plot(t, signal_noise, 'b-', label='Noisy Signal')
plt.plot(t, filtered_signal, 'r-', linewidth=2, label='Filtered Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.legend()
plt.grid(True)
plt.show()

예제 2: FFT를 사용한 주기성 데이터 분석

이 예제에서는 FFT를 사용하여 주기성 데이터의 주파수 구성을 분석합니다.

# 주기성 데이터 생성 (2 Hz와 10 Hz의 사인파 조합)
t = np.linspace(0, 1, fs, endpoint=False)
signal_periodic = np.sin(2 * np.pi * 2 * t) + np.sin(2 * np.pi * 10 * t)

# FFT 수행
frequencies = np.fft.fftfreq(len(t), 1/fs)
fft_values = np.fft.fft(signal_periodic)

# 결과 시각화
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(t, signal_periodic, 'b-')
plt.title('Periodic Signal (2 Hz and 10 Hz)')

plt.subplot(2, 1, 2)
plt.plot(frequencies, np.abs(fft_values), 'r-')
plt.title('FFT of Periodic Signal')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude')
plt.grid(True)
plt.tight_layout()
plt.show()

이 예제에서는 FFT를 사용하여 주파수 영역에서 주파수 성분을 분석하고, 주기성 데이터의 주요 주파수를 확인할 수 있습니다.

scipy.signal 모듈은 다양한 신호 처리 작업에 사용될 수 있으며, 필터링, 스펙트럼 분석, FFT 등 다양한 기능을 제공합니다. 위의 예제는 이러한 기능 중 일부를 소개한 것입니다.