如何用环境噪声确定感兴趣声音的频率范围

Posted

技术标签:

【中文标题】如何用环境噪声确定感兴趣声音的频率范围【英文标题】:How to determine the frequency range of interested sound with ambient noise 【发布时间】:2019-09-11 02:49:58 【问题描述】:

我对信号处理非常陌生。我现在有两个声音信号数据。以 10 KHz、2 秒的采样率收集每个数据。我已将此数据导入python。 sound_1 和 sound_2 现在都是一个 numpy 数组。每个声音数据的长度当然是20000。

Sound_1 包含水流声音(我感兴趣)和环境噪声(我不感兴趣),而 sound_2 仅包含环境噪声(我不感兴趣)。

我正在寻找一种算法(或软件包),它可以帮助我确定这种水流声音的频率范围。我想如果我能找出频率范围,我可以使用傅里叶逆变换来过滤环境噪声。

不过,我的最终目的是从 sound_1 数据中提取水流声音,消除环境噪音。如果有其他方法就好了。

我正在看这篇文章:Python frequency detection

但我不明白他们如何仅通过一个声音信号找出频率。我认为我们至少需要比较 2 个信号数据(一个包含我感兴趣的声音,另一个没有),以便我们找出差异。

【问题讨论】:

我的帖子能回答你的问题吗?如果没有,欢迎反馈。这就是 SO 社区的运作方式。 【参考方案1】:

由于sound_1 包含水流和环境噪声,因此没有直接的方法可以提取水流。傅里叶变换将为您提供信号中的所有频率,而与来源无关。

解决方法是从sound_2 中获取环境噪声频率,然后从sound_1 中删除它们。完成后,您可以从已经去噪的sound_1 中提取频率。

这种降噪的流行方法之一是使用 光谱门控。从本质上讲,您首先要确定噪声听起来如何,然后从信号中移除 平滑 频谱。平滑是至关重要的,因为声音是一种波,是一个连续的实体。如果你只是从波中去掉离散的频率,你会得到非常糟糕的结果(音频听起来不自然和机器人)。您应用的平滑量将决定减少了多少噪音(请注意,它永远不会真正消除 - 您总会得到一些残留物)。

具体解决办法。

    由于您是该主题的新手,我首先建议您在一个可以为您工作的软件中如何进行降噪。 Audacity 是一个很好的选择。我链接了降噪手册,但是那里有很多教程。 知道要获得什么后,您可以自己实施光谱选通或使用现有软件包。 Audacity 在 C++ 中有出色的实现,但对于新手来说可能很难移植。我建议先使用noisereduce 包。它基于 Audacity 实现。使用的话,几行就搞定了。

这是一个sn-p:

import noisereduce as nr
# load data
rate, data = wavfile.read("sound_1.wav")
# select section of data that is noise
noisy_part = wavfile.read("sound_2.wav")
# perform noise reduction
reduced_noise = nr.reduce_noise(audio_clip=data, noise_clip=noisy_part, verbose=True)

现在只需在reduced_noise 上运行 FFT 即可发现水流的频率。

Here's 我是如何使用noisereduce的。在this part 我正在确定频率统计。

【讨论】:

以上是关于如何用环境噪声确定感兴趣声音的频率范围的主要内容,如果未能解决你的问题,请参考以下文章

矩形感兴趣区域超出范围时出错 - opencv

基于感兴趣的日期范围作为参数输入限制在 Pig Latin 中加载日志文件

感兴趣区域和视口之间的差异

哪种方法最适合寻找手势识别的感兴趣区域

感兴趣的软件专业人士的平面图和打包架构资源?

如何用delphi实现扬声器发出一定频率的声音