【问题标题】:Apply a filter on an audio sample with python使用 python 对音频样本应用过滤器
【发布时间】: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


【解决方案1】:

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

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

请参阅How to implement band-pass Butterworth filter with Scipy.signal.butter,了解有关带通滤波器的相关问题和答案。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 2011-05-22
    • 2010-09-19
    • 2019-05-22
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多