【问题标题】:FMOD frequency analysis/normalisationFMOD 频率分析/归一化
【发布时间】:2023-03-12 14:35:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: algorithm audio normalization frequency fmod


    【解决方案1】:

    在更长的范围内标准化。您将需要具有较长发布时间的信封追随者之类的东西。

    如果您搜索“压缩器”源代码或自动增益控制,肯定会出现一些问题。

    但广泛使用伪 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 以获得合理的衰减时间和正确的采样率。

    还有一个信号处理堆栈交换站点,您可以在其中更快地获得这类问题的答案(尽管偶尔会附上几乎难以理解的代数:))

    【讨论】:

    • 谢谢,现在我可以开始学习了!不知道信号处理 SE,很可能会发现自己在那里一段时间。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    相关资源
    最近更新 更多