噪音消除程序
Noise cancelling program
如果你要编写一个程序,接受麦克风输入,将其反转(通过使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下采样一样(不是很好)。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 噪音消除程序