Signal Processing

SciPyのsignal.butterによるバターワースフィルタ設計

Spread the love

SciPyライブラリは強力な科学計算用リソースであり、そのscipy.signalモジュールは包括的な信号処理ツールを提供します。フィルタリングは信号処理の基本的な側面であり、バターワースフィルタは通過帯域で最大限に平坦な振幅特性を持つため、頻繁に使用されます。この記事では、SciPy内でこれらのフィルタを設計するための重要なツールであるscipy.signal.butter関数について詳しく説明します。

目次

バターワースフィルタの理解

バターワースフィルタは、通過帯域内で最大限に平坦な振幅特性を持つことで知られています。この特性により、目的の周波数範囲での信号歪みを最小限に抑えることができます。ただし、この平坦さは、阻止帯域(フィルタが信号を減衰させる周波数範囲)でのロールオフが比較的緩やかになるという代償を伴います。より急峻なロールオフを実現するには、より高いフィルタ次数が必要です。

scipy.signal.butterの使い方

scipy.signal.butter関数は、SciPyでバターワースフィルタを設計するための主要なツールです。主なパラメータは次のとおりです。

  • N:フィルタ次数。次数が高いほどロールオフは急峻になりますが、複雑さと潜在的な不安定性が増します。
  • Wn:カットオフ周波数(帯域通過フィルタと帯域阻止フィルタの場合は周波数)、ナイキスト周波数(サンプリングレートの半分)で正規化されます。0.5の値はサンプリングレートの半分を表します。
  • btype:フィルタの種類:’lowpass’、’highpass’、’bandpass’、または’bandstop’。
  • analogTrueはアナログフィルタを設計し、False(デフォルト)はデジタルフィルタを設計します。
  • output:出力形式を指定します。’ba’(分子と分母の係数)と’sos’(2次セクション)が一般的なオプションです。特に高次フィルタでは、数値的安定性のために’sos’が一般的に推奨されます。

例:ローパスバターワースフィルタの設計

サンプリングレート100Hzを想定し、カットオフ周波数10Hzの4次ローパスバターワースフィルタを設計してみましょう。


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

# サンプリングレート
fs = 100  # Hz

# カットオフ周波数(正規化済み)
cutoff = 10 / (fs / 2)  # ナイキスト周波数で正規化

# フィルタ次数
order = 4

# 安定性のためにSOSを使用してフィルタを設計
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')

# SOSを出力
print("Second-order sections (sos):", sos)

例:フィルタの適用と可視化

フィルタを適用し、結果を可視化するには、次の手順に従います。


# 例の信号
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)

# フィルタを適用
filtered_sig = signal.sosfilt(sos, sig)

# 元の信号とフィルタリングされた信号をプロット
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='元の信号')
plt.plot(t, filtered_sig, label='フィルタリングされた信号')
plt.xlabel('時間 (s)')
plt.ylabel('振幅')
plt.title('元の信号とフィルタリングされた信号')
plt.legend()
plt.grid(True)
plt.show()

結論

scipy.signal.butterは、バターワースフィルタを設計するための強力なツールです。そのパラメータを理解し、数値的安定性のために’sos’出力を利用することは、信号処理ワークフローにおける効果的なフィルタ設計に不可欠です。カットオフ周波数をナイキスト周波数で正規化することを忘れないでください。Matplotlibを使用してフィルタの応答を可視化することで、理解を深め、パフォーマンス分析を行うことができます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です