はじめに
ベッセルフィルタ(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)

ここには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

-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

数値で見ると、ピーク振幅自体はベッセル(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」という目標に取り組んでいる点が対照的です。
いずれも、本記事で扱った「群遅延を平坦化する」という古典的な設計目標が、負の群遅延回路やより自由度の高い数値最適化設計という形で現在も研究され続けていることを示しています。
関連記事
- バターワースフィルタの設計原理とPython実装 - 通過域最大平坦特性を持つIIRフィルタの設計
- チェビシェフフィルタの設計原理とPython実装 - 等リップルIIRフィルタの設計
- 楕円フィルタ(Elliptic Filter)の設計原理とPython実装 - 最急峻な遷移帯域を持つIIRフィルタの設計
- ローパスフィルタの設計と比較:移動平均・バターワース・チェビシェフ - 各種ローパスフィルタの周波数応答比較
- FIRフィルタとIIRフィルタの比較 - IIRフィルタ全般の位置づけと特性比較
- 指数移動平均(EMA)フィルタの周波数特性 - シンプルな1次IIRフィルタとしてのEMAの解析
- 適応フィルタ(LMS/RLS)の理論とPython実装 - パラメータが自動調整される適応フィルタ
- バンドパスフィルタの設計とPython実装 - ベッセルプロトタイプを周波数変換でバンドパスに展開する場合の設計手順を解説しています。
- ハイパスフィルタの設計とPython実装 - ベッセル LPF プロトタイプから派生させるハイパス設計を、低周波バイアス除去の観点で解説しています。
- ボード線図(Bode plot)の理論とPython実装 - ベッセルの「群遅延が最大限平坦」な特性は位相プロットがほぼ直線として現れます。バターワース・チェビシェフとの位相比較に最適です。
- デジタルフィルタ設計指針ハブ:選定の3軸と特性比較 — 本記事のベッセルを他のIIR/FIRフィルタと比較しながら選定する際の指針として活用できます。
参考文献
- 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
関連ツール
- DevToolBox - 開発者向け無料ツール集 - JSON整形、正規表現テスターなど85種類以上の開発者向けツール
- CalcBox - 暮らしの計算ツール - 統計計算、複利計算など61種類以上の計算ツール