簡體   English   中英

使用 python 在音頻樣本上應用過濾器

[英]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) )?

您有一個采樣(即離散時間)信號。 要過濾它,您必須使用離散過濾器,因此butteranalog參數必須為False (這是默認值)。

要分析數字濾波器的頻率響應,請使用freqz ,而不是freqs

有關帶通濾波器的相關問答,請參閱如何使用 Scipy.signal.butter 實現帶通巴特沃斯濾波器。

暫無
暫無

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

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