1

我正在使用 FMOD 进行音频分析,使用 system::getSpectrum 来获取频率数据。我的问题是关于 FMOD 在幕后使用哪些数据来执行 FFT。例如,如果我的输出速率为 44100Hz,并且我每秒调用 getSpectrum() 30 次(每 0.03333 秒),有 1024 个样本:

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

FMOD 是否只获取最后播放的 1024 个 PCM 样本并对其执行 FFT?在这种情况下,如果在 getSpectrum() 调用之间实际读取并播放了 1470 个样本,则仅处理最后 1024 个样本,并且我们丢失了中间 446 个浮点数的信息。然后我调用 getSpectrum 的时间间隔的精度变得非常重要,因为如果我在 0.033 秒后调用它一次和在 0.034 秒后调用它,我不会得到相同的结果,这使得整个事情非常依赖于 FPS 并且完全未定。谁能向我提供有关 FMOD 的底层机制以及如何使其具有确定性的见解?

4

2 回答 2

1

通常,如果您以近似的视频帧间隔或其他类似的计时器事件处理音频数据,您首先计算到达的新音频样本的数量(加上之前留下的任何样本),除以 FFT 帧长度和/或偏移,截断为整数,并处理那么多帧,并将剩余的未处理样本保存到下一个处理时间,这样你就不会“丢失它们的信息”。

您通常不会在不检查新音频样本的数量并根据需要缓冲它们的情况下,每 30 Hz 回调调用一次 FFT。

如果您不希望图形显示抖动,则必须在音频帧结果之间进行一些插值,和/或更精确地同步音频和视频时钟,同时使用可以很好地分割的帧偏移量。

于 2013-08-02T18:54:38.803 回答
0

我不得不联系 FMOD 支持以获得答案。简而言之,FMODs FFT 每 1024 个样本更新一次,我有责任尽快获取新数据,并检查它是否与我上次获取的数据不同。

链接到 FMOD 论坛上的问题

于 2013-08-06T13:43:14.850 回答