2017-10-12 40 views
1

我试图迁移我的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))?

+0

我从来没有这样的工作,但我检查了文档和'lfilter'不就地工作。因此,'lfilter(b,a,y)'什么都不做;该函数的结果将被抛弃,因为您不会将它们分配回'something = lfilter(b,a,y)' – roganjosh

+0

显示整个代码,包括进口。此外,不知道你的返回函数中是否有错误或错字(最有可能是第二个)缺少]。 –

+0

是的,我没有指定它,但我实际上保存了结果(这就是为什么我知道它以* NaN *结尾,它看起来像:'array([ - 1.10000000e + 05,1.54463492e + 07,5.65446349e +08,...,nan,nan,nan]),但由于数据不正确,我无法绘制它 – Lowlight

回答