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

m3z*_*m3z 12 algorithm audio signal-processing noise-reduction

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

给定已知音频流(将其称为stream1)和未知音频流(stream2),它们被混合到一个单独的流(mix1)中.

现在假设我们事先知道stream1但不知道stream2是否可以使用stream1从mix1中取消它自己,因此给我们stream2带来最小的噪声/干扰?

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

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

Bra*_*rad 6

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

时域

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

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

频域

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

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

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