algorithm - FMOD频率分析/归一化

标签 algorithm audio normalization frequency fmod

我正在使用FMOD库将FFT应用于音频流,从而为我提供了不断更新的固定数量的频点。每个bin代表一个相等的频率范围,其值介于0和1之间,以表示来自已处理音频的该范围的强度。 FMOD文档指出,这些值可以用分贝表示,其中val是0到1之间的值:
Decibels = 10.0f * (float)log10(val) * 2.0f
我正在尝试制作自动的类似频闪的节拍检测图像。到目前为止,我以固定间隔进行测试,以查看特定频率档的强度值是否超过指定的边界-如果是这种情况,频闪灯将闪烁。尽管这样做的方法很粗糙,但对于我的要求而言,它却相当有效。

但是,仅当系统/音乐播放器的音量最大时,此指定的边界才有效。当我减小其中任何一个的音量时,闪光灯的灵敏度都会降低,或者变得非常不准确或完全停止闪烁。我假设我需要以某种方式对数据进行规范化,以便独立于体积执行分析,尽管通过1/value of largest bin缩放数据始终可以使最大值最大化。这将永久超过指定的边界,导致频闪灯无限期闪烁。我想不出还能怎么做到,而且已经困扰了好几天了,任何帮助或朝着正确方向迈出的步伐将不胜感激!

最佳答案

规范化更长的范围。您将需要具有较长发布时间的信封追踪器之类的东西。

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

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

还有一个信号处理堆栈交换站点,您可以在该站点上更快地回答此类问题(尽管有时会附带几乎不可理解的代数:))

关于algorithm - FMOD频率分析/归一化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884807/

相关文章:

image - Action 3。在mp3可用或不可用时显示替代图像(使用条件图像)

swift - Swift:响应中带有应用程序/八位字节流的GET请求

database-design - 如何在列上存储元数据

scikit-learn - 在 sklearn 管道中使用标准化

algorithm - 递归和动态规划

java - 在 Java 中使用扫描线算法的最近点对

audio - FFMPEG:两个单声道到一个立体声文件,其持续时间是这两个单声道文件中最长的

algorithm - 最大值(value)决策

algorithm - Python中的运输算法

c++ - 通过强度值归一化图像的颜色 channel ,OpenCV