私はフーリエ変換を行うコードで作業しています(オーディオサンプルのケプストラムを計算するため)。フーリエ変換を計算する前に、サンプルにハミングウィンドウを適用します。
for(int i = 0; i < SEGMENTATION_LENGTH;i++){
timeDomain[i] = (float) (( 0.53836 - ( 0.46164 * Math.cos( TWOPI * (double)i / (double)( SEGMENTATION_LENGTH - 1 ) ) ) ) * frameBuffer[i]);
}
なぜこれを行うのですか?コードまたはオンラインでこれを行う理由が見つかりません。
有限フーリエ変換を行うときはいつでも、無限反復信号に暗黙的に適用します。そのため、たとえば、有限サンプルの開始と終了が一致しない場合、信号の不連続のように見え、フーリエ変換では多くの高周波ナンセンスとして表示されますが、本当に欲しい。サンプルが美しい正弦波であるにもかかわらず、整数の周期が有限のサンプルに正確に収まらない場合、FTは実際の周波数に近いあらゆる場所でかなりのエネルギーを示します。あなたはそれを望んでいません。
データをウィンドウ化することにより、すべてが合理的にスムーズに保たれ、両端が一致することが保証されます。これにより、前の段落で説明した種類の「スペクトル漏れ」が大幅に減少します。
これは古い質問ですが、答えを改善できると思いました。
フーリエ変換する信号が純粋な正弦波であると想像してください。周波数領域では、正弦波の周波数でのみ鋭いスパイクがあると予想されます。ただし、フーリエ変換を使用すると、ニースの鋭いスパイクは次のようなものに置き換えられます。
何故ですか?実際の正弦波は両方向に無限に広がります。コンピューターは無数のデータポイントで計算を行うことができないため、すべての信号は両端で「切断」されます。これにより、ピークの両側にリップルが表示されます。ハミングウィンドウによりこのリップルが減少し、元の信号の周波数スペクトルをより正確に把握できます。
より多くの理論、興味のある方へ:あなたがどちらかの端であなたの信号を遮断するとき、あなたは暗黙的にあなたの信号に正方形の窓を掛けています。正方形ウィンドウのフーリエ変換は、上記の画像であり、sinc関数として知られています。好きかどうかに関係なく、コンピューターでフーリエ変換を行うときは常に、some windowを選択します。正方形のウィンドウは暗黙のデフォルトですが、あまり良い選択ではありません。最適化する特定の特性に応じて、人々が思いついたさまざまなウィンドウがあります。ハミングウィンドウは標準のものの1つです。
私が音と迅速な研究について知っていることから、ハミングウィンドウは信号のサイドローブ(不要な放射)を最小限に抑えるためにここにあるようです。したがって、音の品質または倍音を改善します。また、このタイプの window function がDTFTに適していることも理解しています。
スタンフォードの研究者ページ または wikipedia で、また Harris の論文で、技術的な説明を見つけることができます:D 。
正弦波の有限長セグメントのFTは、正弦波の周波数ピークに対するウィンドウのフーリエ変換を畳み込みます。これは、FFTの特性により、一方の領域でのベクトル乗算が他方での畳み込みであるためです。矩形ウィンドウのFT(FFTのサンプルの変更されていない有限長が意味するもの)は、周波数スペクトル全体にわたってウィンドウ内で正確に周期的ではない信号を飛び散らせる乱雑なSinc関数です。
ハミング型ウィンドウのFTは、畳み込み後の(Sinc関数より)周波数ピークにはるかに近いこの「スプラッター」を集中させます。その結果、周波数ピークは太くなりますが滑らかになります。これにより、見た目のスペクトルがきれいになるだけでなく、目的の信号の遠方の周波数からの干渉も少なくなります。
「無限に繰り返される」解釈とは対照的に、この解釈により、ハミングとは異なる形状のウィンドウがより少ない「漏れ」でより良い結果をもたらす理由がより明確になります。特に、ハミングウィンドウは、関心のある周波数から遠く離れた実際の「漏れ」(または畳み込みスプラッタ)と引き換えに、周波数ピークのすぐ隣にある「漏れ」の最初のSincサイドローブのサイズを小さくします。別のトレードオフを希望する場合は、他のウィンドウがより適切な場合があります。上記の別の回答にリンクされているハリスの論文( pdf here )は、これらの異なるウィンドウの例をいくつか示しています。