SciPy를 사용한 신호 처리 방법
SciPy를 사용하여 신호 처리를 수행하는 방법에 대한 단계별 튜토리얼입니다.
단계 1: 필요한 라이브러리 가져오기
먼저 필요한 라이브러리를 가져와야 합니다. 이 경우, 신호 처리 작업에는 scipy.signal을 사용하고 배열 조작에는 numpy를 사용합니다.
import numpy as np
from scipy import signal
단계 2: 신호 생성하기
다음으로, 작업할 간단한 신호를 생성해 봅시다. 이 튜토리얼에서는 사인파 신호를 생성합니다.
# 신호의 매개변수 정의하기
주파수 = 10 # 주파수 (Hz)
진폭 = 1 # 진폭
샘플링률 = 100 # 초당 샘플 수
지속시간 = 1 # 신호 지속시간 (초)
# 시간 축 생성하기
t = np.linspace(0, 지속시간, int(샘플링률 * 지속시간), endpoint=False)
# 사인파 신호 생성하기
신호데이터 = 진폭 * np.sin(2 * np.pi * 주파수 * t)
단계 3: 신호 그래프 그리기
신호를 처리하기 전에 matplotlib을 사용하여 시각화해 봅시다.
import matplotlib.pyplot as plt
plt.plot(t, 신호데이터)
plt.xlabel('시간 (초)')
plt.ylabel('진폭')
plt.title('신호')
plt.show()
단계 4: 필터 적용하기
이제 scipy.signal 라이브러리를 사용하여 신호에 저역 통과 필터를 적용해 봅시다. 여기서는 Butterworth 필터를 사용합니다.
# 필터 매개변수 정의하기
차단주파수 = 5 # 차단 주파수 (Hz)
필터차수 = 4 # 필터 차수
# Butterworth 필터 생성하기
b, a = signal.butter(필터차수, 차단주파수 / (샘플링률 / 2), 'low')
# 신호에 필터 적용하기
필터링된신호 = signal.lfilter(b, a, 신호데이터)
단계 5: 필터링된 신호 그래프 그리기
저역 통과 필터의 효과를 시각화하기 위해 필터링된 신호를 그래프로 그려봅시다.
plt.plot(t, 신호데이터, label='원본 신호')
plt.plot(t, 필터링된신호, label='필터링된 신호')
plt.xlabel('시간 (초)')
plt.ylabel('진폭')
plt.title('저역 통과 필터가 적용된 신호')
plt.legend()
plt.show()
단계 6: 푸리에 변환 수행하기
신호의 주파수 내용을 분석하기 위해 scipy.fft 모듈을 사용하여 푸리에 변환을 수행할 수 있습니다.
# 푸리에 변환 수행하기
신호스펙트럼 = np.fft.fft(신호데이터)
# 주파수 축 생성하기
주파수 = np.fft.fftfreq(len(신호데이터), 1 / 샘플링률)
# 스펙트럼 그래프 그리기
plt.plot(주파수, np.abs(신호스펙트럼))
plt.xlabel('주파수 (Hz)')
plt.ylabel('크기')
plt.title('신호 스펙트럼')
plt.show()
단계 7: 스펙트로그램 생성하기
마지막으로, scipy.signal 모듈을 사용하여 신호의 스펙트로그램을 생성해 봅시다.
# 스펙트로그램 매개변수 정의하기
윈도우크기 = 256
오버랩 = int(윈도우크기 * 0.75)
# 스펙트로그램 계산하기
주파수, 시간, 스펙트로그램 = signal.spectrogram(신호데이터, fs=샘플링률, window='hann',
nperseg=윈도우크기, noverlap=오버랩)
# 스펙트로그램 그래프 그리기
plt.pcolormesh(시간, 주파수, 10 * np.log10(스펙트로그램), shading='auto')
plt.colorbar(label='파워 스펙트럼 밀도 (dB/Hz)')
plt.xlabel('시간 (초)')
plt.ylabel('주파수 (Hz)')
plt.title('스펙트로그램')
plt.show()
여기까지입니다! 이제 SciPy를 사용하여 신호 처리를 성공적으로 수행했습니다. 특정 신호 처리 요구에 대해 SciPy 라이브러리에서 제공하는 더 많은 함수와 기술을 탐색해 보세요.