降噪计划

时间:2015-11-18 23:37:15

标签: java c++ audio physics microphone

如果您要编写一个接收麦克风输入的程序,请将其反转(通过制作1&0; s 0和0' s 1' s来设置它,并播放它从扬声器中退出,可以取消声音吗?波浪物理学说,如果波峰与波谷对齐,就会发生破坏性干扰,因此如果没有完全消除,就可以利用这种干扰来减少噪声。"我可以想象,由于反转音频的复杂性,或者因为反转和回放需要太长时间,所以这不会起作用,因此声波已经过去了。如果我必须将一种语言联系起来,那么它必须是c ++或java(我至少在两者中都胜任)。

2 个答案:

答案 0 :(得分:6)

是的,它会取消声音。这或多或少是环绕声的工作原理:通过减去左/右声道,在第三个扬声器中播放,并反转样本,播放第四个声音,你会得到有趣的空间效果。

你也不会只想切换所有的比特,你会得到噪音;相反,你想要否定。

使用较小的样本缓冲区,您可以快速抵消某些频率的波形。当这些攻击和腐烂时,你会落后,但只要波持续,你就可以有效地将其取消。

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

通常录音是在44.1kHz,这意味着每秒很多样本。如果将缓冲区设置为256个样本,则每秒会收到44100/256次通知,要处理256个样本。

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

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

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

您可以将系统时钟调高至32kHz左右,并直接轮询ADC以达到此类频率。但是,您可能需要将一个焊接到您的LPT并运行自定义操作系统,这意味着Java是不可能的,或使用运行Java的预制实时嵌入式系统(请参阅@zapl的评论链路)。

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

答案 1 :(得分:0)

你不能用软件,c ++,甚至汇编来做到这一点 - 在大多数计算机上,只是镜像扬声器输出的延迟时间超过6毫秒。即使你只有0.1毫秒的延迟,所产生的声音(假设它是完全混合的)最多听起来就像在10kHz采样(不是很好)。