1

system::getSpectrumto を使用して周波数データを取得し、オーディオ分析に FMOD を使用しています。ここでの私の質問は、FMOD が舞台裏で FFT を実行するために使用するデータについてです。たとえば、出力レートが 44100Hz で、getSpectrum() を 1 秒間に 30 回 (0.03333 秒ごとに) 1024 サンプルで呼び出すとします。

system.getSpectrum(data, 1024, 0, FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS);

FMOD は、再生された最後の 1024 個の PCM サンプルを取得し、それらに対して FFT を実行するだけですか? この場合、1470 個のサンプルが getSpectrum() 呼び出しの間に実際に読み取られて再生された場合、最後の 1024 個のサンプルのみが処理され、中間の 446 個のフロートに関する情報が失われます。次に、getSpectrum を呼び出す間隔の精度が非常に重要になります。一度 0.033 秒後に呼び出すと、次の 0.034 秒後に呼び出すと、同じ結果が得られないため、すべてが FPS に大きく依存し、完全に未定。FMOD の内部メカニズムと、これを決定論的にする方法についての洞察を誰かに教えてもらえますか?

4

2 に答える 2

1

通常、おおよそのビデオ フレーム間隔または他の同様のタイマー イベントでオーディオ データを処理している場合は、最初に到着した新しいオーディオ サンプルの数 (および以前に残ったサンプル) を計算し、FFT フレーム長で割ります。オフセットし、整数に切り捨て、その数のフレームを処理し、未処理のサンプルの残りを次の処理時間のために保存して、「それらの情報を失う」ことはありません。

通常、新しいオーディオ サンプルの量を確認し、必要に応じてそれらをバッファリングすることなく、30 Hz コールバックごとに 1 回だけ FFT を呼び出すことはありません。

グラフィック表示にジッターを発生させたくない場合は、オーディオ フレームの結果間で何らかの補間を行うか、適切に分割されるフレーム オフセットを使用しながら、オーディオとビデオのクロックをより正確に同期させる必要があります。

于 2013-08-02T18:54:38.803 に答える