【发布时间】:2018-07-17 08:49:43
【问题描述】:
我的任务是混合来自音频文件的原始数据。我目前正在努力通过混合数据来获得干净的声音,我不断收到失真或白噪声。
假设我有一个来自两个 AudioInputStream 的两字节数据数组。 AIS 用于从给定的音频文件流式传输字节数组。在这里,我可以使用 SourceDataLine 的 write 方法播放单个音频文件。我想同时播放两个音频文件,因此我知道我需要执行某种 PCM 添加。
谁能推荐这个加法应该用浮点值还是字节值来完成?此外,当涉及到添加 3,4 个或更多音频文件时,我猜我的问题会更加困难!我是否需要除以一定数量以避免这种溢出?假设我要添加两个 16 位音频文件(最小 -32,768,最大 32,767)。
我承认,我之前对此有过一些建议,但似乎无法让它发挥作用!我有我尝试过的代码,但我没有!
任何建议都会很棒。
谢谢
【问题讨论】:
-
另外,我的主要问题是我的混合数组的大小应该是多少?它应该是要混合的最大音频文件的大小吗?!
-
你好lvaan!在对多个信号求和时确实需要小心,因为任何总和超过最小/最大阈值的东西都会增加噪声/失真。您是否需要将此作为实时问题解决,还是可以预先计算(非实时)?对于非实时,您是否也尝试过标准化音频?您可以使用字节或浮点值求和。我建议在开始时将值转换为浮动到范围 -1 和 1 以保持简单/易于理解我相信对于等功率求和,您应该将求和信号乘以 (1/sqrt(2))^(n-1),对于 n 个信号。
-
您好,感谢您的回复!目前,我一直在尝试实现非实时。我知道我需要将我的值剪辑为 n 位数字的最小和最大表示。我确实一直在尝试使用从 -1 到 1 的标准化浮点值进行加法。因此,如果我想将两个字节数组的数据添加到一个字节数组中,我将执行总和或所有索引位置并将此函数添加到如您所说的结果( (1/sqrt(2))^(n-1), for n 个信号)。你能确认一下为什么以及在哪里找到这个计算吗?
-
我的问题是我想播放输出轨道作为与单个音频文件相对应的。但是,我不知道输出中的数据数组应该有多大(显然要添加的不同音频文件的大小不同)。
-
对于感知响度建模,功率方程比线性值更匹配。如果需要,可以在添加之前将功率变换应用于输入。但我认为最好建议 OP 让更简单的信号线性加法首先工作。