[파이썬][Scipy] Signal Processing (신호 처리) 함수 예제

scipy.signal 모듈은 다양한 신호 처리 및 필터링 작업을 위한 함수를 제공합니다. 아래 예제에서는 몇 가지 신호 처리 작업을 수행하는 방법을 보여줍니다.

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

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

예제 1: 신호 생성 및 푸리에 변환

신호를 생성하고 해당 신호의 푸리에 변환을 계산하여 주파수 영역에서의 특성을 분석합니다.

# 시간 범위 설정
t = np.linspace(0, 1, 1000, False)

# 주파수와 진폭 설정
freq = 5
amplitude = 2
signal_waveform = amplitude * np.sin(2 * np.pi * freq * t)

# 시간 도메인에서의 신호 플롯
plt.figure(figsize=(10, 4))
plt.subplot(121)
plt.plot(t, signal_waveform)
plt.title('Time Domain Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')

# 주파수 도메인에서의 푸리에 변환 플롯
frequencies, spectrum = signal.periodogram(signal_waveform)
plt.subplot(122)
plt.semilogy(frequencies, spectrum)
plt.title('Frequency Domain Signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power/Frequency Density')

plt.tight_layout()
plt.show()

예제 2: FIR 필터 설계 및 필터링

윈도우 기반 FIR 필터를 설계하고, 주어진 입력 신호에 필터를 적용합니다.

# 입력 신호 생성
n = 400
t = np.linspace(0, 4, n, endpoint=False)
signal_input = np.sin(2 * np.pi * 0.5 * t) + 0.5 * np.random.randn(n)

# FIR 필터 설계 (윈도우 기반)
numtaps = 29  # 필터 계수 수
nyquist_freq = 1 / 2.0
cutoff_freq = 0.6 * nyquist_freq
fir_coeff = signal.firwin(numtaps, cutoff_freq, window='hamming')

# 필터 적용
signal_filtered = signal.lfilter(fir_coeff, 1.0, signal_input)

# 결과 시각화
plt.figure(figsize=(10, 4))
plt.subplot(121)
plt.plot(t, signal_input)
plt.title('Input Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')

plt.subplot(122)
plt.plot(t, signal_filtered)
plt.title('Filtered Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()

예제 3: FFT (Fast Fourier Transform) 및 주파수 스펙트럼 분석

FFT를 사용하여 주파수 스펙트럼을 계산하고 주파수 도메인에서의 신호 특성을 분석합니다.

# 입력 신호 생성
t = np.linspace(0, 1, 1000, False)
signal_input = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 20 * t)

# FFT를 사용하여 주파수 스펙트럼 계산
frequencies, spectrum = signal.welch(signal_input)

# 주파수 도메인에서의 스펙트럼 플롯
plt.figure(figsize=(8, 4))
plt.semilogy(frequencies, spectrum)
plt.title('Power Spectral Density')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power/Frequency (dB/Hz)')

plt.tight_layout()
plt.show()

위의 예제에서는 시간 도메인 및 주파수 도메인에서의 신호 처리 작업을 보여줍니다. scipy.signal 모듈은 신호 처리 및 필터링 작업을 수행하는데 매우 유용한 함수를 제공합니다.