FIR フィルタ設計 戻る
ディジタル信号処理シミュレーター

FIR フィルタ設計 シミュレーター — 窓関数法

理想 sinc インパルス応答に Hamming や Blackman などの窓関数を掛けて、線形位相 FIR ローパスフィルタを設計。タップ数・カットオフ周波数を変えながら、インパルス応答と振幅応答 (dB) をリアルタイム可視化できます。

パラメータ
カットオフ周波数 f_c
Hz
サンプリング周波数 f_s
Hz
フィルタ次数 M
窓関数
計算結果
タップ数 N
遷移帯幅 Δf
ストップバンド減衰
群遅延 τ_d
インパルス応答 h[n] と窓関数
周波数応答 |H(f)| [dB]
理論・主要公式

理想ローパスのインパルス応答 (sinc) と窓関数を掛けた FIR 係数:

$$h_d[n] = \dfrac{2 f_c}{f_s}\,\mathrm{sinc}\!\left(\dfrac{2 f_c}{f_s}\left(n - \dfrac{M}{2}\right)\right),\quad h[n] = h_d[n]\,w[n]$$

タップ数・遷移帯幅・群遅延:

$$N = M+1,\quad \Delta f \approx \dfrac{A \, f_s}{M},\quad \tau_d = \dfrac{M}{2 f_s}$$

$A$ は窓固有の係数 (矩形 0.9、Hann 3.1、Hamming 3.3、Blackman 5.5)。ストップバンド減衰は Rectangular -21 dB、Hann -44 dB、Hamming -53 dB、Blackman -74 dB が目安。

FIR フィルタ設計 (窓関数法) とは

🙋
先生、FIR フィルタの設計って、なんで「窓関数」を掛けるんですか?sinc 関数だけじゃダメなんですか?
🎓
いい質問。理想的な「矩形」周波数応答を逆 FFT すると、時間領域では sinc になるんだ。ただし sinc は無限に続くから、そのままだと FIR にできない。仕方なく途中で打ち切ると、両端の不連続が原因で Gibbs 現象——通過帯と阻止帯にギザギザのリプル——が残ってしまう。そこで両端を滑らかに 0 に落とす「窓」を掛けるんだよ。
🙋
なるほど!じゃあ Hamming とか Blackman とか色々あるのは、その「滑らかな落とし方」の違いってことですか?
🎓
そのとおり。矩形 (打ち切るだけ) はリプルが大きく、阻止帯域減衰がせいぜい -21 dB。Hamming は両端を 0.08 まで落とす設計で -53 dB まで深くなる。Blackman はさらに余弦を足して -74 dB。ただし減衰が深くなるほど遷移帯幅は広がる。ストップバンド減衰と遷移の急峻さはトレードオフなんだ。
🙋
タップ数 N を増やせば、急峻さも減衰も改善するんですよね?
🎓
遷移帯幅は M に反比例して狭くなるけど、群遅延 τ_d = M/(2·f_s) も比例して増える。リアルタイム制御やオーディオでは「遅延」が許容できる範囲で M を決めるのが鉄則。スライダーをいじって、遷移帯幅と遅延の動き方を体感してみて。
🙋
具体例だと、どんな場面で FIR を使うんですか?
🎓
線形位相が必要な用途はだいたい FIR。心電図や脳波の解析、デジタルオーディオのクロスオーバ、無線通信の整合フィルタ、画像のエッジ強調などなど。位相歪みが波形を変えてしまう用途では FIR 一択になることが多いんだ。

物理モデルと主要な数式

理想 (壁状) ローパスフィルタの周波数応答 $H_d(f) = 1$ (|f|≤f_c), $0$ (それ以外) を逆 DTFT すると、無限長の sinc 関数になる。

$$h_d[n] = \dfrac{2 f_c}{f_s}\,\mathrm{sinc}\!\left(\dfrac{2 f_c}{f_s}\left(n - \dfrac{M}{2}\right)\right)$$

これを 0 ≤ n ≤ M の有限区間に打ち切り、窓関数 $w[n]$ を掛けて FIR 係数 $h[n] = h_d[n]\,w[n]$ を得る。Hamming 窓は次の式で与えられる。

$$w_{\rm Hamming}[n] = 0.54 - 0.46\cos\!\left(\dfrac{2\pi n}{M}\right),\quad 0 \le n \le M$$

遷移帯幅 $\Delta f$ は窓に固有の係数 $A$ と $\Delta f \approx A\,f_s/M$ で評価でき、Hamming では $A \approx 3.3$ となる。係数が対称 $h[n]=h[M-n]$ のため、線形位相 (定群遅延 $\tau_d = M/(2 f_s)$) が得られる。

実世界での応用

デジタルオーディオの分配: スピーカー間のクロスオーバや、ハイレゾ録音のダウンサンプリング前段で線形位相 FIR を使う。位相歪みが無いので音場が崩れない。

無線通信のパルス整形: ルートレイズドコサイン (RRC) FIR を送受両端に置き、シンボル間干渉 (ISI) を抑える。マッチドフィルタとしての性質も活きる。

計測・センサ前処理: 加速度計やマイクのアンチエイリアシング後の低域抽出、心電図の筋電ノイズ除去、地震動の長周期成分抽出などに用いられる。

画像処理: ガウシアンぼかしや方向性エッジ強調も 2D FIR フィルタ。係数を分離可能にすれば 1D FIR を 2 回掛けるだけで実現できる。

よくある誤解と注意点

誤解 1: 窓を変えれば仕様を自由に満たせる。 窓関数法は阻止帯域減衰量が窓ごとにほぼ固定 (Hamming -53 dB 等) で、自由に指定できない。厳密な仕様には等リプル設計 (Parks-McClellan / Remez) を使う。

誤解 2: タップ数を倍にすれば急峻さも倍。 Δf は 1/M に比例して狭くなるが、遅延 τ_d = M/(2 f_s) も同じだけ伸びる。リアルタイム性が厳しいなら IIR か Parks-McClellan で M を最小化する。

誤解 3: FIR は常に IIR より重い。 確かに同じ仕様だと係数数は多いが、対称性を使う実装や FFT 畳み込みで計算量を大幅に減らせる。位相歪みが許されない場面では FIR の優位は揺るがない。

よくある質問

タップ数 N=M+1 を奇数 (M 偶数) にすると、中央タップが存在し DC ゲインの設計が安定。ハイパスやバンドストップを Type-II FIR (M 奇数) で組むと f_s/2 で必ず 0 になるなど、ゼロ点の制約も決まる。一般用途は M を偶数にするのが定番。
最も簡単なのは M を増やすこと (遅延も同じ比率で増える点に注意)。同じ M で狭めたいなら Parks-McClellan / Remez アルゴリズムで等リプル最適化するか、カイザー窓のパラメータ β を調整して仕様 (Δf, A_s) を満たす。
直接形 FIR は 1 サンプルあたり (M+1) 回の乗加算が必要。対称性を使えば実質 (M/2)+1 回。長いフィルタでは FFT を使った overlap-add / overlap-save で O(N log N) に落とせる。GPU や DSP の SIMD 命令との相性も良い。
可能。ハイパスは「全通 - ローパス」、バンドパスは 2 つの理想ローパスの差、バンドストップは「全通 - バンドパス」で h_d[n] を作り、同じ窓を掛ければよい。設計式はすべて sinc の差分で表せる。