[英]Apply a filter on an audio sample with python
我正在嘗試通過Python遷移我的Matlab代碼,但是我在過濾函數方面遇到了一些麻煩。
這是上下文:
我通過調用以下函數創建了一個 Butterworth 濾波器( fc是帶通中心頻率, q是品質因數, n是階數):
def bandpass(fc, q, n):
bw = fc / q
low = fc - bw/2
high = fc + bw/2
return butter(N=n, Wn=[low, high], btype='band', analog=True)
我從音頻信號中檢索了數據(單聲道,在fs = 48000 處采樣,16 位整數)。 當我繪制濾波器的頻率響應或音頻樣本的幅度譜時,兩者都給出了我所期望的。
這是代碼:
# Imports
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as sw
from scipy import signal
from scipy.signal import butter, lfilter
# Read audio file
fs, y = sw.read(file)
# Nb of samples and time scale
N = len(y)
t = np.linspace(0, N/fs, N)
# Plot amplitude spectrum
plt.plot(t, y/max(y))
# Filter creation
b, a = bandpass(1000, 5, 2)
w, h = signal.freqs(b, a, np.logspace(0, 5, 20000))
# Plot frequential response
plt.semilogx(w, 20 * np.log10(abs(h)));
# Apply filter on audio signal
lfilter(b, a, y) # < Give unexepected results
然后是我陷入困境的部分:我試圖在音頻樣本上應用巴特沃斯濾波器,但它似乎不起作用,因為濾波后的信號向無窮大發散並最終因未知原因以NaN值結束. 我認為盡管遵循了文檔,我還是錯過了一步。 我也嘗試過filtfilt()因為它出現在我所做的一些研究中,但它也不起作用。
這是我嘗試復制的 Matlab 的預期結果。
我錯過了什么?
感謝您的回答:)
額外問題:我怎樣才能繪制這個3d 視圖(在 Matlab 中view(-45,65)
)?
您有一個采樣(即離散時間)信號。 要過濾它,您必須使用離散過濾器,因此butter
的analog
參數必須為False
(這是默認值)。
要分析數字濾波器的頻率響應,請使用freqz
,而不是freqs
。
有關帶通濾波器的相關問答,請參閱如何使用 Scipy.signal.butter 實現帶通巴特沃斯濾波器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.