如何用环境噪声确定感兴趣声音的频率范围
How to determine the frequency range of interested sound with ambient noise
我对信号处理还很陌生。我现在有两个声音信号数据。以 10 KHz、2 秒的采样率收集每个数据。我已将此数据导入 python。 sound_1 和 sound_2 现在都是一个 numpy 数组。每个声音数据的长度当然是20000。
Sound_1包含水流声(我感兴趣)和环境噪音(我不感兴趣),而sound_2只包含环境噪音(我不感兴趣) .
我正在寻找一种算法(或程序包)来帮助我确定这种水流声的频率范围。我想如果我能找出频率范围,我可以使用傅里叶逆变换来过滤环境噪声。
不过,我的最终目的是从sound_1数据中提取水流声,消除环境噪音。如果还有其他方法就好了。
我目前正在查看此 post:Python frequency detection
但我不明白他们是如何仅通过一个声音信号就可以找出频率的。我想我们至少需要比较2个信号数据(一个包含我感兴趣的声音,另一个不包含),这样我们才能找出差异。
由于 sound_1
同时包含水流和环境噪声,因此没有直接提取水流的方法。傅立叶变换将为您提供信号中的所有频率,而不管信号源如何。
解决方法是从 sound_2
中获取环境噪声的频率,然后从 sound_1
中移除它们。完成后,您可以从已经去噪的 sound_1
中提取频率。
此类降噪的一种流行方法是使用 光谱选通 。从本质上讲,您首先要确定噪声听起来如何,然后从信号中移除 smoothed 频谱。平滑是至关重要的,因为声音是波浪,是一个连续的实体。如果您简单地从波形中剔除离散频率,您将得到非常糟糕的结果(音频听起来不自然且机械化)。您应用的平滑量将决定减少 的噪音量(请注意,它永远不会真正消除 - 您总会得到一些残留物)。
到具体的解决方案。
- 由于您是该主题的新手,我建议您首先推荐降噪软件如何为您完成这项工作。 Audacity 是一个很好的选择。我链接了降噪手册,但是那里有很多教程。
- 在你知道你想要得到什么之后,你可以自己实现光谱门控或使用现有的包。 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)
现在只需 运行 FFT reduced_noise
即可发现水流的频率。
我对信号处理还很陌生。我现在有两个声音信号数据。以 10 KHz、2 秒的采样率收集每个数据。我已将此数据导入 python。 sound_1 和 sound_2 现在都是一个 numpy 数组。每个声音数据的长度当然是20000。
Sound_1包含水流声(我感兴趣)和环境噪音(我不感兴趣),而sound_2只包含环境噪音(我不感兴趣) .
我正在寻找一种算法(或程序包)来帮助我确定这种水流声的频率范围。我想如果我能找出频率范围,我可以使用傅里叶逆变换来过滤环境噪声。
不过,我的最终目的是从sound_1数据中提取水流声,消除环境噪音。如果还有其他方法就好了。
我目前正在查看此 post:Python frequency detection
但我不明白他们是如何仅通过一个声音信号就可以找出频率的。我想我们至少需要比较2个信号数据(一个包含我感兴趣的声音,另一个不包含),这样我们才能找出差异。
由于 sound_1
同时包含水流和环境噪声,因此没有直接提取水流的方法。傅立叶变换将为您提供信号中的所有频率,而不管信号源如何。
解决方法是从 sound_2
中获取环境噪声的频率,然后从 sound_1
中移除它们。完成后,您可以从已经去噪的 sound_1
中提取频率。
此类降噪的一种流行方法是使用 光谱选通 。从本质上讲,您首先要确定噪声听起来如何,然后从信号中移除 smoothed 频谱。平滑是至关重要的,因为声音是波浪,是一个连续的实体。如果您简单地从波形中剔除离散频率,您将得到非常糟糕的结果(音频听起来不自然且机械化)。您应用的平滑量将决定减少 的噪音量(请注意,它永远不会真正消除 - 您总会得到一些残留物)。
到具体的解决方案。
- 由于您是该主题的新手,我建议您首先推荐降噪软件如何为您完成这项工作。 Audacity 是一个很好的选择。我链接了降噪手册,但是那里有很多教程。
- 在你知道你想要得到什么之后,你可以自己实现光谱门控或使用现有的包。 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)
现在只需 运行 FFT reduced_noise
即可发现水流的频率。