是的它会取消声音.这或多或少是环绕声的工作原理:通过减去左/右声道,在第三个扬声器中播放,并反转样本,播放第四个声音,你会得到有趣的空间效果.
你也不会只想切换所有的比特,你会得到噪音; 相反,你想要否定.
使用小样本缓冲区,您可以快速抵消某些频率的波形.当这些攻击和腐烂时,你会落后,但只要波持续,你就可以有效地将其取消.
使用更大的样本缓冲区,显然延迟会增加,因为用样本填充缓冲区需要更长的时间.缓冲区的大小决定了设备中断发生的频率,程序将输入样本复制到输出缓冲区,同时对它们进行操作.
通常记录在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.而且,这是最高频率!这意味着您可以取消低音和人声的基频,但不能取消谐波.
典型的OS将其时钟频率设置为500,1000或2000 Hz,这意味着最多可以使用大约两到三个样本的样本缓冲区,最大频率为500,1000或2000 Hz.电话通常具有大约3500Hz的最大频率.
您可以将系统时钟提升至32kHz左右,并直接轮询ADC以达到此类频率.但是,您可能需要将一个焊接到您的LPT并运行自定义操作系统,这意味着Java是不可能的,或使用运行Java的预制实时嵌入式系统(请参阅@zapl的评论链接).
我忘记提到的一件事是,您需要考虑声源,麦克风和扬声器的位置.理想情况下,所有3个都在同一个地方,所以没有延迟.但这种情况几乎从来都不是这样,这意味着你会得到一种干扰模式:在房间里会有声音被取消的斑点,在声音被取消的地方之间.