降噪程序

Noise cancelling program

如果您要编写一个程序来获取麦克风输入,将其反转(通过将 1 设为 0 并将 0 设为 1 来设置异相),然后从扬声器中播放,这会抵消声音吗?波浪物理学说,如果波峰与波谷对齐,就会发生破坏性干扰,所以如果不取消,是否可以在这里利用它来减少噪音 "completely." 我可以想象,由于反转音频的任何复杂性,这都行不通,甚至因为倒放回放的时间太长,以至于声波过去了。如果我必须关联一种语言来执行此操作,那么它必须是 c++ 或 java(我至少在这两种语言中都能胜任)。

您不能在软件、C++ 甚至汇编中执行此操作 - 在大多数计算机上仅镜像扬声器输出的延迟将超过 6 毫秒。即使您只有 0.1 毫秒的延迟,生成的声音(假设它是完美混合的)也最多听起来像是以 10kHz 采样的(不是很好)。

是的,它会抵消声音。这或多或少就是环绕声的工作原理:通过减去 left/right 声道,在第 3 个扬声器中播放它,并反转样本,从第 4 个扬声器中播放那些,你会得到有趣的空间效果。

此外,您不会只是想切换所有位,您会听到噪音;相反,您想否定。

使用小样本缓冲区,您的速度足以抵消某些频率的波。当这些攻击和衰减时,你会落后,但只要波浪持续,你就可以有效地抵消它。

样本缓冲区越大,延迟显然会增加,因为用样本填充缓冲区需要更长的时间。缓冲区的大小决定了设备中断发生的频率,程序将输入样本复制到输出缓冲区,同时对其应用操作。

通常以 44.1kHz 的频率进行记录,这意味着每秒采样很多。如果您将缓冲区设置为 256 个样本,您将每秒收到 44100/256 次通知,告知您有 256 个样本要处理。

在 256 个样本时,您将落后 256/44100 = 0.0058 秒或 5.8 毫秒。声音以大约 340 m/s 的速度传播,因此声波将移动 1.97 米(340 * 5.8 毫秒)。该波长对应于 172 Hz (44100/256) 的频率。这意味着您只能有效地抵消频率低于该频率的频率,因为频率更高的频率 'move' 在 5.8 毫秒内不止一次,因此高于最大值 'sample rate',如果您愿意的话.

对于 64 个样本,频率将为 44100/64 = 689 Hz。而且,这是最大频率!这意味着您可以消除低音和人声的基频,但不能消除谐波。

典型的 OS 将其时钟频率设置为 500、1000 或 2000 Hz,这意味着您最多可以使用大约两到三个样本的样本缓冲区,最大频率为 500 、1000 或 2000 赫兹。电话的最大频率通常约为 3500 Hz。

您可以将系统时钟提高到 32kHz 左右,并直接轮询 ADC 以达到这样的频率。但是,您可能需要将一个焊接到您的 LPT 和 运行 一个自定义 OS,这意味着 Java 是不可能的,或者使用预制实时嵌入式运行s Java 的系统(链接见@zapl 的评论)。

有一件事我忘了提,你需要考虑声源、麦克风和扬声器的位置。理想情况下,所有 3 个都在同一个地方,所以没有延迟。但这几乎从来都不是这种情况,这意味着您会得到一个干扰模式:房间中会有声音被抵消的点,在没有被抵消的点之间。