噪音消除程序

Noise cancelling program

本文关键字:程序 噪音      更新时间:2023-10-16

如果你要编写一个程序,接受麦克风输入,将其反转(通过使1的0和0的1异相),并从扬声器中播放,这会抵消声音吗?波浪物理学说,如果波峰与波谷对齐,就会发生破坏性干扰,所以如果不"完全"消除,可以在这里利用这种干扰来减少噪音。我可以想象,这是不可行的,因为反转音频很复杂,甚至因为反转和播放声波需要太长时间。如果我必须关联一种语言来实现这一点,它必须是c++或java(我至少在这两方面都很胜任)。

是的,它会抵消声音。这或多或少就是环绕声的工作原理:通过减去左/右声道,在第三个扬声器中播放,并反转采样,在第四个扬声器中进行播放,您可以获得有趣的空间效果。

此外,你不会简单地想切换所有比特,你会得到噪音;相反,你想要否定。

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

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

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

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

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

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

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

有一件事我忘了提,那就是你需要考虑声源、麦克风和扬声器的位置。理想情况下,所有三个都在同一个地方,所以没有延迟。但事实并非如此,这意味着你会得到一种干扰模式:房间里会有一些地方声音被取消,而在这些地方之间则没有。

在软件、c++甚至汇编中都无法做到这一点——在大多数计算机上,仅镜像扬声器上的输出的延迟就会超过6毫秒。即使你的延迟只有0.1毫秒,产生的声音(假设它是完美混合的)充其量也会像在10kHz下采样一样(不是很好)。