【问题标题】:Noise cancelling program降噪程序
【发布时间】:2016-02-20 22:19:04
【问题描述】:

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

【问题讨论】:

  • 不适用于 PC 和软件。延迟太高,你的反波来不及抵消任何东西。存在使用此功能的降噪耳机,但它们在硬件中做到了这一点,因为它需要超快。
  • 正如@zapl 所说,延迟通常是一个关键问题。您可以使用 FPGA 之类的东西在“软件”中完成。
  • 是的,我认为会是这样,我只是想确定一下
  • @zapl - 您还需要考虑麦克风和扬声器之间的距离,以及它们相对于原始声音的相对位置。如果麦克风比扬声器更接近原始声音,您可以利用声速来发挥您的优势,如果(例如)您能够以 20 毫秒的延迟进行处理 - 您需要麦克风和扬声器之间有 7m 的间隙- 这是可能的。 (尽管延迟必须保持不变才能有用)

标签: java c++ audio physics microphone


【解决方案1】:

是的,它会消除声音。这或多或少是环绕声的工作原理:通过减去左/右声道,在第 3 个扬声器中播放,然后反转样本,从第 4 个扬声器中播放这些,您会获得有趣的空间效果。

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

使用小样本缓冲区,您的速度足以抵消某些频率的波。当这些攻击和衰减时,你会落后,但只要波持续,你就可以有效地抵消它。

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

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

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

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

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

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

我忘了提一件事,您需要考虑声源、麦克风和扬声器的位置。理想情况下,所有 3 个都在同一个地方,所以没有延迟。但这几乎从来没有发生过,这意味着你会得到一个干涉图案:房间里会有声音被消除的点,而在没有消除的点之间。

【讨论】:

【解决方案2】:

您无法在软件、c++ 甚至汇编中执行此操作 - 在大多数计算机上,仅镜像扬声器输出的延迟将超过 6 毫秒。即使您只有 0.1 毫秒的延迟,产生的声音(假设它是完美混合的)充其量听起来就像以 10kHz 采样(不是很好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2013-03-22
    • 2012-05-12
    • 2016-03-04
    • 2013-12-07
    相关资源
    最近更新 更多