Mixing PCM audio samples
我有一个关于混合多个 PCM 样本的简单问题。
我读到混合多个音频 PCM 样本的最佳方法是取每帧样本的平均值。
因此,如果我在除以 5 之前将 5 个 16 位样本相加,显然很有可能它的值大于 16 位短可以容纳的值。
那么,当将多个 16 位样本混合在一起时,我是否先将它们全部存储在 int 中,然后将它们相加并平均,然后再转换回 short?
- 你在哪里读到混合时最好平均样本?混合通常通过将样品添加在一起来完成。剪辑可能是一个问题,但最佳解决方案取决于应用程序本身。
-
stackoverflow.com/questions/6879534/…
如果您想混合音频样本,只需将它们添加在一起即可。建立一个平均值并不是正确的方法。
想一想:如果有人拉小提琴,第二把小提琴加入音乐,第一把小提琴的声音会变小吗?不,它不会。第二把小提琴只是增加了信号。
添加 PCM 样本时,您必须处理整数溢出。一种方法是使用全局"主音量",将其应用于混合 PCM 样本。使用这样的全局乘法器可以帮助您确保最终信号大部分在输出数据的 16 位内。
您可能还需要每个通道的音量控制。
最终溢出仍然会到处发生,处理它们的最佳方法是将输出值限制为 16 位输出流的最大和最小可表示值。耳朵会容忍这种情况,只要不经常发生,它就会被忽视。
-
1 代表 Building an average is not the correct way to do this.
如果您谈论混合,我建议您使用浮点数。
无论如何,如果你想使用短裤,你可以使用 32 或 64 位整数,或者你简单地先将样本相除,然后再相加。这是可能的,因为这个

等于这个

- 可以?如果您使用整数,则不是(第一个等式对每个项进行四舍五入,而第二个结果仅四舍五入一次)。
-
相信我。你不会听到任何区别。但是如果您想要更好的结果,请使用浮点数,因为它在 dsp 中很常见。 @Dithermaster
-
使用浮动我应该使用第一种还是第二种方法?我想这没关系,因为不会有舍入误差。
-
另外,如果我要转换波 RIFF PCM 数据,我需要将短小端转换为短大端,然后浮动正确吗?
-
如果我说浮动,我的意思是 IeeeFloat。这由 -1.0 到 1.0 范围内的浮点数指定。我什至不知道您使用的是哪种语言...所以我无法真正告诉您具体该怎么做。但我可以举个例子。 cscore.codeplex.com/SourceControl/latest#CSCore/Streams/…
-
我正在使用java。我还想知道我是否将样本加在一起并且在某一时刻其中一个样本根本没有声音,这会不会降低混音的整体音量,因为您要添加 0 并除以更大的数字 1?