SciPy 신호 버터

Python의 소형 라이브러리인 ‘SciPy’는 최적화, 통계 및 기타 여러 매개변수를 고려하여 몇 가지 중요한 수준의 알고리즘을 발행합니다. 이 라이브러리의 signal
패키지는 신호 처리와 관련된 공통 기능에 중점을 둡니다.
버터워스 필터는 특수한 종류의 디지털 필터이며 모션 분석 및 오디오 회로에서 가장 일반적으로 사용되는 필터 중 하나입니다. 또한 signal
패키지 아래 함수의 문서에는 Matlab
스타일 IIR
필터 설계를 보장하는 butter
가 포함되어 있습니다.
필터를 수동으로 설계하는 것은 포괄적인 작업이며 필터를 적용한 후 응답을 모니터링하는 것은 어렵습니다.
따라서 Python 라이브러리는 수동 사례를 모방하기 위해 보다 직관적인 기능(디지털 및 아날로그 신호 모두)으로 업데이트됩니다. scipy.signal.butter
는 그러한 추가 사항입니다.
다음 섹션에서는 scipy.signal.butter
를 사용하는 Butterworth 대역 통과 필터의 예를 다룹니다. 이것은 컷오프
(lowcut
, highcut
) 주파수를 갖는 것을 의미합니다. 따라서 필터는 범위가 지정된 응답만 허용합니다.
따라서 피크 값은 폐기되고 감쇠 및 위상차에서 최상의 절충안을 사용하여 상대적으로 평평한 신호 주파수가 달성됩니다.
Python에서 scipy.signal.butter
사용
특히 butter
기능은 전체 2
필수 매개변수를 사용합니다. 첫째, 필터의 강도를 의미하는 주문
이 필요합니다.
순서가 높을수록 최상의 출력 수준이 예상됩니다. 다음으로 배열과 같은 객체에는 통과대역과 정지대역 주파수가 있습니다.
Nyquist 속도는 샘플링 속도를 결정하는 데 크게 기여합니다. 그 외에는 앨리어싱 문제가 있어 데이터가 있는 중요한 주파수를 잃을 위험이 있습니다.
이 개념은 코딩 예제에서 일부 식으로 표현됩니다.
기술적으로 작업은 노이즈 신호를 받는 것입니다. 버터
기능을 통해 예상 범위 주파수를 필터링합니다.
따라서 특정 사례에 필요한 “잔물결 없음” 플랫 응답을 얻습니다. 더 나은 이해를 위해 코드 블록으로 이동하겠습니다.
코드 조각:
from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt
처음에는 가져오기가 수행됩니다. 우리는 코딩 편집기에 Google Colab을 사용했습니다.
다음 링크는 기본 코드 베이스로 리디렉션됩니다.
다음으로 두 개의 사용자 정의 함수가 있습니다. 첫 번째는 컷오프 주파수를 계산한 다음 버터
기능을 통해 필터 계수(b, a
)를 반환합니다.
그리고 다음 함수는 입력 신호(필터링이 필요한 신호)를 가지며 필터링된 신호(y
)를 반환합니다. 수업을 봅시다.
def butter_bandpass(lowcut, highcut, fs, order):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype="band")
return b, a
def butter_bandpass_filter(x, lowcut, highcut, fs, order):
b, a = butter_bandpass(lowcut, highcut, fs, order)
y = lfilter(b, a, x)
return y
다음 단계에서는 신호를 개발하는 데 필요한 주파수, 주기 및 기타 대부분의 매개변수를 사용하여 잡음이 있는 무작위 신호를 생성합니다. 노이즈 신호를 필터링하기 위해 butter_bandpass()
및 butter_bandpass_filter()
함수를 호출합니다.
def filtering():
fs = 5000.0
lowcut = 500.0
highcut = 1000.0
T = 0.05
nsamples = int(T * fs)
t = np.linspace(0, T, nsamples, endpoint=False)
sig = np.sin(2 * np.pi * 2 * t)
noise = 5 * np.random.randn(nsamples)
x = sig + noise
order = 5
plt.figure(figsize=(10, 12))
plt.subplot(3, 1, 1)
plt.plot(t, x, "m", label="Noisy signal")
plt.legend(loc="upper left")
plt.grid(True)
plt.axis("tight")
y = butter_bandpass_filter(x, lowcut, highcut, fs, order)
plt.subplot(3, 1, 2)
plt.plot(t, y, "orange", label="Filtered signal")
plt.xlabel("time (seconds)")
plt.grid(True)
plt.axis("tight")
plt.legend(loc="upper left")
plt.subplot(3, 1, 3)
plt.plot(t, x, label="Noisy signal")
plt.plot(t, y, label="Filtered signal")
plt.show()
filtering()
그리고 출력 프로젝트:
-
노이즈 신호(입력 신호) 플롯
-
필터링된 신호(Butterworth 필터 적용 후)
-
잡음이 있는 신호와 필터링된 신호를 함께 미리보기
마지막 코드 펜스에서와 같이 matplotlib
를 사용하여 결과를 표시하는 방법을 볼 수 있습니다. 첫 번째 플롯(마젠타색)에는 생성된 노이즈 신호가 있고 y축
값에서 신호 피크가 10 및 -10
에 도달하는 것을 알 수 있습니다.
두 번째 플롯(주황색)에서 필터링된 신호의 세로 축에서 6에서 -6
까지의 제한이 있음을 알 수 있습니다. 측정은 이득
과 전체 주파수 범위를 기반으로 합니다.
최종 플롯(파란색과 주황색)은 버터워스 필터가 입력 신호에 대해 어떻게 연속적으로 작동하는지 보여줍니다. 이 플롯은 이전 두 플롯의 병합된 버전입니다.