備忘録

開発でつまったところの備忘録.不定期に更新します.

FFTの窓関数とオーバーラッピング

FFTの窓関数とオーバーラッピングが何なのかやっと分かったのでメモ

 

まずここ

http://www.toyo.co.jp/page.jsp?id=2399

を読むと

FFTでは一定のブロック幅でデータを切り出して解析するけど、一つのブロックを並べたときに連続になるように切り出さないと(周期信号なら周期の倍数分でぴったり)非連続な周期関数としてFFTされちゃうから戻したときにクリック音が生じるし、そもそもよけいな周波数成分がたくさんでちゃうという問題がありますと。

 

ということで各ブロックに対して端が0の窓関数を適用してどこで切り出してもいつでも連続になるようにすることで、この問題が解決できます。

 

これが窓関数で、窓関数にも矩形やら三角やらハミングやらいろいろありますと。

 

周期関数はどこで切り出しても振幅にそこまで影響はないからこれでいいんだけど、非周期関数は切り出し位置によって振幅の大きなところを窓関数で小さくしてしまったり大きく影響を受けてしまうからこれだけでは問題だと。

 

ということで、ブロック同士の重なり合いを設けて窓関数による特定位置の取りこぼしを防ごうというのがオーバーラッピングです。

これによってあらゆる位置での窓関数による減衰を防ぐことができます。

 

mspチュートリアルでやっていたのは

http://www.kumikomi.net/archives/2010/09/ep30rir2.php?page=4

に書いてあるハーフオーバーラッピングで、50%の重なり合いを設けるという方法です。

 

まとめると

周期信号では窓関数

非周期信号では窓関数+オーバーラッピング

を設けてFFTが巧くいくように頑張りましょうってことです。