audio - 音量归一化时的动态范围压缩

标签 audio pcm

<分区>

我已经问过 audio volume normalization .在大多数方法中(例如我最感兴趣的 ReplayGain ),我可能会得到超过 PCM 限制的峰值(也可以阅读 here )。

简单的剪辑可能是我能做的最糟糕的事情。 As Wikipedia suggests ,我应该做某种形式的 dynamic range compression .

我说的是我在每个单独的 PCM 样本值上应用的函数。在另一个similar question , one answer表明这样做还不够或者不是我应该做的事情。但是,我真的不明白,因为我仍然需要处理裁剪案例。答案是否建议同时对多个样本进行范围压缩,并对每个样本进行简单的硬裁剪?

撇开这个不谈,维基百科文章中讨论的功能似乎有些不是我想要的(很多情况下,我最终还是会出现裁剪的情况)。我正在考虑使用类似 tanh 的东西.那是个坏主意吗?它会稍微降低音量,但保证不会出现任何削波。

我的应用程序是一个通用的音乐播放器。我正在寻找一种最适合每个人的解决方案,这样我就可以随时打开它,而用户很可能不想关闭它。

最佳答案

使用任何瞬时动态范围处理(例如削波或 tanh 非线性)都会引入听觉失真。将正弦波放入瞬时非线性函数中,您将不再有正弦波。虽然对某些音频应用程序很有用,但听起来您并不想要这些人工制品。

归一化不会影响波形的动态(根据最小/最大比率)。归一化涉及将波形逐元素乘以常数标量值,以确保没有样本超过最大值。这个过程只能离线完成,因为您需要在处理之前分析整个信号。如果您的波形包含任何强烈的瞬变,归一化也是一个坏主意。您的整个信号将根据 transient 峰值除以削波阈值的比率进行衰减。

如果您只是想保护输出不被削波,您最好使用侧链式压缩器。其具体形式是限制器(无限压缩比高于阈值且起始时间为零)。侧链压缩器计算信号的平滑能量包络,然后根据该函数应用变化的增益。它们不是瞬时的,因此您可以减少从您提到的功能中获得的声音失真。限制器可以具有瞬时攻击以防止削波,但您允许释放时间,以便限制器对后续波形峰值保持衰减,后续波形只是被调低,因此没有失真。在强烈的声音之后,限制器恢复。

如果波形中有很多高强度峰值,您可以从这种类型的处理中获得泵浦式声音。如果这成为问题,您可以进入下一个级别并在子带内进行动态处理。这样,只有频谱中有问题的部分会被衰减,而声音的其余部分不受影响。

关于audio - 音量归一化时的动态范围压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12665817/

相关文章:

android - Android API用于分析PCM数据?

gstreamer - 使用 GStreamer 播放保存在数组中的原始 PCM

c# - SoundPlayer 不播放任何捆绑的 Windows 声音 PCM wav 文件

javascript - 网络音频 API : efficiently play a PCM stream

java - Android AudioData追加到结束

Java - 从混音器录制

Android 的媒体播放器 : Why is an audio loop not staying synced with metronome playing at the same BPM?

c# - 为什么第一次播放 SoundEffectInstance 需要更多时间?

c++ - 如何在 C++ 中捕获 PC 游戏的声音输出?

java - 将 PCM 原始字节转换为 WAV 字节