窓関数 — スペクトル漏れを手なずける
DFT の前に信号へそっと掛け算する「窓」。たったそれだけの前処理が、スペクトルの見え方を劇的に変えます。漏れ(スペクトルリーク)が生まれる理由と、窓の形が決めるメインローブ幅 ⇔ サイドローブ抑圧のトレードオフを、動かしながら確かめます。
1. 切り取るだけで嘘が混ざる — スペクトル漏れ
DFT は「渡された N 点の区間が、無限に繰り返される周期信号だ」と仮定して計算します。連続する正弦波から一部分を矩形に切り出したとき、区間の端と端の値が一致していなければ、繰り返しのつなぎ目に存在しないはずの「段差」が生まれます。この段差は鋭いクリック音と同じで、あらゆる周波数に成分をまき散らします — これがスペクトル漏れです。
下のデモで切り出し位置と窓内の周期数を動かしてみてください。周期数がちょうど整数のときだけ、段差が消えて漏れがなくなります。
なぜ漏れるか — 切り出しの「段差」がサイドローブを立てる
上段=連続正弦波と切り出し区間(矩形)。中段=DFTが仮定する周期化。つなぎ目の赤い段差に注目。下段=そのスペクトル(対数)。周期数を 6.5 のような非整数にすると、本来1本の線であるはずのスペクトルの裾が広がり、サイドローブが立ちます。「ハン窓を掛けてみる」をオンにすると端が絞られて段差が消え、裾が急降下します。
|W(f)| = |sin(Nπf) / sin(πf)|
矩形窓のスペクトル(ディリクレ核)。最初のサイドローブはメインローブから約 −13 dB しか下がらない
POINT — 漏れの正体は「勝手な周期化」
漏れは信号のせいではなく、切り出した区間が周期的に続くと DFT が仮定することから生まれる。窓内にぴったり整数周期が収まれば漏れはゼロ。しかし実際の信号でそれを保証することはできないので、端をなだらかに0へ絞る窓関数で段差そのものを消す。
2. 端をなだらかに絞る — 窓関数ギャラリー
窓関数は「切り出し方の形」です。矩形窓(=何もしない)に対して、ハン窓・ハミング窓・ブラックマン窓は端に向かって振幅を滑らかに絞ります。するとサイドローブ(裾の偽ピーク)は大きく下がる代わりに、メインローブ(本物のピーク)の幅が太くなります。
窓関数ギャラリー — 形とスペクトルの対応
上段=窓の形(紫)と窓掛け後の波形(水色)。下段=窓自体の対数スペクトル。矩形→ブラックマンの順にサイドローブ(点線の高さ)が −13 → −58 dB へ下がる代わりに、メインローブ(青い帯)が 2 → 6 bin へ太っていきます。
w[n] = 0.5 − 0.5 cos( 2πn / (N−1) )
ハン窓。コサインを1個持ち上げただけの形が、STFT・スペクトログラムの世界標準
注意 — 窓はタダではない
窓を掛けると信号の端を捨てるぶん実効的な観測時間が短くなり、メインローブが太る=周波数分解能が下がる。さらに全体の振幅も変わる(コヒーレントゲイン)。「サイドローブを下げたいから常に強い窓」ではなく、目的に応じた最小限の窓を選ぶのが基本。
3. 近接した2つの音を見分けられるか — 分離チャレンジ
窓選びが実際に効く場面を試します。周波数がわずかに違う2つの正弦波を同時に鳴らし、スペクトルで2本のピークとして分離できるかを見ます。
- 2音が同じ大きさのとき — 勝負を決めるのはメインローブ幅。周波数差がメインローブ幅より小さいと、2つの山が融合して1つに見えます。幅が最も細い矩形窓が意外にも有利。
- 片方が微弱なとき — 勝負を決めるのはサイドローブ。矩形窓では強い音のサイドローブ(−13 dB)が弱い音を埋めてしまい、ハン窓やブラックマン窓でないと見えません。
近接2周波数の分離チャレンジ
緑・ピンクの点線=2音の本当の周波数。Δf を 1 bin 前後まで詰めると、どの窓でも山が融合します(ハン窓は矩形より早く融合)。次に「音2の大きさ」を −30 dB にしてみてください — 矩形窓ではサイドローブの海に沈み、ハン窓・ブラックマン窓で初めて顔を出します。
4. どの窓を使えばいいか
| 窓 | メインローブ幅 (null-null, bin) | 最大サイドローブ | 向いている場面 |
|---|---|---|---|
| 矩形 | 2(最も細い) | −13 dB | 整数周期が保証されるとき/過渡信号(インパルス応答など)をそのまま見るとき |
| ハン | 4 | −31 dB | 迷ったらこれ。STFT・スペクトログラムの定番。オーバーラップ合成とも相性が良い |
| ハミング | 4 | −43 dB | 第1サイドローブを深く抑えたいとき。音声分析の伝統的定番 |
| ブラックマン | 6 | −58 dB | 強い成分のすぐ近くの微弱な成分を探すとき(高調波・スプリアス測定) |
- 漏れの原因=切り出し端の段差。DFT の「周期化」仮定が生む。
- 窓関数=端を滑らかに0へ絞って段差を消す。サイドローブが下がる代わりにメインローブが太る。
- 選び方=等振幅の近接分離なら細いメインローブ、微弱信号の検出なら低いサイドローブ。
一歩先へ — トレードオフを連続的に調整する
カイザー窓はパラメータ β を回すだけで「矩形寄り ⇔ ブラックマン寄り」を連続的に選べる万能窓。また振幅を正確に測りたい校正用途では、ピーク付近が平らなフラットトップ窓が使われる。窓設計は次のレッスンの FIR フィルタ設計(窓関数法)とも直結している。