SciPy signal.butter

Anika Tabassum Era 2023年6月21日
SciPy signal.butter

Python のコンパクトなライブラリであるSciPyは、最適化、統計、およびその他の多くのパラメーターを考慮したいくつかの重要なレベルのアルゴリズムを発行します。 このライブラリの signal パッケージは、信号処理に関連する一般的な機能に焦点を当てています。

バターワース フィルターは、特別な種類のデジタル フィルターであり、モーション解析やオーディオ回路で使用される最も一般的なフィルターの 1つです。 また、signal パッケージの関数の ドキュメント には、Matlab スタイルの IIR フィルター設計を保証する butter が含まれています。

フィルターを手動で設計することは包括的なタスクであり、フィルターを適用した後の応答を監視することは困難です。

そのため、Python ライブラリは、より直感的な関数 (デジタル信号とアナログ信号の両方) で更新され、手動のケースを模倣します。 scipy.signal.butter はそのような追加です。

次のセクションでは、scipy.signal.butter を使用したバターワース バンドパス フィルターの例について説明します。 これは、カットオフ(ローカットハイカット) 周波数を持つことを意味します。 したがって、フィルターは範囲の応答のみを受け入れます。

したがって、ピーク値は破棄され、減衰と位相差の最適な妥協点で比較平坦化された信号周波数が達成されます。

Python で scipy.signal.butter を使用する

具体的には、butter 関数は、全体として 2 個の必須パラメータを取ります。 まず、フィルターの強さを意味する 次数 を取ります。

次数が高いほど、最高レベルの出力が期待されます。 次に、配列のようなオブジェクトには通過帯域と阻止帯域の周波数があります。

ナイキスト レートは、サンプリング レートの決定に大きく影響します。 それ以外には、エイリアシングの問題があり、データを持つ重要な周波数が失われるリスクがあります。

この概念は、いくつかの式の観点からコーディング例に示されています。

技術的には、タスクはノイズの多い信号を取得することです。 butter 関数を使用して、予想される範囲の周波数をフィルター処理します。

したがって、特定のケースに必要なリップルのないフラットな応答が得られます。 理解を深めるために、コード ブロックにジャンプしましょう。

コードスニペット:

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

最初に、インポートが実行されます。 コーディング エディタには Google Colab を使用しています。

次の リンク からメイン コード ベースにリダイレクトされます。

次に、2つのユーザー定義関数を用意します。 最初のものはカットオフ周波数を計算し、次に butter 関数を介してフィルター係数 (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. フィルター処理された信号 (バターワース フィルターを適用した後)

    signal.butter 2

  3. ノイズの多い信号とフィルタリングされた信号を一緒にプレビュー

    signal.butter 3

前回のコード フェンスと同様に、matplotlib を使用して結果を表示した方法がわかります。 最初のプロット (マゼンタ) には、生成されたノイズの多い信号があり、y 軸 の値から、信号のピークが 10 と -10 に達していることがわかります。

2 番目のプロット (オレンジ色) では、フィルタリングされた信号の縦軸が 6 から -6 に制限されていることがわかります。 測定値は、gain と全体の周波数範囲に基づいています。

最後のプロット (青とオレンジ) は、バターワース フィルターが入力信号に対してどのように連続して機能したかを示しています。 このプロットは、前の 2つのプロットをマージしたものです。

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