在python上应用过滤器的音频样本
问题描述:
我试图迁移我的Matlab代码Python,但我有一些过滤功能的麻烦。在python上应用过滤器的音频样本
这里的上下文中:
我通过调用下面的函数创建了一个巴特沃斯滤波器(FC是带通的中心频率,q其品质因数和Ñ其顺序):
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(),因为它出现在我做的一些研究中,但它也没有工作。
这是expected result我用Matlab试图复制。
我错过了什么?
谢谢您的回答:)
奖金的问题:我如何可以实现绘制该3d view(在Matlab view(-45,65)
)?
答
您有一个采样(即离散时间)信号。要对其进行过滤,您必须使用离散过滤器,因此butter
的参数analog
必须是False
(这是默认值)。
要分析数字滤波器的频率响应,请使用freqz
而不是freqs
。
有关带通滤波器的相关问题和答案,请参阅How to implement band-pass Butterworth filter with Scipy.signal.butter。
我从来没有这样的工作,但我检查了文档和'lfilter'不就地工作。因此,'lfilter(b,a,y)'什么都不做;该函数的结果将被抛弃,因为您不会将它们分配回'something = lfilter(b,a,y)' – roganjosh
显示整个代码,包括进口。此外,不知道你的返回函数中是否有错误或错字(最有可能是第二个)缺少]。 –
是的,我没有指定它,但我实际上保存了结果(这就是为什么我知道它以* NaN *结尾,它看起来像:'array([ - 1.10000000e + 05,1.54463492e + 07,5.65446349e +08,...,nan,nan,nan]),但由于数据不正确,我无法绘制它 – Lowlight