窓関数
窓関数(まどかんすう、window function)とは、ある有限区間(台)以外で0となる関数である。
ある関数や信号(データ)に窓関数が掛け合わせられると、区間外は0になり、有限区間内だけが残るので、無限回の計算が不要になり数値解析が容易になる。窓関数は、データから成分を抽出するアルゴリズムの中核に当たり、スペクトル分析、フィルタ・デザインや、音声圧縮に応用される。窓関数を単に窓 (window) ともいい、データに窓関数を掛け合わせることを窓を掛ける (windowing) という。理論的に最良の結果が得られるSinc関数を利用するフィルタは無限回の計算(現実には不可能)を必要とするが、フィルタを有限回の計算だけで実現するために、周波数分解能とダイナミックレンジのトレードオフの中で様々な窓関数が考案されている。単に有限個のデータを用意しただけでも暗黙的に窓関数を掛けた事になる(矩形窓)。矩形窓の場合、周波数分解能は最良であるが、ダイナミックレンジは最悪で、データに含まれる成分がノイズに埋もれてしまい実用的でない。従って、改良された窓関数では各データに異なる重み付けを行って周波数分解能を多少犠牲にしてダイナミックレンジを改善している。
フーリエ変換は、区分的に C^1 \, 級な任意の関数 f(x) \, を、三角関数(あるいは指数関数)の線形結合で表す。
なお、f \, のフーリエ変換を \mathfrak{F} f で表す。
フーリエ変換では、関数 f(x) \, も三角関数も、無限区間  (-\infty,\infty)  で定義されている。
しかし、実データを数値的にフーリエ変換するなら、無限の長さは扱えないので、有限区間 [a,b] \, でフーリエ変換をおこない、区間外は無視することになる。
これは、関数 f(x) \, を区間外で0とみなすことに等しい(「区間内のデータを周期的に繰り返す」という表現をすることもあるが、DFT(離散フーリエ変換)の場合はこの2つは等価である)。
つまり、関数  f(x) \, と関数
の積 (wf)(x) = w(x)f(x) \, を求め、そのフーリエ変換 \mathfrak{F} (wf) を、\mathfrak{F} f の代わりに得ていることになる。
このとき掛け合わせた関数 w(x) \, が窓関数である。
ここで定義した窓関数 w(x) \, (矩形窓という)でなくても、有限区間外が0で区間内が有界な関数ならば、窓関数として使える。
そこで、さまざまな窓関数が考案されている。
実際、上の矩形窓はあまり性能がよくない。それは、x = a, b \, にいちじるしい不連続があるからである。
実際に使われる窓関数のほとんどは、両端が滑らかに小さくなり区間外の0につながる、山形の関数である。
窓関数を使って求めたスペクトル \mathfrak{F} (wf) と、本来のスペクトル \mathfrak{F} f は、もちろん同じではない。
積のフーリエ変換はフーリエ変換の畳み込み、つまり、
である。
余分な \mathfrak{F} w が畳み込まれることによって、フーリエ変換の結果は変化するが、この変化は望ましいものではない。
一般に \mathfrak{F} w は、中心が絶対値が大きく、両側に離れるにつれ小さくなるが、0になることはない(w(x) \, が有限区間外で0ならば、常にそうなる)。
ただし、単峰性ではなく、図のように、無数の峰を持つ。
各々の峰をローブといい、中央のいちばん大きいローブをメインローブ、他をサイドローブという。このような \mathfrak{F} w が畳み込まれることにより、スペクトルは、ピークがなまり(周波数分解能が下がり)、ノイズ・フロアが上がる(ダイナミック・レンジが狭まる)ことになる。
窓関数には、
メインローブが狭い(周波数分解能が良い)
サイドローブが低い(ダイナミックレンジが広い)
という2つの特長が要求される。
しかし、この2つはトレード・オフの関係にあり、両立させるには限界がある。
そのため、ある状況では最適だった窓関数が、別の状況ではそうではないということも起こる。
周波数分解能とダイナミックレンジの概念は、窓関数の使用者が何を行おうしているかに依存しており、やや主観的な傾向がある。
しかしながら、周波数分解能やダイナミックレンジは、定量化可能な全リーク量と密接に関連する。
リークは一般的に等価の帯域幅 B として表される。
リークについてDTFTによる長方形(高さはスペクトルの最大で幅は B )への再分配を考えた場合、より多くのリークはより大きな帯域幅となる。
入力信号がランダム・ノイズ成分を含んでいる(あるいは単にランダム・ノイズである)時、それぞれのDFTビンに含まれる平均電力に比例するため、この帯域幅は雑音等価帯域幅もしくは等価雑音帯域幅と呼ばれる。
一定時間で平均化したパワースペクトルのグラフが一般的に水平なノイズフロアとして現れる現象は、この結果発生している。ノイズフロアの高さは B に比例する。よって、2つの異なる窓関数では、異なるノイズフロアが発生する。
フーリエ変換に限らず、DCT(離散コサイン変換)や連続ウェーブレット変換でも、窓関数を使う。
とりわけ、近年、音声圧縮などに使われるMDCT(修正離散コサイン変換)のための窓関数は、プリンセン‐ブラッドリー条件 (Princen-Bradley condition) という、他の用途では要求されない性質が必要なこともあり、独特なものが新しく登場している。
なお、プリンセン‐ブラッドリー条件を満たす窓関数を、MDCT窓、プリンセン‐ブラッドリー窓などという。
変わった応用では、窓関数を掛けるのではなく、畳み込むという手法がある。
\mathfrak{F} (w * f) = \mathfrak{F} w \mathfrak{F} f(畳み込みのフーリエ変換はフーリエ変換の積)なので、窓関数がデジタル・フィルタとして働くことになる。
窓関数はデジタルフィルタのデザインにも用いられる。Sinc関数によって、理想的的な無限系列中のIIR(無限インパルス応答)のフィルター処理を有限系列中のFIR(有限インパルス応答)フィルター・デザインによる処理に変換する場合などがこれに該当する。これを "window method" と呼ぶ。
特に断らない限り、区間を [0,1] \, にとり、\max_{x} w(x) = 1 \, と正規化した式を書く。
区間を [-1,1] \, にとる資料もある。
w(x) = 0 \, となる場合分けは省略した。w(x) = 0, \mbox{ otherwise} \, を適宜おぎなって読んでほしい。
離散化するには、k = 0, \ldots , N - 1 に対して、x = k / (N - 1) \, と、x = (k + 0.5) / N \, の2種類の方法があるが、特殊な用途を除き、どちらでも大差はない。また、初めから k \, に対する関数 w(k) \, や系列 w_k \, を表す資料もあるので、注意してほしい。
グラフは、x = k / (N - 1) \, と離散化したときの、窓関数自身と、DFTで求めたパワースペクトルである。
rectangular window。方形窓とも。
単に有限長のデータを用意しただけのとき、暗黙のうちにこの窓関数を使っている。理論上、周波数分解能は最も良い。
w(x) = 1, \ \mbox{if } 0 \leq x \leq 1 clear
Gauss window。ガウシアン窓 (Gaussian window) とも。
ガウス関数のフーリエ変換は再びガウス関数になる(フーリエ変換の固有関数である)。ガウス関数は無限に広がるため、実用上必要な長さまでで計算を打ち切る必要がある。無限に広がる窓関数を不連続に打ち切った場合、矩形窓を掛けた事になり、通過帯域と阻止帯域にリップルが発生し、サイドローブも大きく上昇する。主に、ガボール変換 (Gabor transform)や連続ウェーブレット変換で使われる。
w(x) = \exp \left( -\frac{x^2}{\sigma^2} \right) clear
hann window(hannは人名由来だが、慣習的に小文字で書く)。フォンハン窓 (von Hann window)、2乗余弦窓、raised cosine windowとも。ユリウス・フォン・ハンが考案した。ハン窓及び後述のハミング窓は、後の研究で後述する一つの関数族「一般化ハミング窓("raised cosine" または "generalized Hamming" 窓)」に分類されたため、ハン(Han)とハミング(Hamming)両名の名前から合成された「ハニング窓(hanning window)」という呼び方でハン窓を指す場合もある。
最もよく使われる窓関数の一つ。
w(x) = 0.5 - 0.5 \cos 2 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
hamming window(hammingは人名だが、慣習的に小文字で書く)。ハン窓の改良版として、リチャード・ハミングが考案した。
ハン窓と並び、最もよく使われる窓関数の一つ。ハン窓より周波数分解能が良く、ダイナミック・レンジが狭い。区間の両端で不連続なのが特徴。
w(x) = 0.54 - 0.46 \cos 2 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
ジョン・テューキーが考案した。コサイン関数を用いて以下のように表される。
w(x)=
\begin{cases}1,& x\leq \frac{L_x}{2}-x_w \\
\frac{1}{2}-\frac{1}{2}\cos\left(\frac{\pi\left(x-\frac{L_x}{2}\right)}{x_w}\right),& \frac{L_x}{2}-x_w<x<\frac{L_x}{2}\\0,& x>\frac{L_x}{2}
\end{cases}
ここでxw は窓の幅である。
ハニング窓
Blackman window。ラルフ・ブラックマンが考案した。
ハン窓/ハミング窓より、周波数分解能が悪く、ダイナミック・レンジが広い。この種のフィルタの中では、最もよく使われる。
w(x) = 0.42 - 0.5 \cos 2 \pi x + 0.08 \cos 4 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
Kaiser window。カイザー‐ベッセル窓 (Kaiser‐Bessel window) ともいうが、後述のカイザー‐ベッセル派生窓と紛らわしい。J・F・カイザーが考案した。
柔軟な特性変更ができるためデジタル信号処理において良く用いられる。
実数パラメタ \alpha \geq 0 \, を持つ( \beta = \pi \alpha \, をパラメタとすることもある)。\alpha \,が0であれば矩形窓そのものである。\alpha \,を大きくするほどD/A変換の理論上において最も理想的な特性を持つガウス窓への近似度を高めることができ、周波数分解能が悪くなる代わりにダイナミックレンジが広くなる。\alpha \,の調節だけで2種類の窓関数の特性の間を連続的に推移できるのが最大の特長である。周波数分解能はおおよそ \sqrt \alpha に反比例する。
\alpha = 0 \, では矩形窓と同じ。\alpha = 1.5 \, ではハミニング窓に、\alpha = 2 \, ではハン窓に、\alpha = 3 \, ではブラックマン窓に似た形になる。
w(x) = \frac{ I_0 \left\{ \pi \alpha \sqrt{ 1 - (2 x - 1) ^ 2 } \right\} }{ I_0( \pi \alpha ) }, \ \mbox{if } 0 \leq k \leq 1
ただし、I_0 \, は第1種の0次の変形ベッセル関数。clear
Bartlett window。三角窓 (triangular window) とも。
教科書には必ず出てくるが、実際に使うことは少ない。
w(x) = 1 - 2|x - 0.5|, \ \mbox{if } 0 \leq x \leq 1 clear
exponential window。
減衰積分をおこなうとき、暗黙のうちにこの窓関数を使っている。コンパクト・サポートでないので、実際に使うときは適当な区間の外を0にする。左右非対称なので、エコー検出など、時間非対称な問題に使う。
w(x) = \exp \frac{x}{T}, \ \mbox{if } x \leq 0
ハン窓とハミング窓の一般化。実数パラメタ a, \ 0.5 \leq a \leq 1 を持ち、a = 0.5 \, でハン窓、a = 0.54 \, でハミング窓、a = 1 \, で矩形窓になる。
w(x) = a - (1 - a) \cos 2 \pi x, \ \mbox{if } 0 \leq x \leq 1
Bartlett‐Hann window。修正バートレット‐ハン窓 (modified Bartlett‐Hann window) とも。
バートレット窓とハン窓の線形混合。異なる比率のものを使うこともある。
w(x) = 0.62 - 0.48 | x - 0.5 | - 0.38 \cos 2 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
Nuttall window。
w(x) = 0.355768 - 0.487396 \cos 2 \pi x + 0.144232 \cos 4 \pi x - 0.012604 \cos 6 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
Blackman‐Harris window。
w(x) = 0.35875 - 0.48829 \cos 2 \pi x + 0.14128 \cos 4 \pi x - 0.01168 \cos 6 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
Blackman‐Nuttall window。
w(x) = 0.3635819 - 0.4891775 \cos 2 \pi x + 0.1365995 \cos 4 \pi x - 0.0106411 \cos 6 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
flat top window。スペクトルのメインローブの頂部が平らであることから、こう呼ぶ。別の式で表される窓関数を「フラット・トップ窓」と呼ぶことがある。
w(x) = 1 - 1.93 \cos 2 \pi x + 1.29 \cos 4 \pi x - 0.388 \cos 6 \pi x + 0.032 \cos 8 \pi x, \ \mbox{if } 0 \leq x \leq 1 clear
Parzen window。
ガウス窓の区分3次関数による近似。
w(x) = \begin{cases} 1 - 1.5 x^2 + 0.75 |x|^3, & \mbox{if } |x| \leq 1 \\ 0.25 (2 - |x|)^3, & \mbox{if } 1 \leq |x| \leq 2 \end{cases}
Akaike window。
w(x) = 0.625 - 0.5 \cos 2 \pi x - 0.125 \cos 4 \pi x, \ \mbox{if } 0 \leq x \leq 1
Welch window。
w(x) = 4 x (1 - x), \ \mbox{if } 0 \leq x \leq 1
MDCT(修正離散コサイン変換)の前処理に使う。
MDCTでの変数定義の慣習にしたがい、離散化には、x = (k + 0.5) / N, \ k = 0, \ldots ,N - 1 のデータ数を 2N \, とした式
を用いることが多い。
sine window。半波余弦窓 (half cycle sine window) とも。MP3など多くのフォーマットが使用。
w(x) = \sin \pi x, \ \mbox{if } 0 \leq x \leq 1
Vorbis window。Vorbisが使用。
w(x) = \sin \left( \frac{\pi}{2} \sin^2 \pi x  \right), \ \mbox{if } 0 \leq x \leq 1
Kaiser‐Bessel derived window。KBD窓 (KBD window) とも。AC3やAACが使用。
Lanczos window。ランツォシュ・フィルタとも。
整数パラメタ n \geq 1 \, を持つ。n \, の値によって、n \, 次ランツォシュ窓、ランツォシュ n \, 窓などと呼ぶ。
データのデシメーション(画像縮小など)の前処理に、LPF(低域通過フィルタ)として使われる。
w(x) = \mathrm{sinc} x \cdot \mathrm{sinc} \frac{x}{n}, \ \mbox{if } |x| \leq n
ただし、\mathrm{sinc}x = ( \sin \pi x ) / \pi x \, は正規化sinc関数。
窓と言いつつ、無限長の台を持つ(つまり原点からどこまで離れても関数値が0にならない)関数である。直接的な実装を考えた場合は実用的ではないが、フィルタの基礎理論として重要で、近似的な窓であるランツォシュ窓などが考案され画像の拡大縮小などに広く活用されている。
Sinc窓はBrick-wall filtersとなる。