12

我正在尝试学习如何以尽可能多的不同方式处理音频。

给定一个已知的音频流(我们称之为 stream1)和一个未知的音频流(stream2),它们混合成一个流(mix1)。

现在假设我们提前知道 stream1 但不知道 stream2 是否可以使用 stream1 将自己从 mix1 中消除,从而为我们提供具有最小噪声/干扰的 stream2?

为了给它一个真实的世界环境,想象一个情况是你的计算机有一个麦克风和扬声器(不是耳机),并且因为计算机提前知道(好的,只有几毫秒,但仍然)输出到扬声器是可能的消除来自麦克风的混音中的声音。在这个现实世界的情况下,已知流并不完全已知,因为传输和接收之间可能存在一些失真。

假设这是可能的,有人可以建议一些有关所涉及算法的阅读吗?

4

2 回答 2

7

是的,这是可能的。两种方法:

时域

如果您可以保证混合音频对原始流 1 的时间是样本精确的,那么您可以简单地否定原始流 1 并将其添加到混合中。现在,您可能需要稍微缩放该波形,因为通常在混合音频时,它们的电平会降低。

如果对音频进行了其他处理(例如电平压缩),那么这会影响您干净地进行这种声音减法的能力。

频域

虽然正常的 PCM 编码音频只是每秒多次采样压力,但这并不是完全感知声音的方式。我们听到不同的频率。如果您使用傅立叶变换(通常使用 FFT 算法完成),您可以将音频样本从时域转换到频域,从而在此过程中为您提供各种频率桶中的声音级别。

如果将流 1 和混音都转换到频域,从混音中减去流 1,然后再转换回时域进行输出,则可以有效地从混音中去除大部分流 1。您使用的频率桶越多,所需的 CPU 就越多,但这种删除将越准确。请注意,虽然这意味着您不必非常精确地采样,但它通常会损害混音的声音质量。

许多音频编辑程序使用这种方法来消除背景噪音。

于 2014-02-16T21:28:55.847 回答
0

声音只是一条曲线 - 通常它会随着时间在零上下波动(16 位音频有 2^16 个可能的整数可用,因此原始 PCM 音频只是 +- 32768 范围内的整数流) - 一次以这种格式 -只需切换 stream1 整数的符号 (+-),然后将其添加到相应的混合整数中,因为您遍历两个 stream1 的数据并一次混合一个整数,然后重新归一化回 +- 32768 以重新获得您的音量 - 这有效地从您的混音中删除 stream1 - 音频工具 Audacity 为您提供此选项

于 2014-02-16T21:10:19.087 回答