[파이썬][Scipy] lfilter, freqz, find_peaks 예제

Scipy의 신호 처리 관련 함수인 lfilter, freqz, 그리고 find_peaks의 예제를 제공하겠습니다.

lfilter 함수 예제:

lfilter 함수는 IIR (Infinite Impulse Response) 또는 FIR (Finite Impulse Response) 필터를 신호에 적용합니다. 아래 예제에서는 FIR 필터를 사용하여 시계열 데이터를 평활화하는 방법을 보여줍니다.

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

# 시계열 데이터 생성 (잡음이 있는 신호)
t = np.linspace(0, 10, 1000)
signal = np.sin(2 * np.pi * 1 * t) + 0.5 * np.random.normal(size=len(t))

# FIR 필터 생성 (평균값 필터)
filter_order = 10
b = np.ones(filter_order) / filter_order

# 필터 적용
filtered_signal = lfilter(b, 1, signal)

# 결과 플로팅
plt.plot(t, signal, label='원본 신호')
plt.plot(t, filtered_signal, label='평활화된 신호', linewidth=2)
plt.legend()
plt.xlabel('시간')
plt.ylabel('신호 값')
plt.title('FIR 필터를 사용한 평활화')
plt.grid(True)
plt.show()

freqz 함수 예제:

freqz 함수는 디지털 필터의 주파수 응답을 계산합니다. 아래 예제에서는 FIR 필터의 주파수 응답을 플로팅하는 방법을 보여줍니다.

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

# FIR 필터 생성 (저주파 통과 필터)
filter_order = 50
cutoff_frequency = 0.1
b = np.zeros(filter_order + 1)
b[filter_order // 2] = 2 * cutoff_frequency
window = np.hanning(filter_order + 1)
b *= window

# 주파수 응답 계산
w, h = freqz(b)

# 주파수 응답 플로팅
plt.plot(w, 20 * np.log10(abs(h)))
plt.title('주파수 응답 (dB)')
plt.xlabel('주파수 (rad/sample)')
plt.ylabel('감쇠 (dB)')
plt.grid(True)
plt.show()

find_peaks 함수 예제:

find_peaks 함수는 신호에서 특정 조건을 만족하는 피크를 찾습니다. 아래 예제에서는 신호에서 높은 피크를 찾는 방법을 보여줍니다.

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

# 시계열 데이터 생성 (피크를 갖는 신호)
t = np.linspace(0, 10, 1000)
signal = np.sin(2 * np.pi * 1 * t) + 0.5 * np.sin(2 * np.pi * 3 * t)

# 피크 찾기
peaks, _ = find_peaks(signal, height=0.8)

# 결과 플로팅
plt.plot(t, signal, label='신호')
plt.plot(t[peaks], signal[peaks], 'ro', label='피크')
plt.legend()
plt.xlabel('시간')
plt.ylabel('신호 값')
plt.title('신호에서 피크 찾기')
plt.grid(True)
plt.show()

print("찾은 피크 위치 (인덱스):", peaks)

위의 예제들은 Scipy의 lfilter, freqz, 그리고 find_peaks 함수를 사용하여 다양한 신호 처리 작업을 수행하는 방법을 보여줍니다.