级联数字滤波:如何合并各滤波器的传递函数系数?
级联滤波器传递函数系数的合并方法
理论上的正确操作
当两个滤波器级联时,总传递函数是两个滤波器传递函数的乘积。假设:
- Butterworth滤波器的传递函数为 $H_1(z) = \frac{b_1(z)}{a_1(z)}$,其中 $b_1$ 是分子系数,$a_1$ 是分母系数
- Chebyshev II滤波器的传递函数为 $H_2(z) = \frac{b_2(z)}{a_2(z)}$,其中 $b_2$ 是分子系数,$a_2$ 是分母系数
那么级联后的总传递函数为:
$$H(z) = H_1(z) \times H_2(z) = \frac{b_1(z) \times b_2(z)}{a_1(z) \times a_2(z)}$$
这里的多项式乘法,对应系数序列的卷积操作——因为两个多项式相乘的结果系数,本质就是两个系数序列的卷积。所以正确的合并方式是:
- 总分子系数:
conv(b1, b2) - 总分母系数:
conv(a1, a2)
关于“相乘和卷积结果相似”的解释
你看到的幅度响应相似只是巧合,原因可能是:
- 滤波器阶数较低,直接系数相乘(错误操作)的结果在可视化精度下和卷积结果差异不明显
- 幅度响应的可视化范围或分辨率不足以展示两种操作的细微差异
举个简单例子:如果b1是[1 2],b2是[3 4],卷积结果是[3 10 8](对应多项式3+10z+8z²),而直接相乘得到[3 8](对应3+8z),两者的传递函数完全不同,只是低阶小范围的幅度响应可能看起来接近,但理论上是错误的。
Matlab实操示例
假设已经通过butter()和cheby2()得到了两组系数b1,a1和b2,a2,合并代码如下:
% 合并级联滤波器的系数 b_total = conv(b1, b2); a_total = conv(a1, a2); % 验证幅度响应 freqz(b_total, a_total);
内容的提问来源于stack exchange,提问作者tehgankerer
相关产品推荐
相关产品推荐

