有没有办法通过Python 3.6中的scipy
或librosa
为16 KHz的wav文件创建一个快速的带通滤波器,以过滤300- 3400 Hz的人声频带之外的噪声?下面是一个低频背景噪声的sample wav file。
更新:是的,我已经看过/试过How to implement band-pass Butterworth filter with Scipy.signal.butter了。不幸的是,过滤后的声音变形得很可怕。本质上,整个代码都是这样做的:
lo,hi=300,3400
sr,y=wavfile.read(wav_file)
b,a=butter(N=6, Wn=[2*lo/sr, 2*hi/sr], btype='band')
x = lfilter(b,a,y)
sounddevice.play(x, sr) # playback
我做错了什么,或者如何改进这一点,使背景噪音被正确过滤掉。
下面是使用上面的链接对原始文件和过滤后的文件进行的可视化。可视化看起来很合理,但听起来很可怕:(如何修复这个问题?
2条答案
按热度按时间pkmbmrz71#
显然,当写入未规范化的64位浮点数据时会出现问题。通过将
x
转换为16位或32位整数,或者将x
规范化为范围[-1,1]并转换为32位浮点,我得到了一个听起来合理的输出文件。我没有使用
sounddevice
;相反,我将过滤后的数据保存到一个新的WAV文件中并播放它。以下是对我有效的几种变体:或者...
或者...
输出整数时,您可以放大值,以将截断浮点值所造成的精确度损失降至最低:
xlpyo6sf2#
以下代码用于从此处生成带通滤波器:https://scipy.github.io/old-wiki/pages/Cookbook/ButterworthBandpass
看看这对你有没有帮助。
您可以在此处指定所需的频率: