1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于sound_1
包含水流和環(huán)境噪聲,因此沒有直接的方法來提取水流。傅里葉變換將為您提供信號(hào)中的所有頻率,而與源無關(guān)。
接近的方法是從 中獲取環(huán)境噪聲的頻率,sound_2
然后將它們從 中移除sound_1
。完成后,您可以從已經(jīng)去噪的 中提取頻率sound_1
。
這種降噪的流行方法之一是使用頻譜選通。本質(zhì)上,您首先確定噪聲聽起來如何,然后從信號(hào)中移除平滑頻譜。平滑是至關(guān)重要的,因?yàn)槁曇羰且环N波,是一個(gè)連續(xù)的實(shí)體。如果你只是從波形中去掉離散的頻率,你會(huì)得到非常糟糕的結(jié)果(音頻聽起來不自然和機(jī)器人)。您應(yīng)用的平滑量將決定減少多少噪音(請(qǐng)注意它永遠(yuǎn)不會(huì)真正消除 - 您總會(huì)得到一些殘留物)。
到具體的解決方案。
由于您是該主題的新手,因此我首先建議您在可以為您完成工作的軟件中如何進(jìn)行降噪。Audacity是一個(gè)很好的選擇。我鏈接了降噪手冊(cè),但是那里有很多教程。
在你知道你想要得到什么之后,你可以自己實(shí)現(xiàn)光譜門控或使用現(xiàn)有的包。Audacity 在 C++ 中有出色的實(shí)現(xiàn),但對(duì)于新手來說可能很難移植。我建議先使用降噪包。它基于 Audacity 實(shí)現(xiàn)。如果你使用它,你將在幾行內(nèi)完成。
這是一個(gè)片段:
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)
現(xiàn)在只需在 上運(yùn)行 FFTreduced_noise即可發(fā)現(xiàn)水流的頻率。
這是我使用noisereduce的方式。在這一部分中,我正在確定頻率統(tǒng)計(jì)信息。
添加回答
舉報(bào)