[파이썬] scipy에서 신호 처리 (scipy.signal)

Scipy는 파이썬을 위한 과학 및 수학 라이브러리로, 신호 처리에도 많이 사용됩니다. scipy.signal 모듈은 신호 처리와 관련된 다양한 기능을 제공합니다. 이 모듈을 사용하여 신호 분석, 필터링, 스펙트럼 분석 등을 수행할 수 있습니다.

신호 생성하기

scipy.signal은 다양한 신호를 생성하는 함수를 제공합니다. 예를 들어, 사인파(Sine wave) 신호를 생성하는 코드는 다음과 같습니다:

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

# 파라미터 설정
duration = 5  # 신호의 지속 시간
sampling_freq = 100  # 샘플링 주파수
frequency = 5  # 사인파의 주파수

# 시간 배열 생성
t = np.arange(0, duration, 1/sampling_freq)

# 사인파 생성
x = np.sin(2 * np.pi * frequency * t)

# 시간 영역 그래프 그리기
plt.plot(t, x)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Sine Wave')
plt.show()

위 코드는 5초 동안의 5Hz 주파수를 가진 사인파를 생성하고, 그래프로 표현합니다.

필터링

scipy.signal은 다양한 필터링 기술을 지원합니다. 예를 들어, 저주파 통과 필터(Lowpass filter)를 적용하는 코드는 다음과 같습니다:

from scipy import signal

# 신호 파라미터 설정
sampling_freq = 1000  # 샘플링 주파수
nyquist_freq = 0.5 * sampling_freq  # 나이퀴스트 주파수
cutoff_freq = 100  # 차단 주파수

# 저주파 통과 필터 설계
b, a = signal.butter(4, cutoff_freq/nyquist_freq, btype='low', analog=False, output='ba')

# 필터링할 신호 생성
t = np.linspace(0, 1, sampling_freq, endpoint=False)
x = np.sin(2 * np.pi * 50 * t) + 0.5*np.sin(2 * np.pi * 120 * t)

# 필터링 수행
filtered_x = signal.lfilter(b, a, x)

# 결과 그래프 그리기
plt.plot(t, x, label='Original Signal')
plt.plot(t, filtered_x, '-r', label='Filtered Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Lowpass Filter')
plt.legend()
plt.show()

위 코드는 100Hz의 저주파 통과 필터를 적용하여, 원본 신호 및 필터링된 신호를 그래프로 표현합니다.

스펙트럼 분석

scipy.signal은 신호의 주파수 스펙트럼 분석을 위한 함수들도 제공합니다. 예를 들어, FFT(Fast Fourier Transform)를 사용하여 신호의 주파수 스펙트럼을 계산하는 코드는 다음과 같습니다:

from scipy import signal

# 신호 파라미터 설정
sampling_freq = 1000  # 샘플링 주파수
duration = 2  # 신호의 지속 시간

# 시간 배열 생성
t = np.linspace(0, duration, int(sampling_freq * duration), endpoint=False)

# 신호 생성
sine_wave = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 20 * t)

# 주파수 스펙트럼 계산
frequencies, power_spectrum = signal.periodogram(sine_wave, fs=sampling_freq)

# 주파수 스펙트럼 그래프 그리기
plt.plot(frequencies, power_spectrum)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power Spectral Density')
plt.title('Frequency Spectrum')
plt.show()

위 코드는 5Hz와 20Hz의 주파수를 가진 사인파를 생성하고, 이의 주파수 스펙트럼을 계산하여 그래프로 표현합니다.

이처럼 scipy.signal 모듈은 파이썬에서 신호 처리를 위한 강력하고 유용한 기능들을 제공합니다. 다양한 신호 처리 작업을 수행할 때, scipy를 사용하면 편리하고 빠른 개발이 가능합니다.