添加 PCM 音频文件 - 混合音频

Iva*_*aan 0 audio mixing pcm

我的任务是混合音频文件中的原始数据。我目前正在努力通过混合数据来获得干净的声音,但我不断收到失真或白噪声。

假设我有一个来自两个 AudioInputStream 的两字节数据数组。AIS 用于从给定的音频文件中传输字节数组。这里我可以使用 SourceDataLine 的 write 方法来播放单个音频文件。我想同时播放两个音频文件,因此我知道我需要执行某种 PCM 添加。

任何人都可以建议是否应该使用浮点值或字节值来完成此添加?另外,当涉及到添加 3,4 个或更多音频文件时,我猜我的问题会更加困难!我是否需要除以一定数量以避免这种溢出?假设我要添加两个 16 位音频文件(最小 -32,768,最大 32,767)。

我承认,我之前曾对此提出过一些建议,但似乎无法使其发挥作用!我有我尝试过的代码,但不是我的!

任何建议都会很棒。

谢谢

Phi*_*ner 5

首先,我怀疑您是否真的在使用完全解码的 PCM 数据值。如果直接添加字节,则只有以 8 位分辨率录制声音才有意义,而这种做法越来越少。如今,音频更常见地记录为 16 位值或更多。我认为在某些情况下不需要那么多的频率内容,但对于当前的系统,CPU 节省并不那么重要,因此人们选择至少保持“CD 质量”(16 位分辨率、立体声、41000 fps )。

因此,第一步,您必须确保将字节流正确转换为有效的 PCM。例如,如果是 16 位编码,则必须以正确的顺序附加两个字节(可以是大端字节序或小端字节序),并使用结果值。

一旦正确处理,通常只需添加这些值就足够了,并且可能施加最小和最大过滤器以确保信号不会超出定义的范围。我可以想到这样做的两个原因:(a)音频通常以足够低的音量录制,求和不会导致溢出,(b)信号足够随机,有正值和负值,所有时刻无论是积极还是消极的贡献者都是罕见且短暂的。

使用最小值和最大值会“剪辑”信号,并可能引入一些可听失真,但它的声音比溢出的声音要小得多!如果您的信号源经常达到最小值和最大值,您可以简单地将音量因子(0 到 1 范围内)乘以一个或多个贡献信号作为一个整体,以降低音频值。

对于 16 位数据,它直接对将两个字节附加在一起而产生的有符号整数(-32768 到 32767)执行操作。但更常见的做法是“标准化”这些值,即将 16 位整数转换为 -1 到 1 范围内的浮点数,在该级别执行操作,然后转换回 -32768 到 32767 范围内的整数并将这些整数分解为字节对。

有一本关于数字信号处理的免费书籍非常值得一读:Steven Smith 的《数字信号处理科学家和工程师指南》。它将提供更多细节和背景。