デジタルフィルタ設計指針ハブ:選び方・特性比較・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 の群遅延平坦性とステップ応答の綺麗さ が、定量的・視覚的に並列比較できます。記事内のフィルタ選定で迷ったときは、まずこのスケルトンに候補を流し込んで挙動を見るのが最速です。

4 フィルタを実際に数値化する

evaluate_filter() は描画専用の関数なので、通過域変動・阻止域減衰・群遅延・オーバーシュートを 数値として 比較するには、同じ計算を行いつつ指標を集計するコードが必要です。以下は上と同じ設計(\(N=4\) 、\(f_c=100\) Hz、\(f_s=1000\) Hz)に対して実際に実行し、数値と図を得たコードです。

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

fs, fc, N = 1000.0, 100.0, 4
n_impulse = 128

designs = {
    "Bessel": signal.bessel(N, fc, fs=fs, norm="mag", output="ba"),
    "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"),
}

print(f"{'Filter':12s} {'PB変動[dB]':>11s} {'減衰@200Hz[dB]':>15s} "
      f"{'GD平均[ms]':>11s} {'GD変動幅[ms]':>12s} {'オーバーシュート[%]':>18s} {'settle@n=127':>13s}")

for name, (b, a) in designs.items():
    w, h = signal.freqz(b, a, worN=4096, fs=fs)
    mag_db = 20 * np.log10(np.abs(h) + 1e-12)
    w_gd, gd = signal.group_delay((b, a), w=4096, fs=fs)
    gd_ms = gd / fs * 1000.0
    step = np.ones(n_impulse)
    h_step = signal.lfilter(b, a, step)

    pb = (w >= 1) & (w <= 90)
    pb_var = mag_db[pb].max() - mag_db[pb].min()
    atten_200 = np.interp(200.0, w, mag_db)

    gdpb = (w_gd >= 1) & (w_gd <= 90)
    gd_pb = gd_ms[gdpb]
    gd_mean, gd_span = gd_pb.mean(), gd_pb.max() - gd_pb.min()

    overshoot = (h_step.max() - 1.0) * 100.0
    settle = h_step[-1]

    print(f"{name:12s} {pb_var:11.3f} {atten_200:15.2f} "
          f"{gd_mean:11.3f} {gd_span:12.3f} {overshoot:18.2f} {settle:13.4f}")

実行結果:

Filter        PB変動[dB]  減衰@200Hz[dB]  GD平均[ms]  GD変動幅[ms]  オーバーシュート[%]  settle@n=127
Bessel              2.360           -16.34       3.340        0.244               2.18        1.0000
Butterworth         1.484           -27.97       4.848        2.501              11.91        1.0000
Chebyshev I         1.000           -38.27       5.697        6.302               9.23        0.8912
Elliptic            1.000           -40.88       5.186        7.256              11.00        0.8912

同一次数(N=4)・同一カットオフ(fc=100Hz)のButterworth/Chebyshev I/Elliptic/Besselを、インパルス応答・ボード線図(振幅)・群遅延・ステップ応答の4パネルで比較した図。ChebyshevとEllipticのステップ応答は1.0ではなく0.891付近で水平に張り付き、群遅延はBesselが全帯域でほぼ一定なのに対し他の3種は通過域端でピークを作る

数値と図を突き合わせると、「軸 3」の表で述べた特性が定量的に裏付けられます。群遅延変動幅は Bessel が \(0.244\) ms と圧倒的に小さく(Butterworth の約 1/10、Elliptic の約 1/30)、その結果ステップ応答のオーバーシュートも \(2.18\%\) と最小です。一方、Butterworth・Elliptic はほぼ同程度のオーバーシュート(\(11\) 〜\(12\%\) )を示しており、「オーバーシュートの大小」だけでは通過域平坦性を重視する Butterworth と急峻さを重視する Elliptic を区別できない点に注意してください。

落とし穴:等リプル系フィルタは「1.0 に収束しない」ことがある

上の実行結果と図をよく見ると、Chebyshev I と Elliptic のステップ応答は \(n=127\) 時点で \(0.8912\) に留まっており、Bessel・Butterworth のように \(1.0\) へ収束していません。これはシミュレーション区間が短すぎて収束し切れていないのでしょうか。それとも本当の定常値なのでしょうか。区間を \(n=2000\) まで延ばして確認します。

import numpy as np
from scipy import signal

fs, fc, N = 1000.0, 100.0, 4
designs = {
    "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"),
}
step = np.ones(2000)
for name, (b, a) in designs.items():
    y = signal.lfilter(b, a, step)
    print(f"{name:12s} y[127]={y[127]:.4f}  y[300]={y[300]:.4f}  y[1999]={y[1999]:.6f}")

実行結果:

Chebyshev I  y[127]=0.8912  y[300]=0.8913  y[1999]=0.891251
Elliptic     y[127]=0.8912  y[300]=0.8913  y[1999]=0.891251

\(n=1999\) まで延ばしても値は \(0.891251\) のまま変化しません。つまりこれは収束不足ではなく、正真正銘の直流(\(\Omega=0\) )ゲイン です。

チェビシェフフィルタの記事 で示した通り、I 型の振幅特性は

\[ |H(j\Omega)|^2 = \frac{1}{1+\varepsilon^2 T_N^2(\Omega)} \]

で与えられ、チェビシェフ多項式の偶奇対称性

\[ T_N(-\Omega) = (-1)^N T_N(\Omega) \]

から \(T_N(0)=0\) (\(N\) 奇数)または \(T_N(0)=\pm1\) (\(N\) 偶数)が導かれます。したがって DC ゲインは奇数次で \(1\) (\(0\) dB)、偶数次で \(1/\sqrt{1+\varepsilon^2}=10^{-R_p/20}\) になります。\(R_p=1\) dB のとき \(10^{-1/20}=0.8913\) で、上の実測値と一致します。

楕円(Elliptic)フィルタはこの \(T_N\) を有理チェビシェフ関数(elliptic rational function)\(R_N(\Omega; L)\) に置き換えた

\[ |H(j\Omega)|^2 = \frac{1}{1+\varepsilon^2 R_N^2(\Omega; L)} \]

という同型の等リプル特性関数を使います。\(R_N\) は \(T_N\) と同じ「等リプル最良近似」という構成原理から定義される有理関数であり、同じ偶奇対称性

\[ R_N(-\Omega) = (-1)^N R_N(\Omega) \]

を満たします。ゆえに \(N\) が奇数なら \(R_N(0)=0\) (DC ゲイン \(1\) )、偶数なら \(R_N(0)=\pm1\) (DC ゲイン \(10^{-R_p/20}\) )という、チェビシェフ I 型と全く同じ偶奇則が楕円フィルタにも成立します。次数を変えて実測すると、この予測が正確に一致することを確認できます。

from scipy import signal
import numpy as np

fs, fc = 1000.0, 100.0
for N in [3, 4, 5, 6]:
    b, a = signal.cheby1(N, 1.0, fc, fs=fs, output="ba")
    dc_cheby = np.abs(signal.freqz(b, a, worN=[0], fs=fs)[1][0])
    be, ae = signal.ellip(N, 1.0, 40.0, fc, fs=fs, output="ba")
    dc_ellip = np.abs(signal.freqz(be, ae, worN=[0], fs=fs)[1][0])
    print(f"N={N} ({'奇数' if N % 2 else '偶数'}): "
          f"Chebyshev I DC={dc_cheby:.4f} ({20*np.log10(dc_cheby):+.3f} dB)  "
          f"Elliptic DC={dc_ellip:.4f} ({20*np.log10(dc_ellip):+.3f} dB)")

実行結果:

N=3 (奇数): Chebyshev I DC=1.0000 (-0.000 dB)  Elliptic DC=1.0000 (+0.000 dB)
N=4 (偶数): Chebyshev I DC=0.8913 (-1.000 dB)  Elliptic DC=0.8913 (-1.000 dB)
N=5 (奇数): Chebyshev I DC=1.0000 (+0.000 dB)  Elliptic DC=1.0000 (-0.000 dB)
N=6 (偶数): Chebyshev I DC=0.8913 (-1.000 dB)  Elliptic DC=0.8913 (-1.000 dB)

理論通り、奇数次では両フィルタとも DC ゲイン \(0\) dB、偶数次では \(-R_p\) dB(今回は \(-1\) dB)にきれいに揃います。この記事のように複数フィルタ族を横並びで比較するとき、等リプル系(Chebyshev I/II・Elliptic)は次数の偶奇だけで最終値が変わる ため、「ステップ応答が \(1.0\) に達していない = まだ収束していない」と早合点しないよう注意してください。実務では、比較対象を全て奇数次に揃えるか、20 * np.log10(np.abs(signal.freqz(b, a, worN=[0])[1][0])) で DC ゲインを直接確認してから議論するのが安全です。

なお、上のコードではすべて output="ba"(伝達関数係数)を使っていますが、これは \(N=4\) 程度の低次数だから許容できる書き方です。次数が \(8\) 次を超えるあたりから ba 形式は係数の桁落ちで数値的に不安定になりやすく、 バターワース記事ベッセル記事 でも触れている通り output="sos"sosfilt/sosfreqz に切り替えるのが定石です。

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

最新研究動向

固定係数 IIR と適応フィルタの境界を曖昧にする研究が近年進んでいます。Rota, Ratmanski, Coldenhoff, & Cernak (2026) は、補聴器向けのオンデバイス音声強調のために、35 個の 2 次セクション(SOS)を縦続接続した微分可能な IIR カスケードの係数を、軽量なニューラルコントローラがリアルタイムに予測する手法(TVF: Time-Varying Filtering)を提案しました。パラメータ数はわずか 24k、レイテンシ 10.7 ms でオンデバイス動作しながら、各 SOS セクションが明示的なイコライザカーブとして解釈可能なまま音声強調性能を確保しています(arXiv:2603.02794)。本記事の「シナリオ 8」で述べた 2 次 SOS カスケードによる安定実装 という古典的な設計パターンを、係数固定の IIR から一歩進めて「係数をニューラルネットが動的に生成する」形に拡張した好例であり、Axis 2(実装形式)で固定 IIR と適応フィルタを分けて論じてきた本記事の枠組みが、両者の中間形態によって書き換えられつつあることを示しています。

また、Javadi, Rezaee, Nabavi, Gadringer, & Bösch (2025) は、マイクロ波フィルタの物理設計(アイリス幅・共振器長など)を XGBoost などの機械学習モデルで直接予測する手法を提案し、最適化前の予測値が最適化後の値と 90% 以上一致することを示しました(Electronics, 14(2), 367)。これは「仕様だけ与えれば係数・パラメータが決まる」という scipy.signal.iirdesign 的な自動化の思想を、ハードウェアフィルタの物理パラメータ設計にまで拡張したものと位置づけられます。

関連記事ガイド

ここでは関連記事をカテゴリ別に整理し、それぞれの位置づけを 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
  • Rota, R., Ratmanski, K., Coldenhoff, J., & Cernak, M. (2026). An Interpretable, Controllable Time-Varying IIR Denoiser for On-Device Assistive Hearing. arXiv:2603.02794. https://arxiv.org/abs/2603.02794
  • Javadi, S., Rezaee, B., Nabavi, S. S., Gadringer, M. E., & Bösch, W. (2025). Machine Learning-Driven Approaches for Advanced Microwave Filter Design. Electronics, 14(2), 367. https://doi.org/10.3390/electronics14020367

おすすめ書籍

はじめて学ぶディジタル・フィルタと高速フーリエ変換(三上直樹)

ディジタルフィルタとFFTの原理を基礎から丁寧に解説した入門書です。本記事のButterworth/Chebyshev/FIRなどの特性比較を、数式レベルでより深く理解したい場合の副読本として役立ちます。

※ 上記は Amazon アソシエイトのリンクです。


関連ツール