我已经问过audio volume normalization了。在大多数方法中(例如,我最感兴趣的ReplayGain ),我可能会得到超过PCM限制的峰值(也可以读取here)。
简单的裁剪可能是我能做的最糟糕的事情了。As Wikipedia suggests,我应该做一些形式的dynamic range compression。
我说的是我对每个单独的PCM样本值应用的函数。在另一个similar question上,one answer建议我这样做是不够的,或者不是我应该做的事情。然而,我并不是真的理解这一点,因为我仍然需要处理剪辑的情况。答案是否建议一次对多个样本进行范围压缩,并对每个样本进行简单的硬裁剪?
抛开这一点不谈,维基百科文章中讨论的功能似乎并不是我想要的(在许多情况下,我最终还是会有裁剪的情况)。我在考虑使用像tanh这样的东西。这是个坏主意吗?这将略微减少音量,但保证我不会得到任何剪切。
我的应用程序是一个通用的音乐播放器。我正在寻找一种最适合每个人的解决方案,这样我就可以随时打开它,而用户很可能不想关闭它。
发布于 2012-09-30 23:14:30
使用任何瞬时动态范围处理(例如限幅或tanh非线性)将引入可听失真。把一个正弦波转换成一个瞬时非线性函数,你就不再有正弦波了。虽然对某些音频应用程序很有用,但听起来您并不想要这些人工制品。
归一化不会影响波形的动态(根据最小/最大比率)。归一化涉及波形与恒定标量值的元素相乘,以确保没有样本超过最大值。这个过程只能离线完成,因为你需要在处理之前分析整个信号。如果您的波形包含任何强烈的瞬变,归一化也不是一个好主意。您的整个信号将通过瞬时峰值除以限幅阈值的比率进行衰减。
如果你只是想保护输出不被削波,你最好使用侧链式压缩机。它的一种具体形式是限制器(超过阈值的无限压缩比,攻击时间为零)。侧链压缩器计算信号的平滑能量包络,然后根据该函数应用变化的增益。它们不是即时的,所以你可以减少你从你提到的函数中得到的声音失真。限制器可以具有瞬时攻击以防止削波,但您允许释放时间,以便限制器在随后的波形峰值时保持衰减,随后的波形只是调低,因此没有失真。在强烈的声音之后,限制器恢复。
如果波形中有许多高强度的峰值,则可以从这种类型的处理中获得泵浦类型的声音。如果这变得有问题,那么您可以移动到下一个级别,并在子波段内进行动态处理。这样,只有频谱中有问题的部分会被衰减,其余的声音不会受到影响。
发布于 2012-10-01 01:52:14
一般的解决方案是归一化到明显低于1的某个增益水平,使得非常少的歌曲需要增加增益。换句话说,大多数时候你会降低信号的音量而不是增加。尝试各种不同风格的歌曲,找出这个层次是什么。
现在,偶尔,你仍然会遇到一首歌曲,它需要足够的增益,在某种程度上,它会被剪辑。你有两个选择: 1.不要增加那么多的收益。这首歌听起来会安静一点。这就是生活。(这是一种常见的方法),或者2.应用少量的动态范围压缩和/或限制。当然,你也可以做一些组合1和2。我相信iTunes使用了1和2的组合,但他们在#2上非常努力,他们应用的很少。
你的建议,使用像tanh这样的函数,在逐个样本的基础上,将导致声音失真。对于一个通用的音乐播放器,你不会想这样做的。这是那种在吉他放大器模拟器中做的事情,使他们听起来“肮脏”和“垃圾”。它可能在摇滚乐、流行乐或其他失真严重的现代音乐中听不到,但在仔细录制的合唱、爵士或小提琴独奏音乐中,人们会感到不安。这与tanh的选择无关,顺便说一句,任何非线性函数都会产生失真。
动态范围压缩使用随时间应用于信号的信封:http://en.wikipedia.org/wiki/Dynamic_range_compression这很难做到正确,而且您永远无法创建真正“透明”的压缩器。限制器可以被认为是压气机的极端版本,它(至少在理论上)可以防止信号超过一定的电平。数字“先行”限制器可以在没有明显裁剪的情况下做到这一点。如果使用得当,它是相当透明的。
如果您采用这种方法,请确保可以关闭此功能,因为无论您认为它有多透明,都会有人听到并不喜欢它。
https://stackoverflow.com/questions/12665817
复制