从麦克风输入中删除已知音频输出

时间:2014-02-15 09:52:12

标签: algorithm audio signal-processing noise-reduction

我正在尝试学习如何以尽可能多的方式使用音频。

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

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

为了给它一个真实世界的背景,想象一下你的计算机有一个麦克风和扬声器(不是耳机)的情况,并且因为计算机事先知道(好的,只有几毫秒,但仍然),扬声器的输出会是它可以从麦克风上的混音中取消那个声音。在这种现实世界的情况下,已知的流并不是完全已知的,因为在发送和接收之间可能存在一些失真。

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

2 个答案:

答案 0 :(得分:6)

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

时域

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

如果对音频做了其他事情(例如音量压缩),那么这会影响你干净地减少声音的能力。

频域

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

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

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

答案 1 :(得分:0)

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