将ReplayGain值转换为音量调整

时间:2012-09-28 11:59:19

标签: android math logarithm acoustics replaygain

我正在尝试将重播增益(即,响应音乐文件中的重播标签)实施到股票Android / AOSP音乐播放器应用中。这只是一个个人项目,但我可以提供它作为补丁或者自己创建一个lib或玩家。我只是在第一次看Track Meain。我的问题的本质可能是我不及数学的事实;)

任务是做两件事: A)在开始播放之前,将音量钳位到设备最大-14dB(或者更多,某些信号源建议-23dB)。 B)在开始播放每首曲目之前,读取其标签并按dB的数量进行调整。

我看到在Android involves logarithm scaling as well中调整播放音量,但由于我是对数的新手,因此我不确定这是否会让事情变得更容易,或者两次(10倍?)就更难了。

任何人都可以告诉我如何将分贝值转换为MediaPlayer.setVolume()的可用参数的线索吗?感谢您的任何提示。

编辑:我有一些(可能是不稳定的)断言可能会使连接成为必要,但我非常需要被告知是否有任何这些断言。

  1. ReplayGain假设目标水平为-14 dBFS == 89dB SPL。因此,我假装这些音阶在上下都是等效的(我知道这是不准确的,但 如何不准确?)
  2. 我将MediaPlayer.setVolume(1.0f,1.0f)(最大音量)视为0dBFS。
  3. 基于(1),我将其等于89 + 14 = 103dBSPL。
  4. 我将MediaPlayer.setVolume(0.0f,0.0f)(静音)视为0dBSPL,因此我的抽象线性音量标度为0-103。
  5. 如果这些保持水,我会将Track Gain值-1.3转换为MediaPlayer.setVolume()的相应参数,如下所示:

    1. 目标响度= 89 - 1.3 = 87.7
    2. float newVol = 1.0f - (Math.log(103 - 87.7 / Math.log(103))= 0.41143207395167
    3. 这是远程的吗?

2 个答案:

答案 0 :(得分:1)

  • dBFS代表deciBel Full Sound,因此将其分配到最高级别是完全合理的。
  • 分贝是表示两个值的比率(对数)的单位。当你使用dBFS与dBSPL时,你所说的是你使用的参考声压。
    • -14 dBFS意味着您使用的声压比参考值低10 ^( - 14/20)倍(即可能的最大值)
    • 89 dBSPL意味着您使用的值比“空气中常用的参考声压p0 =20μPa(RMS)或0.0002达因/ cm2 [10](5/20)大,[5]这通常被认为是人类听觉的门槛(大约是3米外飞行的蚊子的声音)。“ (来自维基百科)。

因此,一旦你在两个尺度之间得到一个共同点,它们就会发展相同。您基本上通过说-14dbFS = 89 dBSPL来定义两个音阶的参考声压之间的比率。

因为乘法量表是一个麻烦,我们取这些乘法值的对数,并将它们除以10,这给我们称为分贝的附加值(额外的2因子来自我们比较声压的平方的事实,不是声压本身。)

现在最后,如果你认为你有一个103 dB的范围,以0.0f到1.0f的对数(你的dB)映射(这就是Android中播放音量的情况),那么 - 14dBFS是(103 - 14)/ 103。

只有当您想要进行线性缩放时,才需要进入log的数学:线性刻度上80%的最大声音在输出上为1-log(20)/ log(100)规模。

答案 1 :(得分:1)

我正在研究同样的问题,我想我明白了。

首先要意识到的是,无法通过调整播放器的音量来放大音频文件。你根本做不到。卷从0%到100%,就是这样。

你实际做的是削弱一切。 要做到这一点,你需要决定什么音量应该是0dB。也就是说,音频文件的音量应该是什么,其中没有应用衰减或放大。

假设您希望0dB为60%。这将是你的“基础”。

知道vol% = 100 * 10 ^ (db / 20) - base,然后我们可以找出我们的公式来获得给定dB值的体积:

vol% = 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60

您可能还想知道您的dB范围是多少。 我们可以通过从上面的公式中隔离db变量来实现这一点:

db = 20 * Log(vol% + base) / (Log(2) + Log(5)) - 40

将音量和基值插入前一个公式,我们将得到0%音量(静音)对应-4.44dB和100%(最大音量)对应+ 4.02dB。

这很有用,因为您需要知道公式能够处理的dB值。出于同样的原因,您需要调整vol%公式,以便“剪切”超出支持范围的dB值:

vol% = Min(100, Max(0, 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60)