はじめに
「ノイズを取りたい」「特定の周波数だけ残したい」「波形を滑らかにしたい」——信号処理の現場で どのフィルタを選ぶべきか に迷うことは多いはずです。線形位相が必要なのか、リアルタイム性が必要なのか、外れ値に強くしたいのか。要求仕様が違えば最適なフィルタは変わります。
本記事は、当ブログにある 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 フィルタ系(固定係数・低計算量・急峻)
- バターワースフィルタの設計とPython実装 — 通過域最大平坦、汎用 LP/HP の標準解。
- チェビシェフフィルタの設計原理とPython実装 — リプルを許して急峻さを稼ぐ実用フィルタ。
- 楕円(Elliptic / Cauer)フィルタの設計と特性 — 同じ次数で最も急峻、両域リプル。
- ベッセルフィルタの理論とPython実装 — 群遅延最平坦、過渡応答重視の制御系・計測向け。
周波数特性別フィルタ
- ローパスフィルタの設計と比較 — 入門に最適、Butter/Cheby/Elliptic の比較。
- ハイパスフィルタの設計とPython実装 — DC 除去・ドリフト除去の定番。
- バンドパスフィルタの設計とPython実装 — 特定帯域抽出、変調復調の前段。
- ノッチフィルタの設計とPython実装 — 電源ハム除去、Q 値設計。
FIR / 平均系(線形位相・軽量)
- FIR フィルタと IIR フィルタの比較 — 安定性・位相直線性・計算量のトレードオフ。
- 移動平均フィルタの仕組みと実装 — 最も単純な FIR、完全線形位相。
- 指数移動平均(EMA)の理論とPython実装 — 1 次 IIR、リアルタイム平滑の超軽量解。
- Savitzky–Golay フィルタの理論と実装 — 多項式局所近似によるピーク保存平滑。
適応・統計系(時変・最適化ベース)
- 適応フィルタ(LMS/RLS)の理論とPython実装 — エコーキャンセル、システム同定の中核。
- Wiener フィルタの理論と実装 — MMSE 最適、ノイズ除去・信号復元のゴールド標準。
- 相補フィルタ(Complementary Filter)の理論と実装 — センサ融合(IMU 姿勢推定)の軽量解。
特殊用途・非線形
- メディアンフィルタの理論とPython実装 — 外れ値除去・エッジ保存、非線形の代表。
評価・解析ツール
- ボード線図の読み方と作成 — 全フィルタの周波数応答を読み解く共通言語。
- 高速フーリエ変換(FFT)の仕組みとPython実装 — フィルタ前後のスペクトル比較に必須。
- 窓関数と PSD 推定の実践 — リーケージ抑制とパワースペクトル密度推定。
まとめ
- フィルタ選定は 目的(軸 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
関連ツール
- DevToolBox - 開発者向け無料ツール集 - JSON整形、正規表現テスターなど85種類以上の開発者向けツール
- CalcBox - 暮らしの計算ツール - 統計計算、周波数変換など61種類以上の計算ツール