[python] SciPy를 사용하여 디지털 신호 처리하기

개요

이 블로그 포스트에서는 SciPy 라이브러리를 사용하여 디지털 신호를 처리하는 방법에 대해 알아보겠습니다. 디지털 신호 처리는 신호의 분석, 변환 및 필터링을 포함하는 작업으로, 음악, 음성, 센서 데이터 등의 처리에 매우 유용합니다.

SciPy 라이브러리 소개

SciPy는 과학 및 공학 연산에 필요한 다양한 기능과 알고리즘을 제공하는 파이썬 라이브러리입니다. 디지털 신호 처리를 위한 신호 처리 모듈인 scipy.signal은 신호 생성, 필터링, 스펙트럼 분석, 신호 변환 등 다양한 기능을 제공합니다.

디지털 신호 생성하기

SciPy를 사용하여 다양한 형태의 디지털 신호를 생성할 수 있습니다. 다음은 사인 함수를 사용하여 1초 동안의 샘플 신호를 생성하는 예제 코드입니다.

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

t = np.linspace(0, 1, num=1000)
x = np.sin(2 * np.pi * 5 * t)  # 주파수 5Hz의 사인 함수

plt.plot(t, x)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Generated Signal')
plt.show()

위 코드를 실행하면 시간에 따른 사인 함수의 그래프를 볼 수 있습니다. 생성된 신호는 주파수 5Hz의 사인 함수이며, 1초 동안 1000개의 샘플이 있습니다.

신호 필터링하기

SciPy를 사용하여 신호에 필터를 적용하여 원하는 주파수 대역의 신호를 추출할 수 있습니다. 다음은 저역 통과 필터를 적용하여 신호에서 3Hz 이하의 주파수를 제거하는 예제 코드입니다.

sos = signal.butter(10, 3, 'hp', fs=1000, output='sos')  # 3Hz 이하의 주파수를 제거하는 저역 통과 필터
filtered_signal = signal.sosfilt(sos, x)

plt.plot(t, filtered_signal)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Filtered Signal')
plt.show()

위 코드를 실행하면 신호의 3Hz 이하 주파수 대역이 제거된 필터링된 신호를 확인할 수 있습니다.

신호 스펙트럼 분석하기

SciPy를 사용하여 신호의 주파수 스펙트럼을 분석할 수 있습니다. 다음은 주파수 대역 분석을 위해 퓨리에 변환을 사용하는 예제 코드입니다.

frequencies, power_spectrum = signal.periodogram(x, fs=1000)

plt.plot(frequencies, power_spectrum)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power Spectrum')
plt.title('Power Spectrum Analysis')
plt.show()

위 코드를 실행하면 주파수 대역별로 신호의 파워 스펙트럼을 확인할 수 있습니다.

결론

이 블로그 포스트에서는 SciPy 라이브러리를 사용하여 디지털 신호 처리를 위한 기본적인 작업을 다루었습니다. SciPy의 다양한 기능과 알고리즘을 활용하여 신호 처리에 대한 세부적인 분석과 변환 작업을 수행할 수 있습니다. 추가적인 자세한 내용은 SciPy 공식 문서를 참조하시기 바랍니다.