缓冲区过滤后的音频缓冲区有限错误(Scipy)

2024-09-30 06:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个音频信号通过butter带通滤波器:

def bandpass_filter(y, sr, lowcut, highcut):
  # Setup parameters.
  nyquist_rate = sr / 2.
  filter_order = 1001
  normalized_low = lowcut / nyquist_rate
  normalized_high = highcut / nyquist_rate

  b, a = butter(filter_order, [normalized_low, normalized_high], btype='bandpass')

  y = lfilter(b, a, y)
  return y

然后我使用这个返回的、经过过滤的信号,使用一个名为Librosa的库来检测一些音调。在

当我打电话给:

^{pr2}$

其中y是过滤后的音频信号,我得到以下错误:

librosa.util.exceptions.ParameterError
ParameterError: Audio buffer is not finite everywhere

这基本上来自于以下检查:

if not np.isfinite(y).all():
    raise ParameterError('Audio buffer is not finite everywhere')

为什么会这样?在


Tags: rate信号notorderfilter音频lowsr
1条回答
网友
1楼 · 发布于 2024-09-30 06:18:48

您正试图创建一个顺序为1001的Butterworth filter(这是一个IIR过滤器),使用传递函数系数(b,a)表示。传递函数是一个有理函数,它是两个多项式的比值,高阶多项式的求值很容易受到数值误差的影响。你想做的事注定要失败。在

一些建议:

  • 重新考虑需要1001号订单的过滤器。为什么要创建一个具有如此高阶数的过滤器?在
  • 如果对过滤器使用SOS(二阶部分)格式,而不是传递函数(b,a),您将获得更好的数值行为。在

尝试使用much低阶,并尝试使用^{}过滤信号:

sos = butter(filter_order, [normalized_low, normalized_high], btype='bandpass', output='sos')
y = sosfilt(sos, y)

相关问题 更多 >

    热门问题