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

标签 python audio frequency

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

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

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

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

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

但我不明白他们怎么能仅通过一个声音信号就找出频率。我认为我们至少需要比较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我正在确定频率统计数据。

关于python - 如何确定感兴趣的声音与环境噪声的频率范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881414/

相关文章:

excel - 如果相邻列满足条件且不等于第二个条件,则计算列中的唯一值

python - Dataframe 有一列是字典列表,我需要将它们解析为新的列

python - 多尺度模板匹配不正确

python - 如何解决 pyspark 中的 pickle 错误?

ios - EZaudio在后台执行

android - FSK 调制和在 Android 中播放正弦音调

python - 如何从 .pyo 文件恢复源 python 代码 (.py)?

unity3d - Unity中的WAV循环点

node.js - 如何在Alexa示例nodejs音频播放器项目中更改AudioPlayer指令 “play the audio,”?

Python 按频率对字符串进行排序 - 无法使用 sorted() 函数进行排序