我正在监视音频源并可视化每个通道的功率。我从 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(含)之间。这应该确保你的值分布更稀疏。但是,如果仍然不是,那么您的音频配置可能无法检测到平均振幅的显着变化 - 这种可能性并非那么不可能。在这种情况下,您可能需要查看将音频分解为特定频率并查看每个频率的幅度。