SciPy 신호 버터

Anika Tabassum Era 2024년2월15일
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()

그리고 출력 프로젝트:

  1. 노이즈 신호(입력 신호) 플롯

    signal.butter 1

  2. 필터링된 신호(Butterworth 필터 적용 후)

    signal.butter 2

  3. 잡음이 있는 신호와 필터링된 신호를 함께 미리보기

    signal.butter 3

마지막 코드 펜스에서와 같이 matplotlib를 사용하여 결과를 표시하는 방법을 볼 수 있습니다. 첫 번째 플롯(마젠타색)에는 생성된 노이즈 신호가 있고 y축 값에서 신호 피크가 10 및 -10에 도달하는 것을 알 수 있습니다.

두 번째 플롯(주황색)에서 필터링된 신호의 세로 축에서 6에서 -6까지의 제한이 있음을 알 수 있습니다. 측정은 이득과 전체 주파수 범위를 기반으로 합니다.

최종 플롯(파란색과 주황색)은 버터워스 필터가 입력 신호에 대해 어떻게 연속적으로 작동하는지 보여줍니다. 이 플롯은 이전 두 플롯의 병합된 버전입니다.

Anika Tabassum Era avatar Anika Tabassum Era avatar

Era is an observer who loves cracking the ambiguos barriers. An AI enthusiast to help others with the drive and develop a stronger community.

LinkedIn Facebook