デジタルフィルタ設計指針ハブ:選び方・特性比較・Python実装の総合ガイド

デジタルフィルタ設計の指針・比較・Python実装をハブ的に整理。Butterworth/Chebyshev/Elliptic/Bessel/FIR/MA/EMA/Median/適応フィルタを3軸(用途・実装・優先指標)で選び分け、共通評価フレームワークまで体系化します。

はじめに

「ノイズを取りたい」「特定の周波数だけ残したい」「波形を滑らかにしたい」——信号処理の現場で どのフィルタを選ぶべきか に迷うことは多いはずです。線形位相が必要なのか、リアルタイム性が必要なのか、外れ値に強くしたいのか。要求仕様が違えば最適なフィルタは変わります。

本記事は、当ブログにある 11 種類以上のフィルタ解説記事を 横断的に整理するハブ として機能します。フィルタ選定の 3 軸(目的・実装形式・優先指標)、特性比較マトリクス、用途別の決定フロー、共通評価フレームワーク(ボード線図 ベース)、そして関連記事への誘導までを一気通貫でまとめます。個別フィルタの詳細は各記事に委ねつつ、「どれを選ぶか」を最短ルートで判断できる地図 を提供することが目的です。

フィルタ選定の 3 軸

実用上、デジタルフィルタの選定は次の 3 つの直交する軸で考えると整理しやすくなります。

軸 1: 周波数特性目的(何を通し、何を止めるか)

種類通す帯域主な用途
ローパス (LP)\(f < f_c\)アンチエイリアシング、平滑化、低周波抽出
ハイパス (HP)\(f > f_c\)DC オフセット除去、ドリフト除去、エッジ強調
バンドパス(BP)\(f_1 < f < f_2\)特定帯域抽出、変調信号復調
バンドストップ\(f < f_1\) or \(f > f_2\)広帯域ノイズ除去
ノッチ\(f \approx f_0\) のみ阻止電源ハム(50/60 Hz)除去、狭帯域干渉除去
オールパス全帯域通過(位相のみ変化)位相補正、群遅延等化

詳細は ローパスハイパスバンドパスノッチ の各記事を参照してください。

軸 2: 実装形式(FIR / IIR / 固定 / 適応)

区分代表例特徴
FIR(固定)窓関数法、Parks–McClellan、移動平均、Savitzky–Golay必ず安定、線形位相が可能、計算量大
IIR(固定)Butterworth、Chebyshev、Elliptic、Bessel少ない次数で急峻、安定性に注意、位相は非線形
適応(時変)LMS、RLS、Wiener環境変化に追従、所望信号や参照信号が必要、収束特性の調整が必要
非線形(ロバスト)メディアン、双方向、形態学外れ値に強い、エッジ保存、線形理論では扱えない

FIR と IIR の数理的な比較は FIR vs IIR 比較 に詳しくまとめています。

軸 3: 設計優先指標(何を最優先するか)

フィルタの周波数応答 \(H(j\omega)\) には、互いにトレードオフする複数の評価指標があります。

指標数式・定義重視する場面
通過域の平坦性\(\max_{f \in \text{pass}} \big\| \|H(jf)\| - 1 \big\|\)計測、HiFi 音声、医療信号
阻止域の減衰量\(\min_{f \in \text{stop}} 20\log_{10}\|H(jf)\|\)アンチエイリアシング、干渉除去
遷移帯域の急峻さロールオフ [dB/oct]スペクトル分離、チャネル化
位相直線性\(\angle H(j\omega) \propto \omega\)音声、画像、医療波形
群遅延平坦性\(\tau_g(\omega) = -d\angle H/d\omega\) が定数過渡応答が大事な制御系・通信
リプル許容通過域・阻止域でのリプル振幅設計の自由度を上げる代償
計算コスト1サンプルあたりの乗算・加算回数組込み、リアルタイム制御

通過域平坦性を最優先すれば Butterworth、急峻さを最優先すれば Elliptic、位相を最優先すれば線形位相 FIR か Bessel、というように 「優先指標 → フィルタ種類」のマッピング が立ち上がります。

特性比較マトリクス

代表的なフィルタを横並びで比較すると、選定の見通しが一気に良くなります。

フィルタ通過域平坦性阻止域減衰位相特性群遅延計算コスト適用例
Butterworth最大平坦緩やか非線形中程度汎用 LP/HP、計測
Chebyshev Iリップル有急峻端で大きく回 る大きい通過域より阻止域重視
Chebyshev II平坦リップル有阻止域に許容ノイズ
Elliptic(楕円)リップル有リップル有最も非線形大きい最小次数で最急峻
Bessel滑らか緩やかほぼ線形最平坦過渡応答重視、制御系
移動平均(MA)\(\text{sinc}\) 型弱い線形\((N-1)/2\)極小平滑化、トレンド抽出
EMA(指数移動平均)1 次 IIR LP緩やか非線形小さい極小リアルタイム平滑化、トラッキング
Savitzky–Golayピーク保存中程度線形\((N-1)/2\)化学・分光、ピーク保存平滑
FIR(窓関数法)設計次第設計次第完全線形\((N-1)/2\)中〜大音声、画像、医療
メディアン非線形非線形定義不可\((N-1)/2\)インパルス除去、エッジ保存
Wiener信号統計依存信号統計依存最適 MSE設計依存ノイズ除去、信号復元
適応(LMS/RLS)時変時変時変時変中〜大エコーキャンセル、干渉除去
相補(Complementary)加算で平坦加算で平坦設計依存設計依存極小センサ融合(IMU 姿勢推定)

このマトリクスを 「優先したい列」から横に読む のが選定の基本姿勢です。たとえば「群遅延が最平坦」が必須なら Bessel、「最も急峻」なら Elliptic、「線形位相 + 計算量極小」なら移動平均、というように1列の最良値を持つフィルタが第一候補になります。

用途別 決定フロー

実問題でどのフィルタを選ぶか、典型的な 10 シナリオに沿って意思決定の流れを整理します。

シナリオ 1: 単純に波形を滑らかにしたい(リアルタイム)

EMA(指数移動平均) が第一候補。1 次 IIR で乗算 1 回・加算 1 回しか要らず、組込みでも軽量。応答が早く位相遅れも小さい。重い平滑が必要なら時定数 \(\alpha\) を下げる。

シナリオ 2: オフライン処理で位相歪み無しに平滑化したい

移動平均(MA) または scipy.signal.filtfilt + 任意 IIR。前者は完全線形位相、後者はゼロ位相(前後 2 回掛けで位相が打ち消される)。

シナリオ 3: ピークやエッジを潰さずに平滑化したい

Savitzky–Golay フィルタ。多項式局所近似で平滑化するため、ピークの位置と高さが MA より大幅に保存される。化学・分光分析の定番。

シナリオ 4: スパイク状の外れ値ノイズを除きたい

メディアンフィルタ。線形フィルタは外れ値を周辺に「塗り広げて」しまうが、メディアンは順序統計なので 1 サンプルのスパイクを完全除去できる。エッジも保存される。

シナリオ 5: 急峻なロールオフが必要(アンチエイリアシング、チャネル分離)

→ 次数小で済ませたいなら Elliptic(楕円)、リップル不可なら Butterworth で次数を上げる。両者の中間が Chebyshev

シナリオ 6: 位相直線性が必須(音声、医療波形、画像)

線形位相 FIR が原則。係数対称性により厳密に線形位相になる。次数が大きくなる代償あり。IIR でも近似的に位相直線性が欲しい場合は Bessel が次善。

シナリオ 7: 過渡応答(ステップ応答)の歪みを最小化したい(制御系、計測トリガ)

Bessel フィルタ が最適。群遅延が最大限平坦なため、複数周波数成分が同じ遅延で出力され、波形形状が保たれる。オーバーシュートも最小。

シナリオ 8: リアルタイムで軽量な組込み実装

EMA > MA > 低次 Butterworth の順で軽い。IIR は 2 次 SOS(Second-Order Sections)でカスケード実装すると安定。

シナリオ 9: 電源ハム(50/60 Hz)や狭帯域干渉のピンポイント除去

ノッチフィルタ。Q 値(帯域幅)を狭くするほど周辺信号への影響が少なくなる。設計簡単で、scipy.signal.iirnotch で 1 行。

シナリオ 10: 環境が時間変化する/参照信号がある(エコー除去、ANC、システム同定)

適応フィルタ(LMS/RLS)。固定係数では追従できない時変系で必須。MMSE 最適解が事前に分かるなら Wiener フィルタ がゴールド標準。複数センサ融合なら 相補フィルタ で計算量を抑える。

早見ツリー

┌─ 外れ値(インパルス)が主体? ──> Median
├─ 線形位相が必須?
│   ├─ Yes ──> FIR(窓関数 / Parks-McClellan)or Bessel
│   └─ No
│       │
│       ├─ 急峻なロールオフ最優先? ──> Elliptic > Chebyshev > Butterworth
│       ├─ 通過域平坦性最優先?     ──> Butterworth
│       └─ 過渡応答最優先?         ──> Bessel
├─ リアルタイム + 超軽量? ──> EMA / MA
├─ ピーク保存平滑?        ──> Savitzky-Golay
├─ 電源ハム除去?          ──> Notch
└─ 時変/参照信号あり?    ──> Adaptive (LMS/RLS) / Wiener / Complementary

設計パラメータの選び方

カットオフ周波数の正規化

scipy.signal の多くは 正規化周波数 \(W_n = f_c / (f_s/2)\) を要求します。\(f_s\) がサンプリング周波数、\(f_c\) が物理的カットオフ周波数で、\(W_n \in (0, 1)\) 。fs= 引数を渡すと物理周波数のまま指定でき、ミスが減ります。

次数の決定則

通過域減衰 \(A_p\) [dB]、阻止域減衰 \(A_s\) [dB]、通過域端 \(f_p\) 、阻止域端 \(f_s\) を仕様として与えれば、scipy.signal.iirdesign が必要次数とフィルタ係数を自動算出します。

from scipy import signal

# 仕様: fs=1000Hz, 通過域 ≤80Hz で減衰1dB以内, 阻止域 ≥120Hz で40dB以上減衰
sos = signal.iirdesign(
    wp=80, ws=120, gpass=1.0, gstop=40.0, fs=1000.0,
    ftype="ellip",  # 'butter' / 'cheby1' / 'cheby2' / 'ellip' / 'bessel'
    output="sos",
)

経験則として、仕様だけ与えて iirdesign に任せる のが最初の一手。次数を手動指定したい場合は butter / cheby1 / ellip / bessel を直接呼びます。

リプル許容

Chebyshev I / Elliptic では rp(通過域リプル [dB])、Chebyshev II / Elliptic では rs(阻止域減衰 [dB])を指定します。リプル 1 dB は耳には聞こえない程度ですが、計測機器ではしばしば不可。「リプルを許すと次数が下がる」 のがトレードオフです。

群遅延制約

群遅延が一定値以下であることが要求されるなら、まず Bessel を検討。それでも不足ならオールパスフィルタを縦続して位相を補正します。scipy.signal.group_delay((b, a), w=...) で評価できます。

FIR 次数の経験式

カイザー窓 FIR では遷移帯域幅 \(\Delta f\) と阻止域減衰 \(A_s\) [dB] から次数 \(N\) を見積もれます。

\[ N \approx \frac{A_s - 8}{2.285 \, \cdot 2\pi \, \Delta f / f_s} \tag{1} \]

scipy.signal.firwin(N, fc, fs=fs, window=("kaiser", beta)) か、より高性能な signal.remez(Parks–McClellan)で設計します。

from scipy import signal

# FIR ローパス: 1024タップ、カットオフ 100Hz、ハミング窓
taps = signal.firwin(1024, cutoff=100, fs=1000.0, window="hamming")

# メディアンフィルタ: ウィンドウサイズ 5
y = signal.medfilt(x, kernel_size=5)

共通評価フレームワーク

どのフィルタを設計しても、最終評価は インパルス応答・周波数応答(ボード線図)・群遅延・ステップ応答 の 4 点セットを並べて確認するのが定石です。以下のスケルトンは任意のフィルタ係数 (b, a) または sos を取り、4 点を一括描画します。

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


def evaluate_filter(b, a, fs=1000.0, n_impulse=128, title="Filter"):
    """任意の IIR/FIR フィルタの 4 点評価."""
    # 1) インパルス応答
    impulse = np.zeros(n_impulse)
    impulse[0] = 1.0
    h_imp = signal.lfilter(b, a, impulse)

    # 2) 周波数応答(ボード線図)
    w, h = signal.freqz(b, a, worN=4096, fs=fs)
    mag_db = 20 * np.log10(np.abs(h) + 1e-12)
    phase_deg = np.degrees(np.unwrap(np.angle(h)))

    # 3) 群遅延
    w_gd, gd = signal.group_delay((b, a), w=4096, fs=fs)

    # 4) ステップ応答
    step = np.ones(n_impulse)
    h_step = signal.lfilter(b, a, step)

    fig, axes = plt.subplots(2, 2, figsize=(12, 8))

    axes[0, 0].stem(np.arange(n_impulse), h_imp, basefmt=" ")
    axes[0, 0].set_title("Impulse Response")
    axes[0, 0].set_xlabel("n [samples]")
    axes[0, 0].grid(alpha=0.3)

    ax_m = axes[0, 1]
    ax_m.semilogx(w, mag_db, label="Magnitude [dB]")
    ax_m.set_ylim(-80, 5)
    ax_m.set_title("Bode (Magnitude)")
    ax_m.set_xlabel("Frequency [Hz]")
    ax_m.grid(True, which="both", alpha=0.3)

    axes[1, 0].semilogx(w_gd, gd)
    axes[1, 0].set_title("Group Delay [samples]")
    axes[1, 0].set_xlabel("Frequency [Hz]")
    axes[1, 0].grid(True, which="both", alpha=0.3)

    axes[1, 1].plot(np.arange(n_impulse), h_step)
    axes[1, 1].axhline(1.0, color="gray", linestyle=":")
    axes[1, 1].set_title("Step Response")
    axes[1, 1].set_xlabel("n [samples]")
    axes[1, 1].grid(alpha=0.3)

    fig.suptitle(title)
    plt.tight_layout()
    plt.show()


# 比較例: 同じカットオフ・同次数で 4 種を評価
fs, fc, N = 1000.0, 100.0, 4
for name, design in [
    ("Butterworth", signal.butter(N, fc, fs=fs, output="ba")),
    ("Chebyshev I", signal.cheby1(N, 1.0, fc, fs=fs, output="ba")),
    ("Elliptic", signal.ellip(N, 1.0, 40.0, fc, fs=fs, output="ba")),
    ("Bessel", signal.bessel(N, fc, fs=fs, norm="mag", output="ba")),
]:
    b, a = design
    evaluate_filter(b, a, fs=fs, title=f"{name} N={N}, fc={fc}Hz")

このフレームワークを通すと、Butterworth の通過域平坦性、Chebyshev のリプル、Elliptic の最急峻ロールオフ、Bessel の群遅延平坦性とステップ応答の綺麗さ が、定量的・視覚的に並列比較できます。記事内のフィルタ選定で迷ったときは、まずこのスケルトンに候補を流し込んで挙動を見るのが最速です。

詳細な周波数応答の読み方は ボード線図の読み方と作成 を、入力信号のスペクトル解析と組み合わせるには FFT窓関数 + PSD を参照してください。

関連記事ガイド

ここでは関連記事をカテゴリ別に整理し、それぞれの位置づけを 1 文で示します。

IIR フィルタ系(固定係数・低計算量・急峻)

周波数特性別フィルタ

FIR / 平均系(線形位相・軽量)

適応・統計系(時変・最適化ベース)

特殊用途・非線形

評価・解析ツール

まとめ

  • フィルタ選定は 目的(軸 1)・実装形式(軸 2)・優先指標(軸 3) の 3 軸で考えると整理しやすい
  • 特性比較マトリクス から「優先したい列」を縦に読めば、第一候補のフィルタが即座に決まる
  • 用途別の決定フローでは、外れ値除去(Median)・位相直線性(FIR/Bessel)・急峻性(Elliptic)・リアルタイム軽量(EMA/MA)・時変系(Adaptive)が分岐の主要因
  • 設計の出発点は scipy.signal.iirdesign仕様だけ与える こと。次数も自動で最小化される
  • 最終評価は インパルス応答・ボード線図・群遅延・ステップ応答 の 4 点セットを共通フレームワークで並べる

個別フィルタの数理と詳細実装は上記の関連記事を参照してください。各記事はこのハブから縦に深堀りできるよう構成されています。

参考文献

  • Oppenheim, A. V., & Schafer, R. W. (2009). Discrete-Time Signal Processing (3rd ed.). Prentice Hall.
  • Proakis, J. G., & Manolakis, D. G. (2006). Digital Signal Processing: Principles, Algorithms, and Applications (4th ed.). Prentice Hall.
  • Parks, T. W., & Burrus, C. S. (1987). Digital Filter Design. Wiley.
  • Smith, S. W. (1997). The Scientist and Engineer’s Guide to Digital Signal Processing. California Technical Publishing.
  • scipy.signal — SciPy documentation

関連ツール