回答:
他の答えは良いですが、私は直感的/視覚的な男なので、もっと直感的/視覚的な答えを出そうとするつもりでした。
下の図は、ほぼ同じ周波数の2つのトーンのプロットです。1つのトーンは赤でプロットされ、もう1つのトーンは青でプロットされます。
次のコードでMatlabで画像を生成しました:
tone1 = sin(2*pi*.05 * (0:99));
tone2 = sin(2*pi*.0501 * (0:99));
plot(tone1)
hold on
plot(tone2, 'r')
画像とコードの両方からわかるように、2つのトーンの周波数は非常に接近しています。彼らはこの短いウィンドウの終わりに向かって少し離れ始めていますが、DFTがそれらを区別できなかった点まで、それらはまだ非常に似ています。
同じ周波数で同じトーンを作成する場合、ウィンドウを長くするだけです(今回は100ではなく5000サンプル)、大きく異なる画像が得られます。明らかに、各トーンにはより多くのサイクルがあります...
...しかし、それは興味深い部分ではありません。ウィンドウの最後にズームインすると、興味深い部分が表示されます。
2つのトーンがウィンドウの端で180度位相がずれていることがわかります。これにより、2つのトーンを簡単に区別できます。では、5000個のサンプルを選択する方法を教えてください。2つのトーンの違いはなので、サンプルラジアンです。
別の答えが述べたように、DFTの解像度は、サンプル周波数をサンプル数(つまり、ウィンドウ長)で割ったものです。私は暗黙的にサンプル周波数を1にしたので、1を5000(サンプル数)で割ると、分解能は.0002 Hzになります。実際のトーンは.0001 Hz異なります。これは、tone2が、tone1のビンとその隣のビンの両方でエネルギーを持っていることを意味します(他のすべてのビンでも少しだけですが、それは別の話です)。
DFTの周波数分解能またはビン幅を計算する場合、式は次のとおりです。
frequency_resolution = sample_rate/fft_size
たとえば、サンプルレートが8000 Hzのオーディオ信号があり、本当に高い周波数分解能が必要だとします。1秒間に8000サンプルしかありませんが、本当に高い周波数分解能を得るために32K FFTを取得したいとします。8000サンプルのシーケンスの32K FFTを取得する場合、FFTを満たすためにシーケンスに0トンを埋め込む必要があります。これを行うことによる付加価値はないので、周波数領域で高解像度を得る一方で、サンプルのサポートが不十分であるため、補間されたデータです。周波数領域のプロットは滑らかで補間されています。
今、あなたはたくさんのデータを持っているが、たくさんのデータがFFTレジスターを満たすのに時間がかかると言います。たとえば、サンプルレートが8000であるのに、本当に高い解像度が必要で、それを待つとします。その32K FFTを満たすまで4秒待ちます。これで、そのFFTを実行するときに、ゼロを埋めるための余分なパディングはありません。したがって、プロットを見ると、これらのビンは内挿されていませんが、それを待っているため、多くのデータによってサポートされています。
それが違いです。サンプルサポートが少ない長いFFTを使用すると、補間されたデータが得られます。つまり、それはあなたが言う時間と周波数のトレードオフです。高解像度が必要な場合は、それをサポートするデータが必要です。