본문 바로가기
Python Library/SciPy

[SciPy] 버터워스 필터 (Butterworth Filter)

by goatlab 2023. 7. 5.
728x90
반응형
SMALL

버터워스 필터 (Butterworth Filter)

 

버터워스 필터는 주파수 응답 특성이 매우 부드러운 필터로, 위상 왜곡을 최소화하는 필터이다. 버터워스 필터는 주파수 영역에서 특정 주파수 범위를 통과시키고, 그 외의 주파수 범위는 차단하는 필터이다. 버터워스 필터는 주파수 응답 특성을 설정할 수 있는 매개 변수인 Q값을 가지고 있다. Q값이 높을수록 주파수 응답 특성이 더 부드러워지고, 위상 왜곡이 줄어든다. 버터워스 필터로 위상 왜곡을 없애려면 Q값을 매우 높게 설정해야 한다. Q값을 너무 높게 설정하면 필터의 통과 대역폭이 매우 좁아져서 필터링된 신호의 품질이 저하될 수 있다. 따라서, Q값을 적절하게 설정하여 위상 왜곡을 최소화하고 필터링된 신호의 품질을 유지해야 한다.

 

Q값은 품질 계수를 의미한다. 품질 계수는 필터의 통과 / 차단 대역폭과 중심 주파수에 의해 결정된다. Q값이 높을수록 필터의 통과 대역폭은 좁아지고, 차단 대역폭은 넓어진다. Q값이 낮을수록 필터의 통과 대역폭은 넓어지고, 차단 대역폭은 좁아진다. Q값은 버터워스 필터의 성능을 결정하는 중요한 매개변수이다. Q값을 적절하게 설정하여 필터링된 신호의 품질을 향상시킬 수 있다.

 

버터워스 필터는 시간 도메인에서 측정한 결과에 적용되는 필터이고 원하지 않는 주파수 영역의 값을 필터 처리할 때 사용한다. SciPy에는 다음과 같이 N차 디지털 또는 아날로그 버터워스 필터를 설계하고 필터 계수를 반환하는 함수가 존재한다.

 

scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)
N (int) 필터의 순서이다. 'bandpass' 및 'bandstop' 필터의 경우 최종 2차 섹션 sos 행렬의 차수는 2*N이 된다 (N은 원하는 시스템의 바이쿼드 섹션 수).
Wn (array_like) 임계주파수이며 대역 통과 또는 차단인 경우 길이가 2인 수열이다.
btype
(lowpass, highpass,
bandpass, bandstop)
필터의 유형이다. 기본값은 저역 통과이다.
analog (bool) True이면 아날로그 필터를 반환하고 그렇지 않으면 디지털 필터를 반환한다.
fs (float) 디지털 시스템의 샘플링 주파수

 

예제

 

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

b, a = signal.butter(4, 100, 'low', analog=True) # 4차
w, h = signal.freqs(b, a)

plt.semilogx(w, 20 * np.log10(abs(h)))
plt.title('Butterworth filter frequency response')
plt.xlabel('Frequency [radians / second]')
plt.ylabel('Amplitude [dB]')
plt.margins(0, 0.1)
plt.grid(which='both', axis='both')
plt.axvline(100, color='green') # cutoff frequency
plt.show()

t = np.linspace(0, 1, 1000, False)  # 1 second
sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t, sig)
ax1.set_title('10 Hz and 20 Hz sinusoids')
ax1.axis([0, 1, -2, 2])
sos = signal.butter(10, (15,20), 'bp', fs=1000, output='sos')
filtered = signal.sosfilt(sos, sig)
ax2.plot(t, filtered)
ax2.set_title('After 15-20 Hz band-pass filter')
ax2.axis([0, 1, -2, 2])
ax2.set_xlabel('Time [seconds]')
plt.tight_layout()
plt.show()

 

https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html

 

scipy.signal.butter — SciPy v1.11.1 Manual

Butterworth digital and analog filter design. Design an Nth-order digital or analog Butterworth filter and return the filter coefficients. The Butterworth filter has maximally flat frequency response in the passband. The 'sos' output parameter was added in

docs.scipy.org

 

728x90
반응형
LIST

'Python Library > SciPy' 카테고리의 다른 글

[SciPy] B-spline  (0) 2023.07.31
[SciPy] 영 위상 필터 (Zero-Phase Filter)  (0) 2023.07.10
[SciPy] Special functions  (0) 2022.12.22
[SciPy] Introduction  (0) 2022.12.22
SciPy  (0) 2022.12.20