2015-11-18 55 views
4

如果您要编写一个需要麦克风输入的程序,将其反转(通过设置1的0和0的1来设置它不同相),然后从扬声器中播放出来,可以消除声音吗?波物理学说,如果波峰与波谷对齐,就会发生破坏性干扰,如果不能完全抵消,可以在这里利用它来减少噪音。我可以想象,由于翻转音频的复杂性,或者因为翻转和回放需要很长的时间,所以声波已经过去,这样做不起作用。如果我不得不关联一门语言来做到这一点,它将不得不是C++或Java(我至少有能力)。降噪程序

+2

不适用于PC和软件。延迟太高,你的反向波形将不能取消任何事情。使用这种降噪耳机存在,但他们在硬件上做这样的事情,因为它需要超快速。 – zapl

+1

正如@zapl所说,延迟一般是一个关键问题。尽管使用类似FPGA的东西,但你可以在“软件”中完成。 – ajshort

+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 = 689Hz。而且,这是最高频率!这意味着你可以取消低音和人声的基本频率,但不是谐波。

一个典型的操作系统的时钟频率设置为500,1000或2000赫兹,这意味着至多可以使用大约两到三个采样的采样缓冲区,最大频率为500,1000或2000赫兹。电话通常具有约3500Hz的最大频率。

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

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

+0

你低估了人们用java走多远:) http://jtres2015.univ-mlv.fr/和http://www.jopdesign.com/perf .jsp – zapl

+0

注意。 ;-)我会更新。 – Kenney

0

你不能用软件,C++甚至汇编语言来完成 - 在大多数计算机上,镜像扬声器输出的延迟时间将超过6毫秒。即使您的延迟时间仅为0.1毫秒,所产生的声音(假设它完全混合)最多只会听起来像是在10kHz采样(不是很好)。