ベッセルフィルタの設計原理とPython実装 — 群遅延一定で波形保持するscipy.signal.bessel設計例題

ベッセルフィルタの理論・設計・Python実装を群遅延最大平坦の観点から解説。scipy.signal.bessel・scipy.signal.group_delay・scipy.signal.sosfreqz・scipy.signal.sosfilt でLPF/HPF/BPFを設計し、バターワース・チェビシェフ・楕円フィルタとの矩形パルス波形保持の比較、norm='phase'/'delay'/'mag' の正しい使い分けと-3dBカットオフのずれの実測、波形保持・パルス伝送用途での選定基準まで例題つきでまとめます。

はじめに

ベッセルフィルタ(Bessel Filter)は、通過域で群遅延が最大限に平坦なIIRフィルタです。W. E. Thomsonが1952年に提案したことからThomson-Besselフィルタとも呼ばれます。

代表的なIIRフィルタの群遅延の平坦性を比較すると次のようになります(同次数の場合):

\[\text{ベッセル} > \text{バターワース} > \text{チェビシェフ} > \text{楕円}\]

ベッセルフィルタは通過帯域内で群遅延がほぼ一定であるため、異なる周波数成分の信号が同じ時間遅延でフィルタを通過します。これによりパルス波形の形状を保持できます。本記事では数学的背景から、SciPyを使った実践的な設計・実装までを解説します。

群遅延とは

群遅延(Group Delay)とは、フィルタの位相特性 \(\phi(\omega)\) の周波数に対する微分の負値です:

\[\tau(\omega) = -\frac{d\phi(\omega)}{d\omega} \tag{1}\]

群遅延が一定(周波数によらず等しい)であることは、フィルタが線形位相特性を持つことを意味します。線形位相フィルタでは、すべての周波数成分が同じ時間だけ遅延するため、信号の波形がそのまま保たれます。

音声・音楽処理、パルス波形の伝送、測定機器など、波形の形状保持が重要な用途でベッセルフィルタが選ばれます。

ベッセルフィルタの数学的背景

ベッセル多項式

ベッセルフィルタの伝達関数はベッセル多項式 \(B_n(s)\) に基づいています。逆数正規化されたベッセル多項式(\(y_n(s)\) とも書く)は漸化式で定義されます:

\[B_0(s) = 1 \tag{2}\] \[B_1(s) = s + 1 \tag{3}\] \[B_n(s) = (2n-1)B_{n-1}(s) + s^2 B_{n-2}(s) \tag{4}\]

低次のベッセル多項式を具体的に示します:

次数 \(n\)\(B_n(s)\)
1\(s + 1\)
2\(s^2 + 3s + 3\)
3\(s^3 + 6s^2 + 15s + 15\)
4\(s^4 + 10s^3 + 45s^2 + 105s + 105\)

伝達関数

\(n\) 次ベッセルローパスフィルタの伝達関数は次の形をとります:

\[H_n(s) = \frac{B_n(0)}{B_n(s/\omega_0)} = \frac{(2n-1)!!}{B_n(s/\omega_0)} \tag{5}\]

ここで \(\omega_0\) は正規化角周波数、\((2n-1)!! = 1 \cdot 3 \cdot 5 \cdots (2n-1)\) は二重階乗です。

この構成により、\(s \to 0\) すなわち低周波数域での群遅延が最大限に平坦になります。

群遅延の最大平坦性

ベッセルフィルタの群遅延 \(\tau(\omega)\) を \(\omega=0\) でテイラー展開すると、\(2n-1\) 次まで導関数がゼロになります:

\[\tau(\omega) = \tau_0 \left[ 1 + O(\omega^{2n}) \right] \tag{6}\]

これが「群遅延が最大平坦」の意味です。\(n\) が大きいほど平坦な領域が広がります。

他のIIRフィルタとの比較

フィルタ振幅平坦性遷移帯域の急峻さ群遅延特性主な用途
ベッセル最も劣る最もなだらか最大平坦波形保持・パルス伝送
バターワース最大平坦中程度比較的良好汎用ローパス
チェビシェフI等リップルバターワースより急峻非線形急峻な遮断が必要な場合
楕円(Cauer)等リップル最も急峻最も劣る最小次数で仕様を満たす場合

ベッセルフィルタは振幅特性(遮断の鋭さ)を犠牲にして位相・群遅延特性を最大化します。遷移帯域が非常になだらかなため、同じ遮断仕様を満たすには高い次数が必要です。

SciPyによる実装

SciPyでは scipy.signal.bessel() 関数でベッセルフィルタを設計できます。norm 引数で正規化方法を選べますが、デフォルトは norm='phase' であり、群遅延を \(\omega=0\) で正規化する norm='delay' ではありません(正規化方法の違いは後述の「norm パラメータの意味」で詳しく扱います)。以下の例ではベッセル本来の群遅延特性を確認しやすいよう norm='delay' を明示的に指定します。

基本的なローパスフィルタ設計

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

# ===== フィルタ設計パラメータ =====
fs = 1000      # サンプリング周波数 [Hz]
fc = 100       # カットオフ周波数 [Hz]
orders = [2, 4, 6]
colors = ['#2a78d6', '#1baf7a', '#eda100']

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

for N, color in zip(orders, colors):
    b, a = signal.bessel(N, fc, btype='low', fs=fs, norm='delay')
    w, h = signal.freqz(b, a, worN=8192, fs=fs)
    w_gd, gd = signal.group_delay((b, a), w=8192, fs=fs)

    # signal.group_delay() は fs を渡しても戻り値そのものは常に「サンプル数」単位。
    # 秒(ここではms)に変換するには必ず fs で割る必要がある。
    gd_ms = gd / fs * 1000.0

    mag_db = 20 * np.log10(np.abs(h) + 1e-300)
    idx3 = np.argmin(np.abs(mag_db + 3.0103))
    f3db = w[idx3]
    print(f"N={N}: 実際の-3dB周波数={f3db:.2f} Hz  (パラメータ上のfc={fc} Hz)")

    axes[0].plot(w, mag_db, label=f'N={N}', color=color)
    axes[0].axvline(f3db, color=color, linestyle=':', alpha=0.6)
    axes[1].plot(w_gd, gd_ms, label=f'N={N}', color=color)
    axes[1].axvline(f3db, color=color, linestyle=':', alpha=0.6)

axes[0].set_xlim(0, 400)
axes[0].set_ylim(-40, 5)
axes[0].axhline(-3.0103, color='gray', linestyle='--', linewidth=1, alpha=0.6)
axes[0].set_xlabel('周波数 [Hz]')
axes[0].set_ylabel('ゲイン [dB]')
axes[0].set_title("ベッセルフィルタ(norm='delay')ゲイン特性 — 点線は各次数の実際の-3dB点")
axes[0].legend()
axes[0].grid(True, alpha=0.3)

axes[1].set_xlim(0, 400)
axes[1].set_ylim(0, 3.0)
axes[1].set_xlabel('周波数 [Hz]')
axes[1].set_ylabel('群遅延 [ms]')
axes[1].set_title('ベッセルフィルタ 群遅延特性 — 実際の-3dB点は次数とともに右へ移動する')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('order_bandwidth_shift.png')

実行結果:

N=2: 実際の-3dB周波数=132.57 Hz  (パラメータ上のfc=100 Hz)
N=4: 実際の-3dB周波数=191.59 Hz  (パラメータ上のfc=100 Hz)
N=6: 実際の-3dB周波数=229.43 Hz  (パラメータ上のfc=100 Hz)

ベッセルフィルタのゲイン特性(上)と群遅延特性(下)を次数N=2,4,6で比較したグラフ。点線は各次数の実際の-3dB周波数を示し、norm=‘delay’では次数を上げるほど実際のカットオフ周波数がパラメータ値fcより右へ大きくずれることが分かる

ここには2つの実装上の落とし穴が埋め込まれています。

落とし穴1: group_delay() の戻り値の単位。 scipy.signal.group_delay()fs を渡しても、戻り値の群遅延 gd 自体は常にサンプル数単位のままです(fs は周波数軸 w の単位を変えるだけ)。旧版のようにこれをそのまま秒として扱うと、値のオーダーが1000倍近くずれます。実際、このフィルタの群遅延は1.5〜2.7サンプル程度なので、gd を秒だと思って0〜0.02sのスケールでプロットするとグラフの外に飛び出して何も表示されませんgd / fs で秒(上のコードではさらに1000倍してms)に変換する必要があります。

落とし穴2: norm='delay' は-3dBカットオフを保証しない。 パラメータ上は全て fc=100 Hz を指定していますが、実際の-3dBカットオフ周波数は N=2 で132.6 Hz、N=4 で191.6 Hz、N=6 で229.4 Hzと、次数が上がるほど右へ大きくずれます(最大で指定値の2.3倍)。これは norm='delay' が保証するのが「\(\omega=0\) における群遅延の絶対値」だけであり、通過域の実効的な帯域幅はノータッチのためです。上図で点線(各次数の実際の-3dB点)が右へ移動しているのが視覚的な裏付けです。

この2点目は「次数を上げれば群遅延はもっと平坦になるはずだ」という直感に反する結果を生みます。パラメータ上のfc=100Hzという1点だけで比較すると、N=2の群遅延は1.5704ms(DC比+2.05%)、N=4は1.7012ms(+10.55%)、N=6は1.7013ms(+10.55%)とN=4→6でほぼ変化がありません。上図を見ると理由は明らかで、N=2の群遅延曲線はfc=100Hz地点で既にピークを過ぎて下降に転じているのに対し、N=4・N=6の曲線はまだピークに向かって上昇中だからです(N=4・N=6は実際の-3dB点がさらに右にあるため、100Hz地点はまだ「平坦域の途中」に過ぎません)。次数間で群遅延の平坦性を公平に比較するには、共通の絶対周波数軸ではなく、各次数が実際に実現している-3dBカットオフを基準に揃える必要があります(詳細は後述の norm パラメータの節)。

他フィルタとの群遅延比較

ベッセルフィルタの群遅延平坦性を他フィルタと視覚的に比較します。前節で確認した通り norm='delay' は-3dBカットオフを固定しないため、フィルタ種別間で公平に比較するにはベッセル側を norm='mag'(-3dBカットオフをfcに一致させる正規化。詳細は後述)で設計し、全フィルタの-3dBカットオフをfc=100Hzに揃えます:

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

fs = 1000
fc = 100
N = 4

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

filters = {
    'Bessel': signal.bessel(N, fc, btype='low', fs=fs, norm='mag'),
    'Butterworth': signal.butter(N, fc, btype='low', fs=fs),
    'Chebyshev I (rp=1dB)': signal.cheby1(N, 1.0, fc, btype='low', fs=fs),
    'Elliptic (rp=1,rs=60)': signal.ellip(N, 1.0, 60.0, fc, btype='low', fs=fs),
}

colors = ['#2a78d6', '#1baf7a', '#eda100', '#e34948']

for (name, (b, a)), color in zip(filters.items(), colors):
    w, h = signal.freqz(b, a, worN=4096, fs=fs)
    w_gd, gd = signal.group_delay((b, a), w=4096, fs=fs)
    gd_ms = gd / fs * 1000.0  # サンプル数 -> ミリ秒

    mask = (w >= 1) & (w <= 90)
    gd_pb = gd_ms[mask]
    print(f"{name:24s}: 平均={gd_pb.mean():.3f}ms  最小={gd_pb.min():.3f}ms  "
          f"最大={gd_pb.max():.3f}ms  変動幅={(gd_pb.max()-gd_pb.min()):.3f}ms")

    axes[0].plot(w, 20 * np.log10(np.abs(h) + 1e-12), label=name, color=color)
    axes[1].plot(w, gd_ms, label=name, color=color)

axes[0].set_xlim(0, 300)
axes[0].set_ylim(-80, 5)
axes[0].set_xlabel('周波数 [Hz]')
axes[0].set_ylabel('ゲイン [dB]')
axes[0].set_title(f'ゲイン特性の比較(N={N}, いずれも-3dB=100Hzで統一)')
axes[0].axvline(fc, color='gray', linestyle='--', alpha=0.5)
axes[0].legend()
axes[0].grid(True, alpha=0.3)

axes[1].set_xlim(0, 150)
axes[1].set_ylim(0, 12)
axes[1].set_xlabel('周波数 [Hz]')
axes[1].set_ylabel('群遅延 [ms]')
axes[1].set_title(f'群遅延特性の比較(N={N})— ベッセルが最も平坦')
axes[1].axvline(fc, color='gray', linestyle='--', alpha=0.5)
axes[1].legend()
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('group_delay_comparison.png')

実行結果(通過域1〜90Hzにおける群遅延の統計):

Bessel                  : 平均=3.340ms  最小=3.253ms  最大=3.497ms  変動幅=0.244ms
Butterworth             : 平均=4.848ms  最小=4.021ms  最大=6.522ms  変動幅=2.501ms
Chebyshev I (rp=1dB)    : 平均=5.697ms  最小=4.148ms  最大=10.450ms  変動幅=6.302ms
Elliptic (rp=1,rs=60)   : 平均=5.539ms  最小=3.903ms  最大=10.598ms  変動幅=6.694ms

同一次数(N=4)・同一-3dBカットオフ(100Hz)に揃えたベッセル・バターワース・チェビシェフI・楕円フィルタのゲイン特性(上)と群遅延特性(下)の比較。ベッセルの群遅延曲線がほぼ水平である一方、他の3フィルタは通過域端付近で群遅延が急激に持ち上がっている

-3dBカットオフを揃えた公平な条件下では、ベッセルの群遅延変動幅(0.244ms)はバターワース(2.501ms)の約1/10、チェビシェフI型(6.302ms)・楕円(6.694ms)の約1/26〜1/27に収まります。図の下段を見ると、バターワース以下の3フィルタは通過域端(100Hz付近)で群遅延が鋭いピークを作っているのに対し、ベッセルの青線だけがほぼ水平のまま推移しています。これが「群遅延最大平坦」という設計目標の実測的な裏付けです。

ハイパス・バンドパスフィルタへの拡張

btype パラメータを変更するだけでハイパス・バンドパスフィルタを設計できます:

from scipy import signal

fs = 1000
N = 4

# ===== ハイパスフィルタ =====
sos_hp = signal.bessel(N, 200, btype='high', fs=fs, norm='delay', output='sos')
print("ハイパスフィルタ: 設計完了")

# ===== バンドパスフィルタ =====
sos_bp = signal.bessel(N, [100, 300], btype='bandpass', fs=fs, norm='delay', output='sos')
print("バンドパスフィルタ: 設計完了")

# ===== バンドストップフィルタ =====
sos_bs = signal.bessel(N, [100, 300], btype='bandstop', fs=fs, norm='delay', output='sos')
print("バンドストップフィルタ: 設計完了")

パルス波形への適用例

ベッセルフィルタの最大の利点を示す例として、矩形パルス信号を各フィルタに通した場合の波形比較を示します:

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

fs = 1000
fc = 100
N = 4
t = np.linspace(0, 0.1, int(fs * 0.1), endpoint=False)

# 矩形パルス信号(幅5ms)
x = np.zeros(len(t))
x[(t >= 0.02) & (t < 0.025)] = 1.0

# 前節と同様、公平な比較のためベッセルは norm='mag' で-3dB=fcに揃える
filters = {
    'Bessel': signal.bessel(N, fc, btype='low', fs=fs, norm='mag', output='sos'),
    'Butterworth': signal.butter(N, fc, btype='low', fs=fs, output='sos'),
    'Chebyshev I': signal.cheby1(N, 1.0, fc, btype='low', fs=fs, output='sos'),
    'Elliptic': signal.ellip(N, 1.0, 60.0, fc, btype='low', fs=fs, output='sos'),
}
colors = ['#2a78d6', '#1baf7a', '#eda100', '#e34948']

fig, axes = plt.subplots(len(filters) + 1, 1, figsize=(9, 12), sharex=True)

axes[0].plot(t * 1000, x, 'k', label='入力パルス')
axes[0].set_ylabel('振幅')
axes[0].set_title('入力信号(矩形パルス、幅5ms)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

print(f"{'フィルタ':12s} {'ピーク振幅':>10s} {'ピーク時刻[ms]':>14s} {'遅延[ms]':>10s} {'後方リンギング':>14s}")
for (name, sos), color in zip(filters.items(), colors):
    y = signal.sosfilt(sos, x)  # lfilter相当(因果的、リアルタイム)

    peak = y.max()
    peak_time = t[np.argmax(y)] * 1000
    delay = peak_time - 22.5  # 入力パルスの中心時刻(22.5ms)からの遅延
    tail_mask = t >= 0.032    # パルス後方(立ち下がり後)のリンギングを評価
    ringing = np.max(np.abs(y[tail_mask]))
    print(f"{name:12s} {peak:10.4f} {peak_time:14.2f} {delay:10.2f} {ringing:14.4f}")

for idx, ((name, sos), color) in enumerate(zip(filters.items(), colors)):
    y = signal.sosfilt(sos, x)
    ax = axes[idx + 1]
    ax.plot(t * 1000, y, label=name, color=color)
    ax.plot(t * 1000, x, 'k--', alpha=0.3, label='元のパルス')
    ax.set_ylabel('振幅')
    ax.set_title(f'{name} フィルタ後(N={N}, -3dB=100Hz)')
    ax.legend()
    ax.grid(True, alpha=0.3)

axes[-1].set_xlabel('時間 [ms]')
plt.tight_layout()
plt.savefig('pulse_response_comparison.png')

実行結果:

フィルタ              ピーク振幅      ピーク時刻[ms]     遅延[ms]        後方リンギング
Bessel           0.9396          25.00       2.50         0.0226
Butterworth      0.9433          27.00       4.50         0.1522
Chebyshev I      0.8817          28.00       5.50         0.2285
Elliptic         0.8600          28.00       5.50         0.2473

入力の矩形パルス(幅5ms、上段)と、それをベッセル・バターワース・チェビシェフI・楕円の4フィルタ(いずれもN=4、-3dB=100Hzで統一)に通した後の波形を並べた図。ベッセルはピーク後になだらかに減衰するのに対し、他の3フィルタは立ち下がり後に振動的なリンギングが残る

数値で見ると、ピーク振幅自体はベッセル(0.9396)とバターワース(0.9433)でほぼ差がありません(狭いパルスは高周波成分を多く含むため、いずれのフィルタでも通過域減衰の影響でピークは1を下回ります)。差が際立つのはむしろ 遅延の小ささリンギングの少なさ です。ベッセルのピーク遅延は2.50msと4フィルタ中最小で、パルス後方のリンギング振幅も0.0226と、バターワース(0.1522、約6.7倍)やチェビシェフI・楕円(0.23前後、約10倍)に比べて突出して小さくなっています。図でもベッセル(青)だけが立ち下がり後にほぼ振動せず単調に減衰していることが視覚的に確認できます。ベッセルフィルタの価値は「ピーク振幅を最大限保つこと」ではなく、「各周波数成分を均等に遅らせ、リンギングを残さずに波形の輪郭を保持すること」にあります。

norm パラメータの意味

scipy.signal.bessel()norm 引数は正規化方法を指定します。有効な値は 'phase''delay''mag' の3つのみです('critical' という値は存在せず、指定すると ValueError になります。SciPy 1.18時点で確認済み):

norm意味用途
'phase'角周波数 Wn で位相応答がその中間値に達するよう正規化(デフォルト、MATLABと同じ流儀)バターワースと振幅の漸近線を揃えたい場合
'delay'\(\omega=0\) での群遅延が \(1/\text{Wn}\) になるよう正規化ベッセル自身の群遅延特性を評価する場合
'mag'角周波数 Wn でゲインが-3dBになるよう正規化他フィルタと-3dBカットオフを揃えて比較する場合

実際にN=4・fc=100Hzで3種類のnormを試し、実現される-3dBカットオフ周波数を比較します:

import numpy as np
from scipy import signal

fs = 1000
fc = 100
N = 4

def find_3db(b, a, fs, fmax=500):
    w = np.linspace(0.01, fmax, 500000)
    _, h = signal.freqz(b, a, worN=w, fs=fs)
    mag_db = 20 * np.log10(np.abs(h) + 1e-300)
    idx = np.argmin(np.abs(mag_db - (-3.0103)))
    return w[idx]

for norm in ['phase', 'delay', 'mag']:
    b, a = signal.bessel(N, fc, btype='low', fs=fs, norm=norm)
    print(f"norm='{norm}': 実際の-3dB周波数={find_3db(b, a, fs):.2f} Hz")

実行結果:

norm='phase': 実際の-3dB周波数=67.28 Hz
norm='delay': 実際の-3dB周波数=191.57 Hz
norm='mag': 実際の-3dB周波数=100.00 Hz

指定した fc=100 Hzに対し、デフォルトの 'phase' では実際の-3dBは67.28Hz(指定値より内側)に、'delay' では191.57Hz(指定値より外側、前節で確認した通り)にずれます。指定周波数ぴったりに-3dBを合わせられるのは 'mag' だけです。実際 norm='mag' はN=2/4/6のいずれでも-3dBを100.00Hzちょうどに揃えられることを確認済みです(前節の群遅延比較・パルス応答比較で使用したのはこの norm='mag' です)。他のフィルタ(バターワース等)と同じ-3dBカットオフで比較したい場合は次のように設計します:

from scipy import signal

fs = 1000
fc = 100
N = 4

# -3dBカットオフをfc=100Hzに設定
sos_bessel = signal.bessel(N, fc, btype='low', fs=fs, norm='mag', output='sos')
sos_butter = signal.butter(N, fc, btype='low', fs=fs, output='sos')

逆に、ベッセル本来の設計思想(\(\omega=0\) における群遅延の絶対値を指定値に固定する)に沿って使いたい場合は norm='delay' を使いますが、前節で見た通りこの場合は次数を上げると実際の帯域幅が広がる点に注意してください。「群遅延の絶対値を揃えたいのか」「-3dBカットオフを揃えたいのか」で選ぶべき norm が変わる、というのがこのパラメータの実務上の要点です。

ベッセルフィルタを選ぶべきシナリオ

シナリオ推奨フィルタ
パルス波形の形状を保持したいベッセルフィルタ
音声信号の位相歪みを最小化したいベッセルフィルタ
遷移帯域をできるだけ急峻にしたい楕円フィルタ
通過域の振幅を最大限に平坦にしたいバターワースフィルタ
計算コスト(次数)を最小化したい楕円フィルタ
リップルを許容して遮断を急峻にしたいチェビシェフフィルタ

最新研究動向

ベッセルフィルタの「群遅延最大平坦」という性質そのものは1952年のThomsonの提案以来変わりませんが、これを応用・拡張する研究は現在も続いています。

  • Kandic, M., & Bridges, G. E. (2025). Maximally Flat Negative Group Delay Prototype Filter Based on Capped Reciprocal Transfer Function of Classical Bessel Filter. Progress In Electromagnetics Research B, 110, 91–105. 同一次数の2つの古典ベッセル低域通過伝達関数(-3dB帯域幅が異なる)の比を取ることで、通過域内で負の群遅延(信号が遅れるのではなく先行して見える)が最大限平坦になる新しいプロトタイプフィルタを構成しています。古典ベッセルフィルタの伝達関数をそのまま部品として使い、より複雑な位相応答を合成する方向性の研究です。
  • Yi, H., Chang, F., Tan, P., Huang, B., Wu, Y., Xu, Z., Ma, B., & Ma, J. (2025). Design of infinite impulse response maximally flat stable digital filter with low group delay. Scientific Reports, 15, 11074. IIRフィルタにおいて、安定性とゲインの平坦性を保ったまま群遅延を低く抑える制約付き設計アルゴリズムを提案しています。ベッセル多項式に基づく古典的な設計とは異なるアプローチで、同じ「低群遅延・安定なIIR」という目標に取り組んでいる点が対照的です。

いずれも、本記事で扱った「群遅延を平坦化する」という古典的な設計目標が、負の群遅延回路やより自由度の高い数値最適化設計という形で現在も研究され続けていることを示しています。

関連記事

参考文献

  • Thomson, W. E. (1952). Delay networks having maximally flat frequency characteristics. Proceedings of the IEE - Part III: Radio and Communication Engineering, 96(44), 487–490.
  • Proakis, J. G., & Manolakis, D. G. (2007). Digital Signal Processing (4th ed.). Pearson.
  • SciPy scipy.signal.bessel documentation
  • Kandic, M., & Bridges, G. E. (2025). Maximally Flat Negative Group Delay Prototype Filter Based on Capped Reciprocal Transfer Function of Classical Bessel Filter. Progress In Electromagnetics Research B, 110, 91–105. https://www.jpier.org/issues/volume.html?paper=24121308
  • Yi, H., Chang, F., Tan, P., Huang, B., Wu, Y., Xu, Z., Ma, B., & Ma, J. (2025). Design of infinite impulse response maximally flat stable digital filter with low group delay. Scientific Reports, 15, 11074. https://www.nature.com/articles/s41598-025-87175-5

関連ツール