バンドパスフィルタとは
バンドパスフィルタ(帯域通過フィルタ)は、特定の周波数帯域(通過帯域)の信号を通過させ、それ以外の周波数(阻止帯域)を減衰させるフィルタです。
ラジオの選局、音声処理の特定周波数強調、生体信号(心拍・脳波)のノイズ除去など、幅広い分野で活用されています。
主要パラメータ
| パラメータ | 説明 |
|---|---|
| \(f_l\) | 下側遮断周波数(-3dB点) |
| \(f_h\) | 上側遮断周波数(-3dB点) |
| \(f_0 = \sqrt{f_l f_h}\) | 中心周波数(幾何平均) |
| \(BW = f_h - f_l\) | 帯域幅(Bandwidth) |
| \(Q = f_0 / BW\) | Q値(鋭さの指標) |
Q値が大きいほど通過帯域が狭く(鋭い選択性)、小さいほど広帯域になります。
周波数応答の導出
ローパス→バンドパス変換
バンドパスフィルタは、ローパスフィルタ(LPF)のプロトタイプから周波数変換によって設計できます。
アナログ領域でのローパス→バンドパス変換は、複素変数 \(s\) を以下のように置き換えます。
\[ s \rightarrow \frac{s^2 + \omega_l \omega_h}{s(\omega_h - \omega_l)} \tag{1}\]ここで \(\omega_l = 2\pi f_l\) 、\(\omega_h = 2\pi f_h\) です。
1次のバターワースLPFの伝達関数 \(H_{LP}(s) = \frac{\omega_c}{s + \omega_c}\) に変換 \((1)\) を適用すると、2次のバンドパスフィルタが得られます。
\[ H_{BP}(s) = \frac{BW \cdot s}{s^2 + BW \cdot s + \omega_0^2} \tag{2} \]ここで \(BW = \omega_h - \omega_l\) 、\(\omega_0 = \sqrt{\omega_l \omega_h}\) です。
なぜこの変換で通過帯域が実現されるのか
式 \((1)\) の置き換えは一見天下り的ですが、実際にアナログ周波数軸上でどう作用するかを見ると、なぜバンドパス特性が得られるのかが明確になります。
正規化ローパスプロトタイプの複素変数を \(p\) とし、プロトタイプの通過域を \(s=j\Omega\) 上の \(|\Omega| \le 1\) とします。変換式 \((1)\) の \(s\) に実周波数 \(s=j\omega\) (\(\omega>0\) )を代入すると、
\[ p = \frac{(j\omega)^2 + \omega_l \omega_h}{j\omega(\omega_h - \omega_l)} \]\(\omega_0^2 = \omega_l \omega_h\) 、\(B = \omega_h - \omega_l\) とおくと分子は \(\omega_0^2 - \omega^2\) 、分母は \(jB\omega\) になるので、
\[ p = \frac{\omega_0^2 - \omega^2}{jB\omega} = j\,\frac{\omega^2 - \omega_0^2}{B\omega} \]これは \(p = j\Omega\) の形なので、実周波数 \(\omega\) に対応するプロトタイプ側の正規化周波数は
\[ \Omega(\omega) = \frac{\omega^2 - \omega_0^2}{B\omega} = \frac{1}{B}\left(\omega - \frac{\omega_0^2}{\omega}\right) \]と表せます。この写像の境界値を確認すると、\(\omega=\omega_0\) では \(\Omega(\omega_0)=0\) 、\(\omega=\omega_h\) では \(\omega_h^2-\omega_0^2=\omega_h^2-\omega_l\omega_h=\omega_h(\omega_h-\omega_l)=\omega_h B\) より \(\Omega(\omega_h)=1\) 、\(\omega=\omega_l\) では同様に \(\omega_l^2-\omega_0^2=-\omega_l B\) より \(\Omega(\omega_l)=-1\) となります。さらに導関数は
\[ \frac{d\Omega}{d\omega} = \frac{1}{B}\left(1 + \frac{\omega_0^2}{\omega^2}\right) > 0 \quad (\omega>0) \]であり、\(\Omega(\omega)\) は \(\omega>0\) で狭義単調増加です。したがって \(\omega\) が \(\omega_l\) から \(\omega_h\) まで動くとき \(\Omega\) はちょうど \(-1\) から \(1\) まで単調に動き、プロトタイプの通過域 \(|\Omega|\le 1\) を過不足なく埋め尽くします。逆に \(\omega<\omega_l\) または \(\omega>\omega_h\) では、単調性からただちに \(|\Omega|>1\) (プロトタイプの阻止域)となります。
つまりこの変換は、実周波数軸の正の部分 \((0,\infty)\) をプロトタイプの周波数軸全体 \((-\infty,\infty)\) に単調・全単射で写像し、中心周波数 \(\omega_0\) 付近の帯域 \((\omega_l,\omega_h)\) をちょうどプロトタイプの通過域に、その両側(低域側 \(\omega<\omega_l\) と高域側 \(\omega>\omega_h\) )を共にプロトタイプの単一の阻止域 \(|\Omega|>1\) に対応させます。片側にしか阻止域を持たないローパスプロトタイプから、両側に阻止域を持つバンドパス特性が得られるのは、この写像の構造によるものです。
次数が2倍になる理由: 上の計算は \(s\) から \(p\) を求める向きでしたが、逆にプロトタイプ側の1つの極(または零点)\(p\) に対応する \(s\) を求めるには、式 \((1)\) を \(s\) について解く必要があります。整理すると
\[ Bps = s^2 + \omega_0^2 \quad\Longrightarrow\quad s^2 - Bp\,s + \omega_0^2 = 0 \]という \(s\) の2次方程式になります。これは1つの \(p\) に対して
\[ s_{1,2} = \frac{Bp \pm \sqrt{(Bp)^2 - 4\omega_0^2}}{2} \]という2つの根 \(s_1, s_2\) が対応することを意味します。したがって \(N\) 次のローパスプロトタイプ(\(N\) 個の極)は、この変換によって \(2N\) 個の極を持つ \(2N\) 次のバンドパスフィルタになります。式 \((2)\) で1次のバターワースLPF(極1個)から2次のバンドパスフィルタ(極2個)が得られたのは、この一般則の \(N=1\) の場合にあたります。
離散時間バンドパスフィルタ(双一次変換)
式 \((2)\) を双一次変換(Bilinear Transform)でデジタル領域に変換します。
\[s = \frac{2}{T} \cdot \frac{1 - z^{-1}}{1 + z^{-1}} \tag{3}\]これを式 \((2)\) に代入すると、デジタルバンドパスフィルタの伝達関数 \(H(z)\) が得られます。
\[ H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} \tag{4}\]実用上は scipy.signal がこの計算を自動的に行ってくれます。
Qファクタと選択性のトレードオフ
Q値は \(Q=f_0/BW=\omega_0/B\) と定義されますが、これは単なる「鋭さの指標」ではなく、フィルタの過渡応答(定常状態に達するまでの時間)と直接結びついた物理量です。この関係を、式 \((2)\) の2次バンドパスプロトタイプから導出します。
\[ H_{BP}(s) = \frac{Bs}{s^2+Bs+\omega_0^2} \]の極は
\[ s = -\frac{B}{2} \pm j\sqrt{\omega_0^2 - \left(\frac{B}{2}\right)^2} \]です。\(B \ll \omega_0\) (高Q)のとき極の虚部はほぼ \(\pm\omega_0\) 、実部は \(-B/2\) になります。この実部の大きさが、共振に対する自由応答の振幅包絡線が指数的に減衰する速さを決めます。
\[ |y(t)| \propto e^{-(B/2)t} \]したがって包絡線が \(1/e\) に減衰するまでの時間定数は、\(B=2\pi \cdot BW\) を代入すると
\[ \tau = \frac{2}{B} = \frac{1}{\pi \cdot BW} \]となり、この時間内に生じる中心周波数の振動サイクル数は
\[ \tau f_0 = \frac{f_0}{\pi \cdot BW} = \frac{Q}{\pi} \approx 0.318\,Q \]です。すなわち、Q値が高い(狭帯域・高選択性)ほど、過渡応答が収まるまでに必要な振動サイクル数はQに比例して増加します。狭い周波数帯域だけを識別するには、それだけ長い時間(多くの振動周期)の観測が必要という、時間-周波数の不確定性関係の一種です。
実行検証:Qと過渡応答・選択性精度のトレードオフ
上記の関係を、実際に scipy.signal.butter(4次バターワース、output='sos')で設計したバンドパスフィルタに \(f_0=100\)
Hzの正弦波を印加し、包絡線(ヒルベルト変換の絶対値)が定常値の10%以内に収まるまでの時間を測定して検証しました(\(f_s=2000\)
Hz、中心周波数固定・帯域幅のみ変化)。
| Q | 設計BW [Hz] | 実測-3dB BW [Hz] | 実測/設計比 | 90%到達時間 [ms] | 10%整定時間 [ms] | 整定に要したサイクル数 |
|---|---|---|---|---|---|---|
| 1 | 100.000 | 99.940 | 0.9994 | 13.50 | 13.50 | 1.4 |
| 2 | 50.000 | 49.965 | 0.9993 | 26.00 | 39.00 | 3.9 |
| 5 | 20.000 | 19.980 | 0.9990 | 64.00 | 96.00 | 9.6 |
| 10 | 10.000 | 9.990 | 0.9990 | 127.00 | 191.50 | 19.1 |
| 20 | 5.000 | 4.990 | 0.9980 | 253.50 | 382.50 | 38.2 |
| 50 | 2.000 | 1.990 | 0.9950 | 633.50 | 957.00 | 95.7 |
整定時間はQにほぼ比例して増加しており(Q=1→50でサイクル数は1.4→95.7と約68倍)、上で導出した「サイクル数 \(\propto Q\) 」という関係と定性的に一致します。4次バターワースは2次共振器4段のカスケードにあたるため、比例定数は2次理想系の理論値 \(1/\pi\approx0.318\) (1/eまでの目安)より、10%整定の基準でも大きくなっています。
さらに注目すべきは、Qを上げるほど実測の-3dB帯域幅が設計値からわずかにずれていく点です(比が0.9994→0.9950へ徐々に低下)。これは双一次変換による周波数プリワーピングの非線形性と、有限の周波数分解能でピークを探索する数値誤差が、狭帯域になるほど相対的に大きく効いてくるためです。Q=50(BW/f_0=2%)でもずれは0.5%程度に収まりますが、さらに狭帯域にするとこの誤差は次節で見るように無視できなくなります。
狭帯域設計時の数値的困難
Q値を上げる(帯域を狭くする)と、デジタルフィルタの極は単位円周上のある偏角付近に密集していきます。極が単位円に近づくほど、伝達関数係数のわずかな丸め誤差が周波数特性に大きな影響を与えるようになります。
実行検証:極配置と係数摂動に対する感度
4次バターワース(前節の変換により実現後は8次・8個の極)バンドパスフィルタについて、\(f_0=100\) Hz固定でQを変えながら、極の単位円からの最小距離 \(\min(1-|z_k|)\) と、伝達関数係数に相対値 \(10^{-6}\) の摂動を与えたときの周波数応答の変化量(摂動の何倍に増幅されるか、20回の乱数試行の平均)を測定しました。
| Q | B/f_0 | \(\min(1-\|z_k\|)\) | TF形式(b,a)の増幅率 | SOS形式(2次セクション)の増幅率 |
|---|---|---|---|---|
| 1 | 1.0000 | 6.30×10⁻² | 22,688 | 43.0 |
| 5 | 0.2000 | 2.18×10⁻² | 2,609,953 | 81.8 |
| 20 | 0.0500 | 5.87×10⁻³ | 1,001,461 | 358.2 |
| 100 | 0.0100 | 1.20×10⁻³ | 1,000,001 | 1,515.2 |
| 500 | 0.0020 | 2.33×10⁻⁴ | 1,000,000 | 5,004.5 |
極の単位円からの最小距離はQに反比例して縮小しています(Q=1で約0.063、Q=500で約2.3×10⁻⁴)。極が単位円に近いほど、対応する分母多項式の根が敏感になり、係数のわずかな誤差(浮動小数点丸め誤差を含む)が拡大されて出力に現れます。
実際、多項式形式(b, a の直接表現)では係数を10⁻⁶相対摂動しただけで、周波数応答が最大で摂動の100万倍近く変化しており、深刻な数値不安定性が確認できます。一方、2次セクション(SOS)形式に分解した場合、同じ摂動に対する増幅率は最大でも約5,000倍に抑えられており、TF形式より2〜3桁頑健です(それでもQが上がるにつれ増幅率自体は増加し続けます)。
摂動を加える前の段階でも、TF形式とSOS形式が計算する周波数応答には無視できない食い違いが生じます。
| Q | TF形式とSOS形式の周波数応答の相対誤差(摂動なし) |
|---|---|
| 1 | 5.8×10⁻¹² |
| 5 | 3.4×10⁻¹⁰ |
| 20 | 8.6×10⁻⁸ |
| 100 | 2.6×10⁻⁵ |
| 500 | 4.8×10⁻³ |
Q=500(帯域幅が中心周波数の0.2%)では、摂動を一切加えなくても、TF形式のみで計算した周波数応答がSOS形式(より高精度な基準)と0.48%も食い違うという結果になりました。これは浮動小数点演算の丸め誤差だけで生じた誤差であり、scipy.signal.butter のデフォルト出力(output='ba'、すなわちTF形式)を高Qのバンドパス設計にそのまま使うと、意図しない特性のフィルタが実装されてしまう危険性を示しています。

上図の左は本節の係数摂動に対する感度(TF形式とSOS形式の比較)、右は前節で測定したQと整定時間の関係を示しています。いずれも両対数軸でほぼ直線的な関係にあり、Qの増加に伴う数値的困難と過渡応答の遅さがべき乗則的に悪化することが視覚的に確認できます。
実務上の対策: scipy.signal.butter(..., output='sos') などでSOS形式を使う、次数をむやみに上げない、可能であれば帯域幅を中心周波数に対して極端に狭くしすぎない(目安としてQ≲100程度に留める)、状態空間表現やラティス構造など別の数値的に頑健な実現法を検討する、といった対策が有効です。
Pythonによる実装
scipy.signalを用いたIIRバンドパスフィルタ
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# --- パラメータ設定 ---
fs = 1000.0 # サンプリング周波数 [Hz]
f_low = 50.0 # 下側遮断周波数 [Hz]
f_high = 150.0 # 上側遮断周波数 [Hz]
order = 4 # フィルタ次数
# --- バターワース バンドパスフィルタの設計 ---
nyq = fs / 2.0 # ナイキスト周波数
low = f_low / nyq
high = f_high / nyq
b, a = signal.butter(order, [low, high], btype='bandpass')
# --- 周波数応答の計算 ---
w, h = signal.freqz(b, a, worN=8000, fs=fs)
# --- プロット ---
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
# ゲイン特性 (dB)
ax1.semilogx(w, 20 * np.log10(np.abs(h) + 1e-10))
ax1.axvline(f_low, color='r', linestyle='--', label=f'$f_l$ = {f_low} Hz')
ax1.axvline(f_high, color='g', linestyle='--', label=f'$f_h$ = {f_high} Hz')
ax1.axhline(-3, color='gray', linestyle=':', label='-3 dB')
ax1.set_xlabel('Frequency [Hz]')
ax1.set_ylabel('Gain [dB]')
ax1.set_title(f'Butterworth Bandpass Filter (order={order})')
ax1.legend()
ax1.grid(True, which='both', alpha=0.3)
ax1.set_xlim([1, nyq])
ax1.set_ylim([-80, 5])
# 位相特性
ax2.semilogx(w, np.angle(h, deg=True))
ax2.axvline(f_low, color='r', linestyle='--')
ax2.axvline(f_high, color='g', linestyle='--')
ax2.set_xlabel('Frequency [Hz]')
ax2.set_ylabel('Phase [degrees]')
ax2.set_title('Phase Response')
ax2.grid(True, which='both', alpha=0.3)
ax2.set_xlim([1, nyq])
plt.tight_layout()
plt.savefig('bandpass_response.png', dpi=150, bbox_inches='tight')
plt.show()
FIRバンドパスフィルタの設計
IIRフィルタは位相が非線形ですが、FIRフィルタは線形位相を実現できます。音声処理など位相の保存が重要な場面で有用です。
from scipy.signal import firwin, freqz
# --- FIR バンドパスフィルタ ---
numtaps = 101 # フィルタ係数の数(奇数推奨)
fir_bpf = firwin(
numtaps,
[f_low, f_high],
pass_zero=False, # バンドパス指定
fs=fs,
window='hamming'
)
w_fir, h_fir = freqz(fir_bpf, worN=8000, fs=fs)
# IIRとFIRの比較プロット
plt.figure(figsize=(10, 5))
plt.semilogx(w, 20 * np.log10(np.abs(h) + 1e-10), label='IIR Butterworth (order=4)', linewidth=2)
plt.semilogx(w_fir, 20 * np.log10(np.abs(h_fir) + 1e-10), label=f'FIR Hamming (taps={numtaps})', linewidth=2, linestyle='--')
plt.axvline(f_low, color='r', linestyle=':', alpha=0.7, label=f'$f_l$ = {f_low} Hz')
plt.axvline(f_high, color='g', linestyle=':', alpha=0.7, label=f'$f_h$ = {f_high} Hz')
plt.axhline(-3, color='gray', linestyle=':', alpha=0.7)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Gain [dB]')
plt.title('Bandpass Filter Comparison: IIR vs FIR')
plt.legend()
plt.grid(True, which='both', alpha=0.3)
plt.xlim([1, nyq])
plt.ylim([-80, 5])
plt.tight_layout()
plt.show()
信号への適用例
実際のノイズ混じり信号にバンドパスフィルタを適用します。
# --- テスト信号の生成 ---
t = np.linspace(0, 1.0, int(fs), endpoint=False) # 1秒分
# 目的信号: 100 Hz のサイン波
signal_pure = np.sin(2 * np.pi * 100 * t)
# ノイズ: 10 Hz の低周波 + 300 Hz の高周波 + ホワイトノイズ
noise = (
0.5 * np.sin(2 * np.pi * 10 * t) +
0.5 * np.sin(2 * np.pi * 300 * t) +
0.3 * np.random.randn(len(t))
)
x_noisy = signal_pure + noise
# --- フィルタ適用 ---
# lfilter: 因果的フィルタ(リアルタイム処理向け、位相遅れあり)
y_lfilter = signal.lfilter(b, a, x_noisy)
# filtfilt: ゼロ位相フィルタ(オフライン処理向け、位相遅れなし)
y_filtfilt = signal.filtfilt(b, a, x_noisy)
# --- 比較プロット ---
fig, axes = plt.subplots(3, 1, figsize=(12, 8), sharex=True)
axes[0].plot(t[:200], x_noisy[:200], alpha=0.8, label='Noisy signal')
axes[0].set_ylabel('Amplitude')
axes[0].set_title('Input Signal (noisy)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[1].plot(t[:200], y_lfilter[:200], color='orange', label='lfilter (causal)')
axes[1].plot(t[:200], signal_pure[:200], color='gray', linestyle='--', alpha=0.6, label='True signal')
axes[1].set_ylabel('Amplitude')
axes[1].set_title('After lfilter (with phase delay)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
axes[2].plot(t[:200], y_filtfilt[:200], color='green', label='filtfilt (zero-phase)')
axes[2].plot(t[:200], signal_pure[:200], color='gray', linestyle='--', alpha=0.6, label='True signal')
axes[2].set_ylabel('Amplitude')
axes[2].set_xlabel('Time [s]')
axes[2].set_title('After filtfilt (zero-phase)')
axes[2].legend()
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('bandpass_filtering_result.png', dpi=150, bbox_inches='tight')
plt.show()
IIR vs FIR 設計の比較
| 特性 | IIR(バターワース等) | FIR |
|---|---|---|
| 位相特性 | 非線形(位相歪みあり) | 線形位相が実現可能 |
| フィルタ係数数 | 少ない(\(2N+1\) 程度) | 多い(数十〜数百) |
| 計算コスト | 低い | 高い(タップ数依存) |
| 安定性 | 設計によっては不安定 | 常に安定 |
| 遮断特性 | 低次でも急峻 | タップ数増加で改善 |
| 遅延 | 非定数 | 定数遅延(\((N-1)/2\) サンプル) |
| 適した用途 | リアルタイム処理 | 音声・画像処理、位相重視 |
設計指針:
- リアルタイムで計算コストを抑えたい → IIR(バターワース/チェビシェフ)
- 位相の線形性が重要(音声・医療信号) → FIR(Hamming/Kaiser窓)
- オフライン処理で位相遅れを完全除去 →
filtfilt(IIR/FIR共通)
IIRとFIRの次数比較:同一仕様での設計
前節の比較表は定性的な特徴の整理ですが、実際に同一の仕様を満たすために必要な次数・タップ数を定量的に比較すると、設計手法選択の判断材料がより明確になります。
以下の仕様でIIR(バターワース/チェビシェフI型・II型/楕円)とFIR(窓関数法・Parks-McClellan法)の最小次数・タップ数を求めました(\(f_s=1000\) Hz)。
- 通過域: 50–150 Hz、通過域リップル 1 dB以下
- 阻止域: 30 Hz以下・170 Hz以上、阻止域減衰量 40 dB以上
- 遷移帯域幅: 両側20 Hz
scipy.signal.buttord / cheb1ord / cheb2ord / ellipord でこの仕様を満たす最小次数を求めた結果は次のとおりです。
| 設計法 | 最小次数(プロトタイプ) | 実現後の極数(バンドパス、次数×2) |
|---|---|---|
| バターワース | 21 | 42 |
| チェビシェフI型 | 8 | 16 |
| チェビシェフII型 | 8 | 16 |
| 楕円(Cauer) | 5 | 10 |
同じ仕様でも、通過域の最大平坦性にこだわるバターワースは21次(実現後42極)と非常に高次になる一方、通過域または阻止域にリップルを許すチェビシェフはわずか8次、両方にリップルを許す楕円フィルタはさらに少ない5次で足ります。遷移帯域の急峻さが要求される場面では、最大平坦特性を捨ててリップルを許容する設計の方が圧倒的に効率的であることが分かります( チェビシェフフィルタの設計原理とPython実装 で解説している等リップル特性とロールオフの関係と整合する結果です)。
FIR側は scipy.signal.kaiserord(Kaiser窓)で必要タップ数を見積もると113タップ(\(\beta=3.395\)
)でした。ただし実際に周波数応答を検証すると、達成された通過域リップルは6.08 dBとなり、目標の1 dB以下を大きく超過していました(阻止域減衰は低域側47.8 dB・高域側45.8 dBと目標は満たしています)。これはKaiser窓の設計式が主に阻止域減衰と遷移帯域幅から近似的にタップ数を見積もるものであり、通過域リップルを直接保証しないためです。
一方、等リップル最適化を行うParks-McClellan法(scipy.signal.remez)で同じ仕様を満たす最小タップ数を探索すると107タップで達成でき、通過域リップルは0.17 dB、阻止域減衰は低域側40.0 dB・高域側40.1 dBと、仕様ギリギリを狙って無駄なく満たしていました。
この実験から得られる実務的な示唆は次の3点です。
- IIRは同じ仕様でも設計法(最大平坦 vs 等リップル)で必要次数が大きく変わる。急峻な遷移帯域が必要ならチェビシェフ・楕円を検討する価値がある。
- FIRはタップ数(ここでは100前後)がIIRの次数(この例では5〜21)よりずっと多く、同じサンプルあたりの計算コストではIIRが有利。ただしFIRは線形位相を厳密に実現できる。
- 窓関数法は簡便だが、リップルなど一部の仕様を正確に満たさないことがある。仕様への適合を厳密に検証したい場合はParks-McClellan法(等リップル設計)の方が信頼できる。
次数と帯域幅の影響
# 次数の違いによる周波数応答の比較
fig, ax = plt.subplots(figsize=(10, 6))
for ord_n in [2, 4, 6, 8]:
b_n, a_n = signal.butter(ord_n, [low, high], btype='bandpass')
w_n, h_n = signal.freqz(b_n, a_n, worN=8000, fs=fs)
ax.semilogx(w_n, 20 * np.log10(np.abs(h_n) + 1e-10), label=f'order={ord_n}')
ax.axhline(-3, color='gray', linestyle=':', label='-3 dB')
ax.axvline(f_low, color='r', linestyle='--', alpha=0.5)
ax.axvline(f_high, color='g', linestyle='--', alpha=0.5)
ax.set_xlabel('Frequency [Hz]')
ax.set_ylabel('Gain [dB]')
ax.set_title('Effect of Filter Order on Bandpass Response')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
ax.set_xlim([1, nyq])
ax.set_ylim([-80, 5])
plt.tight_layout()
plt.show()
次数を上げると遮断特性が急峻になりますが、IIRフィルタでは次数が高くなるほど位相遅れと数値的不安定性のリスクが増すため、次数8以下が実用的な目安です。
近年の研究動向(2023年以降)
バンドパスフィルタは古典的な信号処理要素ですが、無線通信・RFフロントエンドの分野では近年も活発に研究が続いています。
- オンチップ可変RFバンドパスフィルタ: IEEE Microwave Magazine誌(2024年1月号)はオンチップで周波数可変なRFバンドパスフィルタに関するレビューを掲載しており、マルチバンド無線機やソフトウェア無線(SDR)向けに、単一の回路で中心周波数を電気的に切り替えられる設計手法が整理されています。
- 広帯域可変マイクロストリップバンドパスフィルタ: 2024年のMDPI Electronics誌の論文では、単一のバイアス電圧のみで中心周波数を1.1〜3.1 GHzの範囲で連続的に可変できるコンパクトなマイクロストリップバンドパスフィルタが報告されており、5G/6Gのような広帯域・マルチバンド運用が求められる通信規格に向けた再構成可能なRFフロントエンドのニーズを反映しています。
- 機械学習によるフィルタ設計最適化: 2025年のPhysica Scripta誌の論文はバンドパスフィルタの設計・最適化に機械学習を用いる手法を報告しており、同年のMDPI Electronics誌ではXGBoostなどの機械学習モデルでマイクロ波フィルタの結合行列や物理パラメータを予測し、設計の反復回数を削減するアプローチがまとめられています。デジタルIIR/FIRフィルタの領域でも、差分進化やグレイウルフ最適化などのメタヒューリスティック手法でフィルタ係数を最適化する研究(2024年のScientific Reports誌など)が報告されています。
これらの動向に共通するのは、古典的な解析的設計(本記事で扱ったバターワース変換や窓関数法など)を出発点としつつ、可変性(tunability)と機械学習による設計自動化・高速化を組み合わせる方向性です。ただし、これらの手法の多くはマイクロ波・RF回路(アナログハードウェア)を対象としたものであり、本記事で扱ったデジタル信号処理としてのバンドパスフィルタ設計に機械学習最適化を直接適用する事例は、執筆時点ではまだ発展途上の分野である点には注意してください。
関連記事
- ローパスフィルタの設計と比較:移動平均・バターワース・チェビシェフ - バンドパスの基礎となるLPF設計を解説しています。
- バターワースフィルタの設計とPython実装 - バンドパス設計に利用するバターワースLPFプロトタイプを詳しく解説しています。
- FIRフィルタとIIRフィルタの比較 - FIR/IIRの設計思想の違いを理論から解説しています。
- ノッチフィルタの設計とPython実装 - 特定周波数のみを除去するノッチ(バンドストップ)フィルタを解説しています。
- 指数移動平均(EMA)フィルタの周波数特性 - 1次IIRフィルタとして見たEMAの周波数特性をZ変換から導出しています。
- 高速フーリエ変換(FFT)の仕組みとPython実装 - バンドパスフィルタの効果を周波数領域で確認するために必要なFFTの基礎を解説しています。
- 窓関数とパワースペクトル密度(PSD)の理論とPython実装 - FIRフィルタ設計に使われる窓関数の数学的背景を解説しています。
- 適応フィルタ(LMS/RLS)の理論とPython実装 - 固定帯域ではなく環境に応じて特性を自動調整する適応フィルタを解説しています。
- ハイパスフィルタの設計とPython実装 - バンドパスを構成する片側のHPF設計を、低周波遮断の観点から解説しています。
- チェビシェフフィルタの設計原理とPython実装 - バンドパス設計に等リップル特性を導入する場合のプロトタイプとして利用できます。
- ウィーナーフィルタの理論とPython実装 - 通過帯域を手動指定するバンドパスに対し、SNRから最適な周波数選択を自動化するアプローチです。
- Z変換と離散時間システムの理論 - バンドパスの極零点配置(共役対の極が単位円付近に2組)の理論的土台です。
- 短時間フーリエ変換(STFT)の理論とPython実装 - バンドパスフィルタの効果を時間-周波数領域で可視化する代表的な手法です。
- ベッセルフィルタの理論とPython実装 - バンドパス用途で位相歪みを最小化したい場合に選ぶ、群遅延が最大限平坦なIIRプロトタイプを解説しています。
- 時系列データの異常検知:移動平均・EMA・カルマンフィルタの実装比較 - バンドパスで帯域分離した残差を異常スコアとして用いる場合の理論的枠組みを解説しています。
- ボード線図(Bode plot)の理論とPython実装 - バンドパスの中心周波数まわりの帯域特性と、対称な位相プロットを統一的に可視化するハブ記事です。
- ヒルベルト変換と解析信号:瞬時振幅・位相・周波数のPython実装 - バンドパスでナロウバンド化した信号にヒルベルト変換を適用し、瞬時振幅・瞬時位相を抽出する代表的なワークフローです。
- デジタルフィルタ設計指針ハブ:選定の3軸と特性比較 — 本記事のバンドパスフィルタを他のフィルタ群と比較しながら選定する際の指針として活用できます。
参考文献
- Proakis, J. G., & Manolakis, D. G. (2006). Digital Signal Processing: Principles, Algorithms, and Applications. Pearson.
- scipy.signal.butter — SciPy documentation
- scipy.signal.filtfilt — SciPy documentation
- A Review of On-Chip Adjustable RF Bandpass Filters — IEEE Microwave Magazine, January 2024.
- A Compact Bandpass Filter with Widely Tunable Frequency and Simple Bias Control — Electronics (MDPI), 13(2), 411 (2024).
- Machine Learning-Driven Approaches for Advanced Microwave Filter Design — Electronics (MDPI), 14(2), 367 (2025).
- Design and optimization of a bandpass filter using machine learning — Physica Scripta, 100, 075574 (2025).
関連ツール
- DevToolBox - 開発者向け無料ツール集 - JSON整形、正規表現テスターなど85種類以上の開発者向けツール
- CalcBox - 暮らしの計算ツール - 統計計算、周波数変換など61種類以上の計算ツール