簡體   English   中英

黃油過濾后的音頻緩沖有限誤差(Scipy)

[英]Audio buffer finite error after butter filtering (Scipy)

我有一個音頻信號,我通過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的庫檢測一些音高。

我打電話的時候:

  pitches, magnitudes = librosa.piptrack(y=y, sr=sr, fmin=fmin, fmax=fmax)

其中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')

為什么會這樣?

您正在嘗試創建一個Butterworth濾波器 (這是一個IIR濾波器),其順序為1001,使用傳遞函數系數(b,a)表示。 傳遞函數是有理函數,它是兩個多項式的比率,高階多項式的評估非常容易受到數值誤差的影響。 你要做的是注定要失敗。

一些建議:

  • 重新考慮是否需要使用訂單1001的過濾器。為什么要嘗試創建具有如此高順序的過濾器?
  • 如果對過濾器使用SOS(二階段)格式而不是傳遞函數(b,a),則會獲得更好的數值行為。

嘗試使用低得多秩序,並嘗試使用scipy.signal.sosfilt過濾信號:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM