algorithm - 从麦克风输入中移除已知音频输出

标签 algorithm audio signal-processing noise-reduction

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

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

现在假设我们提前知道 stream1 但不知道 stream2 是否有可能使用 stream1 将其自身从 mix1 中取消并因此为我们提供具有最小噪声/干扰的 stream2?

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

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

最佳答案

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

时域

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

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

频域

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

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

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

关于algorithm - 从麦克风输入中移除已知音频输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795944/

相关文章:

c++ - 是否有 STL 算法来查找序列中值的最后一个实例?

java - 如何用字母表填充 char 数组?

C#如何设置声音字节的音量[]

python - numpy.fft.fft 的功率谱

algorithm - 龟塔变异问题/动态规划

识别 "fuzzily-connected"子图的算法

javascript - 当屏幕上出现一些文本时,用JS播放声音

python - 使用 Python 使用音频传输数据

android - GCC_PHAT输出

matlab - 计算信号的 SNR