![](/img/trans.png)
[英]How to use "scipy.signal.butter" function for doing low-pass filtering?
[英]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)表示。 傳遞函數是有理函數,它是兩個多項式的比率,高階多項式的評估非常容易受到數值誤差的影響。 你要做的是注定要失敗。
一些建議:
嘗試使用低得多秩序,並嘗試使用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.