scipy双线性变换在低频和高采样率下不正确

时间:2014-08-09 05:57:55

标签: python scipy filtering signal-processing

编辑:我想我可能会有一个迂回的方式来处理这个问题。

由于我从zpk表示开始,只需将高阶滤镜拆分为两个较小的顺序滤镜。

例如,不是设计具有5极和5个零的滤波器,而是设计具有三个极点和三个零点的滤波器A以及具有两个极点和两个零点的滤波器B.然后用过滤器A过滤,然后用过滤器B过滤。这应该是等效的,我在低采样率下测试它(因为在低采样率下我没有看到这个问题)似乎有积极的结果。

我正在使用scipy.signal模块来实现一个滤波器,我指定5个零(全部为100Hz)和5个极点(均为1Hz)。我正在研究数字滤波器的频率响应,它看起来不像低频时的模拟滤波器。

我注意到如果我降低采样率,那么它匹配得很好(例如从16384Hz降低到4096Hz)。或者,如果我降低过滤器的顺序,那么它也会更好地匹配。

有人可以解释如何更好地匹配模拟和数字频率响应吗?

以下示例图片。

4096Hz(黑色:模拟滤波器幅度,蓝色:数字滤波器幅度)注意到低频时存在一些差异:

x

16384Hz匹配低频更差:

x

例如:

import numpy as np
import scipy.signal
import matplotlib.pyplot as plt

# define zpk filter and sampling rate
z = np.array([2*np.pi*(-100.), 2*np.pi*(-100.), 2*np.pi*(-100.), 2*np.pi*(-100.), 2*np.pi*(-100.)], dtype=np.float64)
p = np.array([2*np.pi*(-1.), 2*np.pi*(-1.), 2*np.pi*(-1.), 2*np.pi*(-1.), 2*np.pi*(-1.)])
k = 1./ 100.**5
sample_rate = 16384

# get analog coefficients
analog_coefficients = scipy.signal.zpk2tf(z, p, k)

# get digital coefficients
digital_coefficients = scipy.signal.bilinear(analog_coefficients[0], analog_coefficients[1], sample_rate)

# get frequency response
wa,ha = scipy.signal.freqs(analog_coefficients[0], analog_coefficients[1], 2**20)
w,h = scipy.signal.freqz(digital_coefficients[0], digital_coefficients[1], 2**20)
w = w * sample_rate / (2 *np.pi)
wa = wa / (2 *np.pi)


# plot frequency response
# blue  : digital magnitude
# black : analog magnitude
fig = plt.figure()
plt.title('Digital filter frequency response')
ax1 = fig.add_subplot(111)
plt.semilogx(w, 20 * np.log10(abs(h)), 'b')
plt.semilogx(wa, 20 * np.log10(abs(ha)), 'k')
plt.ylabel('magnitude [dB]')
plt.xlabel('frequency [Hz]')
plt.grid()
plt.axis('tight')
plt.xlim([0.001, sample_rate/2])
plt.show()

感谢。

0 个答案:

没有答案