我一直从事音频数字信号处理方面的工作。我想设计一个数字滤波器。我已经附上了截图。当然,我可以使用FIR/IIR滤波器设计带通滤波器或带阻滤波器,但这种滤波器的特殊之处在于它可以控制低、中、高频。所以我的问题是,如何在python中设计这样的过滤器呢?

手动使用此幅度响应,如图所示。请帮帮忙。我不知道如何将过滤器限制为这些值。
另一种方法是在MATLAB的filterdesigner工具中使用这种滤波器,并将系数导出到python中。但同样,我不知道如何在那里设计这样的过滤器。所以请帮帮忙。
发布于 2021-12-03 15:39:30
与简单的低通/带通/带阻/高通分类相比,有许多设计选项可以匹配更多的任意频带规格。最常见的是:
使用frequency sampling method设计具有最小最大误差优化的
前两种方法可以从scipy.signal获得,分别为scipy.firls和scipy.remez,而第三种方法可以通过对采样频率响应曲线进行逆快速傅立叶变换来实现。
使用最小二乘法的示例实现:
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
bands = [0, fL1, fL2, fH1, fH2, fs/2]
desired = [Bl, Bl, 1, 1, Bh, Bh]
y = signal.firls(numtaps, bands, desired, fs=fs)
f,h = signal.freqz(y, fs=fs)
plt.plot(bands, desired, 'k', linewidth=2)
plt.plot(f, np.abs(h), 'r')使用帕克斯-麦克莱伦算法的示例实现:
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
bands = [0, fL1, fL2, fH1, fH2, fs/2]
desired = [Bl, 1, Bh]
y = signal.remez(numtaps, bands, desired, fs=fs)
f,h = signal.freqz(y, fs=fs)
plt.plot(bands, desired, 'k', linewidth=2)
plt.plot(f, np.abs(h), 'b')基于频率采样法的采样实现
from scipy import interpolate, fft
import matplotlib.pyplot as plt
import numpy as np
# interpolate desired response at equally spaced frequency points
interpolator = interpolate.interp1d(bands, desired)
N = 1024
fsampling = np.linspace(0, fs/2, N)
sampled = interpolator(fsampling)
# take the inverse FFT
y = fft.fftshift(fft.irfft(sampled))
# truncate response to keep numtaps coefficients
n1 = N-numtaps//2
n2 = n1 + numtaps
y = y[n1:n2]为了便于说明,使用以下一组参数
numtaps = 19
fL1 = 100
fL2 = 200
fH1 = 500
fH2 = 600
fs = 1600
Bl = 2
Bh = 2.3将产生相应的设计:

请注意,如果您的频率规范曲线是不超过值(而不是标称值),您仍然可以在每次调整bands和desired参数时以迭代方式使用上述方法,直到收敛到可接受的响应。使用上面的初始参数集,使用最小二乘法,最终可能会得到调整后的参数,例如
bands = [0, 100, 180, 520, 600, fs/2]
desired = [1.966,1.966,0.980,0.980,2.225,2.225]对应的响应如下:

https://stackoverflow.com/questions/70167856
复制相似问题