降噪计划

Jea*_*ean 4 c++ java audio physics microphone

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

Ken*_*ney 7

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

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

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

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

通常记录在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个都在同一个地方,所以没有延迟.但这种情况几乎从来都不是这样,这意味着你会得到一种干扰模式:在房间里会有声音被取消的斑点,在声音被取消的地方之间.