【发布时间】:2018-03-24 22:25:49
【问题描述】:
我正在尝试通过 Python 迁移我的 Matlab 代码,但在过滤函数方面遇到了一些问题。
这是上下文:
我通过调用以下函数创建了一个巴特沃斯滤波器(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 获得的 expected result,我正在尝试复制它。
我错过了什么?
感谢您的回答:)
额外问题:我怎样才能绘制这个3d view(Matlab 中的view(-45,65))?
【问题讨论】:
-
我从来没有做过这样的事情,但我检查了文档,
lfilter不能在原地工作。因此,lfilter(b, a, y)什么都不做;该函数的结果被丢弃,因为您没有将它们分配回某些东西,例如something = lfilter(b, a, y) -
显示整个代码,包括导入。另外,不知道是错误还是拼写错误(很可能是第二个),您的返回函数中缺少 ]。
-
是的,我没有指定它,但我实际上保存了结果(这就是为什么我知道它以 NaN 结尾,它看起来像:
array([-1.10000000e+05, 1.54463492e+07, 5.65446349e+08, ..., nan, nan, nan]),但是由于数据不正确,我无法绘制它
标签: python matlab numpy audio scipy