用于缩放突出显示峰值的线性范围的函数



我正在监视音频源并可视化每个通道的功率。我从 api 中得到了一个数字(averagePowerForChannel,但语言/平台对于这个问题来说并不重要)。

当我将两个数字相加时,我有一个从 -240...0 开始的刻度。这是有道理的,因为这是分贝范围。

我将这个比例转换为来自0...1的相同数字的线性表示。(我知道分贝是对数的,我不管它,只是线性映射比例尺)

然后,我将0...1值分配给一个 alpha 通道,该通道很好地表示正在播放的音频。

问题是它在美学上没有表现出足够的变化。该值略有变化,通常徘徊在 80 左右:

alpha: 0.820713937282562
alpha: 0.816978693008423
alpha: 0.830410122871399
...

正如您可能想象的那样,这只会产生轻微的闪烁。

相反,我想强调音频的高峰。我已经抛出了一些不同的方法:

//        var alpha = 1 / (1 + exp(1-linear)) // never gets fully bright, sits at about .45
//        var alpha = 1 - exp2(-linear) // stays around .45
//        var alpha = linear / linear + 1

这些并没有给我带来好的结果,但话又说回来,我不知道我想做什么。

目标:

  • 范围内的低值被推到零或接近零(甚至可以在计算曲线后将范围下移0.2
  • 中间值被推低
  • 高值的差异会加剧(例如:.83 非常接近 1,但 .81 偏移到 .5)

我想我可能想要一条指数曲线?我不确定。对于已知输入,这是一个非常具体的问题,因此幻数解决方案是可以接受的。

通过将范围移动到一个有趣的区域,然后使用指数曲线来强调从那里开始的变化,我得到了令人满意的视觉效果:

var alpha = volume / maxVolume
alpha = alpha - 0.5   // Shift the range over to the area with interesting differences in our source tracks
alpha = pow(alpha, 3) // Emphases the changes in this range
alpha *= 10           // Fix the decimal place

会接受一个更好/更纯粹的答案——为此,我只是摆动数字,直到他们给我一个好的视觉结果。很抱歉在这里恶心了 CS 人员:)

最好的答案可能是频率隔离,但有足够的有趣差异来制作没有它的良好视觉效果。

不知道为什么不反转对数关节量表:

分贝 = 10 * log10( 值 );

逆的只是代数:

值 = pow(10.0,分贝/10);

请注意,由于decibels介于 -240 和 0 之间,因此value介于 0(不包括)和 1(含)之间。这应该确保你的值分布更稀疏。但是,如果仍然不是,那么您的音频配置可能无法检测到平均振幅的显着变化 - 这种可能性并非那么不可能。在这种情况下,您可能需要查看将音频分解为特定频率并查看每个频率的幅度。

相关内容

  • 没有找到相关文章

最新更新