gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:42 26 4
gpt4 key购买 nike

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

上下文如下:

我通过调用以下函数创建了巴特沃斯滤波器(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(),因为它出现在我所做的一些研究中,但它也不起作用。

这是expected result我用 Matlab 得到了它,我正在尝试复制它。

我错过了什么?

感谢您的回答:)

<小时/>

额外问题:我怎样才能绘制这个3d view (在 Matlab 中查看(-45,65))?

最佳答案

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

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

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

关于python - 使用 python 对音频样本应用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com