混合音频信号而不削波的算法

信息处理 声音的 算法 失真
2022-01-08 20:53:08

我想以声学忠实的方式以数字方式混合两个或多个 PCM 音频通道(例如录制的样本),最好是近乎实时的(意味着很少或没有预览)。

物理上“正确”的方法是对样本求和。但是,当您添加两个任意样本时,结果值可能高达最大值的两倍。

例如,如果您的样本是 16 位值,则结果将高达 65536*2。这会导致削波。

这里最简单的解决方案是除以 N,其中 N 是混合的通道数。但是,这会导致每个样本的响度是 1/Nth,这是完全不现实的。在现实世界中,当两种乐器同时演奏时,每种乐器的音量都不会减半。

通过阅读,一种常见的混合方法是:result = A + B - AB,其中 A 和 B 是被混合的两个归一化样本,AB 是一个术语,用于确保更响亮的声音越来越“软削波”。

然而,这引入了信号的失真。这种失真程度在高质量音频合成中是否可以接受?

还有什么其他方法可以解决这个问题?我对效率较低的质量算法以及效率较低的高质量算法感兴趣。

我在数字音乐合成的背景下问我的问题,目的是将多个乐器音轨混合在一起。音轨可以是合成音频、预先录制的样本或实时麦克风输入。

4个回答

物理上“正确”的方法是对样本求和。但是,当您添加两个任意样本时,结果值可能高达最大值的两倍。...这里的天真的解决方案是除以 N,其中 N 是混合的通道数。

这不是“天真的”解决方案,而是唯一的解决方案。这就是每个模拟和数字混音器所做的事情,因为这是空气所做的事情,也是您的大脑所做的事情。

不幸的是,这似乎是一个常见的误解,正如这些其他不正确的非线性“混合”(失真)算法所证明的那样:

“除以 N”称为净空为高于波形 RMS 电平的峰值分配的额外空间。信号所需的净空量由信号的波峰因数决定(对数字信号电平和动态余量的误解可能部分归咎于响度战争Elephunk。)

在模拟硬件中,动态余量可能为 20 dB。在硬件 DSP 中,经常使用定点,具有固定的余量;例如,AD 的 SigmaDSP具有 24 dB 的动态余量。在计算机软件中,音频处理通常以 32 位浮点进行,因此余量很大。

理想情况下,您根本不需要除以 N,您只需将信号相加,因为您的信号首先不会在 0 dBFS 时生成。

请注意,无论如何,大多数信号彼此并不相关,因此混频器的所有通道在同一时刻产生相长干扰是不常见的。是的,混合 10 个相同的同相正弦波将使峰值电平增加 10 倍 (20 dB),但混合 10 个非相干噪声源只会将峰值电平增加 3.2 倍 (10 dB)。对于真实信号,该值将介于这些极端之间。

为了在不削波的情况下将混合信号从 DAC 中取出,您只需降低混合增益即可。如果您想在没有硬削波的情况下保持高混音的 RMS 电平,则需要应用某种类型的压缩来限制波形的峰值,但这不是混音的一部分,它是一个单独的步骤。你首先混音,有足够的动态余量,然后如果需要,稍后再进行动态范围压缩。

在不了解您的问题的任何背景的情况下,很难为您指出相关技术。

显而易见的答案是告诉您调整每个样本的增益,以便很少发生削波。假设音乐家在合奏中的演奏会比独奏时更柔和,这并不是不切实际的。

A + B - AB 引入的失真是不可接受的。它在 B 的谐波的每一侧创建 A 的镜像 - 相当于环形调制 - 如果 A 和 B 具有丰富的频谱且谐波不是整数比,这将非常糟糕。例如,在 220 和 400 Hz 的两个方波上试一试。

一个更“自然”的限幅函数,它在逐个样本的基础上工作,是 tanh 函数——它实际上匹配了一些模拟元素的软限制行为。除此之外,您还可以研究经典的动态压缩技术——如果您的系统可以提前看到峰值,那就更好了。

公式

result=A+BAB

没有任何意义,即使你的意思不是AB=AB. 您需要考虑的一件事是声音在零上下变化。一个更好的思考方式是这样的:

result=g(A+B)

在哪里g1.

最简单的方法是说g=0.5,这是保守的、线性的并且总是有效的,但可能不像你想要的那样“响亮”。一种“通常有效”且“更响亮”的不太保守的方法是g=1/2. 使用这种方法扩展更多渠道效果更好。

或者,g可以随时间变化,在这种情况下,它通常是压缩器/限制器算法的结果。那么你真的有一个差分方程:

result[i]=g[i](A[i]+B[i])

g[i]是先前的函数A,B,gresult.

也许是这样:

g[i]=f(A[i]+B[i],g[i1])

更新:根据 hotpaw2 的建议,您可以延迟输入信号,但不能延迟增益抑制。这被称为“前瞻限制器”。

对于非实时混音,可以采用一种方法来使用前瞻 AGC,其中一个或两个通道的增益在总和幅度超过限幅限制之前以难以感知的速率降低。可用的前瞻越少,AGC 增益调整将变得更加可听,或者用于较软增益调整斜坡的最大增益将越来越接近每通道 0.5 的极限值。对于具有一定可预测性的声源,还可以使用有关包络随时间变化的行为的统计数据来自适应地猜测增益限制,但有一定的失败概率(这将是突然的 AGC 增益调整)。