FMOD 频率 analysis/normalisation

FMOD frequency analysis/normalisation

我正在使用 FMOD 库将 FFT 应用于音频流,为我提供不断更新的固定数量的频率仓。每个 bin 代表一个相等的频率范围,其值介于 0 和 1 之间,代表处理后音频的该范围的强度。 FMOD 文档指出这些值可以用分贝表示,其中 val 是介于 0 和 1 之间的值:

Decibels = 10.0f * (float)log10(val) * 2.0f

我正在尝试制作一个类似频闪的自动节拍检测可视化。到目前为止,我以固定间隔进行测试,以查看特定频率仓的强度值是否超过指定边界 - 如果是这种情况,频闪灯会闪烁。虽然这是一种非常粗糙的方法,但它可以相当有效地满足我的要求。

但是,此指定边界仅在 system/music 播放器的音量最大时有效。当我降低任一音量时,频闪灵敏度降低并且变得非常不准确或完全停止闪烁。我假设我需要以某种方式对数据进行标准化,以便独立于体积执行分析,尽管通过 1/value of largest bin 缩放数据,最大值总是最大化。这会永久地超过指定的边界,导致频闪灯无限期地闪烁。我想不出还有什么其他方法可以实现这一目标,并且几天来一直处于精神障碍 - 任何帮助或正确方向的观点将不胜感激!

在更长的范围内标准化。您将需要像信封追随者这样具有较长释放时间的东西。

如果您搜索 'compressor' 源代码或自动增益控制,肯定会出现一些东西。

但广泛使用伪 C++,并处理传入的音频(FFT 之前的时域信号):

auto instant_level = std::abs(signal);
peak_level *= 0.99f;
peak_level = peak_level > instant_level ? peak_level : instant_level;

现在 peak_level 随着时间的推移缓慢衰减。你可以用它来计算增益因子来规范你的传入音频。根据需要调整 0.99f 以获得合理的衰减时间和正确的采样率。

还有一个 Signal Processing stack exchange 站点,您可以在其中更快地找到此类问题的答案(尽管偶尔会附带一些几乎难以理解的代数:))