混合 PCM 音频样本

Posted

技术标签:

【中文标题】混合 PCM 音频样本【英文标题】:Mixing PCM audio samples 【发布时间】:2014-02-02 08:03:33 【问题描述】:

我有一个关于混合多个 PCM 样本的简单问题。

我读到混合多个音频 PCM 样本的最佳方法是取每帧样本的平均值。

因此,如果我在除以 5 之前将 5 个 16 位样本相加,显然很有可能它的值会大于 16 位短可以容纳的值。

那么当将多个 16 位样本混合在一起时,我是不是先将它们全部存储在 int 中,然后将它们相加并平均,然后再转换回 short?

【问题讨论】:

你在哪里读到混合时最好平均样本?混合通常通过将样品添加在一起来完成。剪辑可能是个问题,但最佳解决方案取决于应用程序本身。 ***.com/questions/6879534/… 【参考方案1】:

如果您想混合音频样本,只需将它们加在一起即可。建立一个平均值并不是正确的方法。

想一想:如果有人拉小提琴,第二把小提琴加入音乐,第一把小提琴的声音会变小吗?不,它不会。第二把小提琴只是增加了信号。

添加 PCM 样本时,您必须处理整数溢出。一种方法是使用一个全局“主音量”,将其应用于混合 PCM 样本。使用这样的全局乘法器可以帮助您确保最终信号大部分在输出数据的 16 位内。

您可能还需要每个通道的音量控制。

最终溢出仍然会到处发生,处理它们的最佳方法是将输出值限制为 16 位输出流的最大和最小可表示值。耳朵会容忍这种情况,只要不经常发生,它就会被忽视。

【讨论】:

+1 Building an average is not the correct way to do this.【参考方案2】:

如果您谈论混合,我建议您使用浮点数。 无论如何,如果你想使用短裤,你可以使用 32 位或 64 位整数,或者你简单地先将样本相除,然后再相加。这是可能的,因为这个

等于这个

【讨论】:

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

以上是关于混合 PCM 音频样本的主要内容,如果未能解决你的问题,请参考以下文章

Android中PCM音频样本的上采样

如何将 PCM 音频样本流转换为音量?

可视化 PCM 样本的体积

如何在 iOS 5 上以编程方式规范化 PCM 音频样本?

将 pcm 样本链接在一起时避免静态和失真

从幅度样本创建音频文件