tecktom.com

有限長打ち切りと窓関数

2026年10月15日6分で読めますAI生成教科書『基礎理論』第6章 窓関数と高速 Fourier 変換(FFT)

AI 生成・木下が未勉強

信号処理論入門 第6章 §6.1 ★★ スペクトル漏れと窓のトレードオフ

実際の信号は有限長でしか観測できず、しかも DFT は速く計算したい。本章は、有限長で切り出すことの副作用(スペクトル漏れ)を抑える窓関数と、DFT を O(Nlog⁡N)O(N\log N) で計算する高速 Fourier 変換(FFT)を扱う。

無限に続く信号を長さ NN で観測するのは、時間領域で矩形窓 w[n]w[n](区間内で 11)を掛けることに等しい。畳み込み定理より、これは周波数領域で「真のスペクトル」を窓のスペクトルで畳み込むことになる。矩形窓のスペクトルは sinc⁡\operatorname{sinc} 型で、鋭い主ローブの脇に大きなサイドローブをもつ。このサイドローブを通じて、ある周波数のパワーが周囲の周波数へ漏れ出す—これがスペクトル漏れ(リーケージ)である。

漏れが最も目立つのは、観測区間に信号の周期が整数回入らないときである。たとえばサンプリング周波数 64 Hz64\ \mathrm{Hz}、観測長1秒で4 Hz4\ \mathrm{Hz} の信号はちょうど4周期入って綺麗な線スペクトルになるが、4.5 Hz4.5\ \mathrm{Hz} の信号は端が不連続になり、スペクトルが広くにじむ。

窓関数は、区間の端で滑らかに 00 へ落とす重み w[n]w[n] を掛けて、この不連続を和らげる工夫である。代表例が Hamming 窓

w[n]=0.54−0.46cos⁡ ⁣(2πnN−1)(0≤n≤N−1).w[n]=0.54-0.46\cos\!\Bigl(\frac{2\pi n}{N-1}\Bigr)\qquad(0\le n\le N-1).

窓の性能は二つの指標のトレードオフで決まる。主ローブの幅(狭いほど周波数分解能が高い)と、サイドローブの高さ(低いほどダイナミックレンジが広く、微弱な近接成分を見分けられる)である。矩形窓は主ローブが最も狭い(分解能は最良)がサイドローブが高く漏れが大きい。Hamming 窓などはサイドローブを大きく下げる代わりに主ローブが広がる。分解能を取るか、漏れの少なさを取るかという選択がここにある。

このトレードオフは定性的な話に留めず、数値で持っておくと答案での比較が速い。下の表は代表的な四つの窓について、主ローブ幅と最大サイドローブ高さを実測した値である。主ローブ幅は窓長 NN に反比例するので、NN に依らない量にするためにビン幅 2π/N2\pi/N の何倍かで表す(DFT の隣り合う周波数点の間隔が1ビンである)。零点間幅は主ローブの左右の零点にはさまれた幅、−3-3 dB 幅は振幅が直流成分の 1/21/\sqrt2 になる二点の間隔で、前者は「二本の線スペクトルが完全に分離する距離」、後者は「実用上の分解能」の目安になる。

要点

窓関数の性能(N=1024N=1024 で実測、ビン幅 =2π/N=2\pi/N)

窓零点間幅−3-3 dB 幅最大サイド等価雑音性格
[bin][bin]ローブ [dB]帯域 [bin]
矩形220.890.89−13.26-13.261.001.00分解能は最良・漏れは最悪
Hann441.441.44−31.47-31.471.501.50標準的な折衷。漏れが 1818 dB 下がる
Hamming441.301.30−42.67-42.671.361.36主ローブ幅は Hann と同じでさらに 1111 dB 下
Blackman661.641.64−58.11-58.111.731.73漏れ最小・主ローブは矩形の3倍

押さえる二つの数:矩形窓の最大サイドローブ −13-13 dB(意外に高く、これが漏れの主犯)と、Hann 窓の −31-31 dB(矩形より約 1818 dB 低い)。この二つを覚えておけば、「窓を掛けるとダイナミックレンジが約 1818 dB 広がる代わりに主ローブ幅が2倍になる」という具体的な言い方ができる。
零点間幅の覚え方:矩形窓の主ローブの零点は Ω=±2π/N\Omega=\pm2\pi/N(sinc⁡\operatorname{sinc} 型の最初の零点)なので零点間幅は 22 ビン。Hann と Hamming は cos⁡(2πn/N)\cos(2\pi n/N) を含み、周波数領域では矩形窓のスペクトルを ±1\pm1 ビンずらして重ねた形になるから、零点が1ビン外へ広がって 44 ビンになる。Blackman は cos⁡(4πn/N)\cos(4\pi n/N) の項まで持つので 66 ビンである。
検算=検算スクリプト(scipy.signal の窓を 40964096 倍に零詰めして∣W(Ω)∣\left\vert W(\Omega)\right\vert を直接評価し、上の全数値を再現する)。

落とし穴

漏れの原因は「有限長」ではなく「区間と周期の不整合」
スペクトル漏れを「有限長で切ったから起きる」と説明するのは正確でない。長さ NN の観測区間に信号の周期がちょうど整数回入るなら、その正弦波の周波数は DFT の周波数点にぴったり乗り、隣のビンでは矩形窓のスペクトル WRW_R の零点に当たるので漏れは厳密に 00 になる。実際、N=64N=64・k0=8k_0=8(区間に8周期)の余弦を DFT すると、ピークの k0k_0 と N−k0N-k_0 以外のビンは機械精度でゼロである。同じ有限長のまま k0=8.5k_0=8.5(区間に 8.58.5 周期)にすると、ピーク近傍 ±1\pm1 ビンの外へ全電力の 15 %15\,\% が漏れ出す(どちらも検算スクリプト の後半で実測)。
つまり原因は、周期化したときに区間の右端 x[N−1]x[N-1] と左端 x[0]x[0] の間に生じる段差であり、段差が無ければ有限長でも漏れない。窓関数はこの段差を両端で 00 へ落として消す道具である。なお窓を掛けないことは矩形窓を掛けることと同じなので、「窓を使うかどうか」という選択肢は存在せず、「どの窓を使うか」だけが選べる。

木下の勉強ステータス

木下はまだこの記事を勉強していません。

AI(Claude)が書いた教材を、木下が勉強しながら公開しています。式と数値は検算していますが、誤りが残っているかもしれません。誤りのご指摘・削除のご依頼をいただければ直します。 連絡先:support@tecktom.com

← AI生成教科書『基礎理論』の記事一覧へ