FMOD 频谱数据确定性
Posted
技术标签:
【中文标题】FMOD 频谱数据确定性【英文标题】:FMOD Spectrum Data Determinism 【发布时间】:2013-08-02 13:21:25 【问题描述】:我正在使用 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 的底层机制以及如何使其具有确定性的见解?
【问题讨论】:
【参考方案1】:通常,如果您以近似的视频帧间隔或其他类似的计时器事件处理音频数据,您首先计算到达的新音频样本的数量(加上之前留下的任何样本),然后除以 FFT 帧长度和/或偏移,截断为整数,并处理那么多帧,并将剩余的未处理样本保存到下一个处理时间,这样您就不会“丢失它们的信息”。
您通常不会在不检查新音频样本的数量并根据需要缓冲它们的情况下每 30 Hz 回调调用一次 FFT。
如果您不希望图形显示出现抖动,则必须在音频帧结果之间进行一些插值,和/或更精确地同步音频和视频时钟,同时使用可以很好地分割的帧偏移量。
【讨论】:
我明白你的意思,如果可以的话,我会这样做,但是除了“getSpectrum”函数之外,FMOD 没有公开它的任何 FFT 功能。因此,即使我保存了帧之间的数据,我也无法对其执行 FMODs FFT。这是一个 FMOD 特定的上下文,如果我无法完成这项工作,我目前正在移植我的代码以使用 fftw :)【参考方案2】:我不得不联系 FMOD 支持以获得答案。简而言之,FMODs FFT 每 1024 个样本更新一次,我有责任尽快获取新数据,并检查它是否与上次获取的数据不同。
Link to Question on FMOD Forums
【讨论】:
以上是关于FMOD 频谱数据确定性的主要内容,如果未能解决你的问题,请参考以下文章