如何绘制模拟滤波器脉冲响应和频率响应?

信息处理 过滤器 过滤 模数 切比雪夫滤波器
2022-01-30 11:00:12

我是信号处理的新手,正在处理 UWB rada 数据,该数据具有帧的形状,每个帧(列表)都有 164 个值,我想通过一个 1hz 和 5hz 频率的带通滤波器来过滤噪声数据,我的过滤器没有像我预期的那样给出好的结果(过滤后的数据是背后的原因),所以我想知道如何去消除这个:

Fs = 50
fp = np.array([1, 5])
Ap = 0.025
filter_order = 2
wc = (2 * pi * fp) / Fs

print('wc is ', wc)

sos = signal.cheby1(filter_order,
                    Ap,
                    wc,
                    'bandpass',
                    analog=True,
                    output='sos')

filt_data_UWB1 = signal.sosfilt(sos, data_UWB1_before)

如何绘制脉冲响应频率响应和 biegn 过滤前后的数据(每个数据样本都是一个包含 164 点的帧,我应该如何绘制这个)?

1个回答

获得作为两个二阶滤波器 (sos) 级联的滤波器的脉冲和频率响应的一种简单方法是首先通过对分子和分母系数进行卷积来组合两个滤波器:

H(s)=H1(s)H2(s)

并绘制幅度和相位与的关系来绘制频率响应s=jωω

脉冲响应是从的拉普拉斯逆变换得到的。H(s)

这一切都可以直接在python中完成:

要卷积两个过滤器,请使用该numpy.convolve命令。

要绘制频率响应,请使用scipy.signal.freqs命令。

要绘制脉冲响应,请使用scipy.signal.impulse命令。

这在下面演示,有关更多详细信息,请参阅上述命令的帮助文档:

频率响应:

b = np.convolve(sos[0][:3], sos[1][:3])
a = np.convolve(sos[0][3:], sos[1][3:]) 
w, h = signal.freqs(b, a)
plt.subplot(2,1,1)
plt.semilogx(w, 20*np.log10(h))
plt.subplot(2,1,2)
plt.semilogx(w, np.unwrap(np.angle(h)))

频率响应

脉冲响应:

t, y = signal.impulse((b,a), T=np.linspace(0, 150, 2**14))
plt.plot(t, y)

脉冲响应