1 回答
TA贡献1829条经验 获得超9个赞
由于sound_1
包含水流和环境噪声,因此没有直接的方法来提取水流。傅里叶变换将为您提供信号中的所有频率,而与源无关。
接近的方法是从 中获取环境噪声的频率,sound_2
然后将它们从 中移除sound_1
。完成后,您可以从已经去噪的 中提取频率sound_1
。
这种降噪的流行方法之一是使用频谱选通。本质上,您首先确定噪声听起来如何,然后从信号中移除平滑频谱。平滑是至关重要的,因为声音是一种波,是一个连续的实体。如果你只是从波形中去掉离散的频率,你会得到非常糟糕的结果(音频听起来不自然和机器人)。您应用的平滑量将决定减少多少噪音(请注意它永远不会真正消除 - 您总会得到一些残留物)。
到具体的解决方案。
由于您是该主题的新手,因此我首先建议您在可以为您完成工作的软件中如何进行降噪。Audacity是一个很好的选择。我链接了降噪手册,但是那里有很多教程。
在你知道你想要得到什么之后,你可以自己实现光谱门控或使用现有的包。Audacity 在 C++ 中有出色的实现,但对于新手来说可能很难移植。我建议先使用降噪包。它基于 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)
现在只需在 上运行 FFTreduced_noise即可发现水流的频率。
这是我使用noisereduce的方式。在这一部分中,我正在确定频率统计信息。
添加回答
举报