使用python对音频样本应用过滤器

使用python对音频样本应用过滤器,python,matlab,numpy,audio,scipy,Python,Matlab,Numpy,Audio,Scipy,我正在尝试将我的Matlab代码移植到Python上,但在过滤函数方面遇到了一些问题 以下是上下文: 我通过调用以下函数创建了butterworth滤波器(fc是带通中心频率,q是质量因子,n是顺序): 我从音频信号中检索数据(单声道,在fs=48000时采样,16位整数)。当我绘制滤波器的频率响应或音频样本的振幅谱时,两者都给出了我期望的结果 代码如下: # Imports import numpy as np import matplotlib.pyplot as plt import sc

我正在尝试将我的Matlab代码移植到Python上,但在过滤函数方面遇到了一些问题

以下是上下文:

我通过调用以下函数创建了butterworth滤波器(fc是带通中心频率,q是质量因子,n是顺序):

我从音频信号中检索数据(单声道,在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
#导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
将scipy.io.wav文件作为软件导入
从scipy输入信号
来自scipy.signal进口黄油,lfilter
#读取音频文件
fs,y=sw.read(文件)
#样本数量和时间尺度
N=len(y)
t=np.linspace(0,N/fs,N)
#绘制振幅谱
plt.绘图(t,y/max(y))
#过滤器创建
b、 a=带通(1000,5,2)
w、 h=信号频率(b,a,np.对数空间(0,5,20000))
#绘图频率响应
plt.semilogx(w,20*np.log10(abs(h));
#对音频信号应用滤波器
lfilter(b,a,y)#<给出了未预期的结果
然后是我陷入困境的部分:我试图在音频样本上应用巴特沃斯滤波器,但它似乎不起作用,因为滤波后的信号发散到无穷远,最终由于未知的原因以NaN值结束。我认为尽管遵循了这些文件,我还是错过了一步。我还尝试了filt(),因为它出现在我做的一些研究中,但也不起作用

这是我用Matlab得到的结果,我正试图复制它

我错过了什么

谢谢你的回答:)


额外问题:我如何才能在Matlab中绘制此(
视图(-45,65)

您有一个采样(即离散时间)信号。要对其进行过滤,必须使用离散过滤器,因此的
analog
参数必须为
False
(这是默认值)

要分析数字滤波器的频率响应,请使用,而不是
freqs


有关带通滤波器的相关问题和答案,请参阅。

我从未做过类似的工作,但我检查了文档,发现
lfilter
无法正常工作。因此,
lfilter(b,a,y)
什么都不做;该函数的结果将被丢弃,因为您没有将它们重新分配给某个对象,例如
something=lfilter(b,a,y)
显示整个代码,包括导入。另外,我不知道这是否是一个错误或输入错误(很可能是第二个错误),返回函数中缺少了一个“]。是的,我没有指定它,但我实际上保存了结果(这就是为什么我知道它以NaN结尾,它看起来像:
数组([-1.1000000e+05,1.54463492e+07,5.65446349e+08,…,NaN,NaN,NaN]))
,但由于数据不正确,我无法绘制它
# 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