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

时间:2019-09-11 02:49:58

标签: python audio frequency

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

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

我正在寻找一种算法(或程序包),可以帮助我确定这种水流声音的频率范围。我认为,如果可以找出频率范围,就可以使用傅立叶逆变换来过滤环境噪声。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

降低噪声的一种流行方法是使用光谱门控。本质上,您首先要确定噪声的听起来,然后从信号中去除平滑频谱。平滑至关重要,因为声音是波浪,是一个连续的实体。如果仅从波形中切掉离散的频率,您将得到非常差的结果(音频听起来不自然且机械化)。您应用的平滑程度将确定减少的噪声(请记住,永远不会真正消除噪声-您总会残留一些噪声)。

具体解决方案。

  1. 由于您是本主题的新手,因此我首先建议您在可为您完成工作的软件中如何降低噪音。 Audacity是一个很好的选择。我链接了手册以降低噪音,但是那里有很多教程。
  2. 在知道要获得的信息之后,您可以自己实现光谱门控或使用现有的封装。 Audacity在C ++中具有出色的实现,但是对于新手来说,移植可能会很困难。我建议先使用noisereduce软件包。它基于Audacity实现。如果使用它,只需几行即可完成。

这是一个片段:

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中,我要确定频率统计信息。