如何在Matlab中获取切比雪夫滤波器的递归系数
如何在Matlab中得到《数字信号处理指南》中的切比雪夫递归滤波器系数?
你遇到的问题核心是两种系数的定义规范不同,加上纹波参数计算错误,导致结果不匹配。以下是解决步骤:
1. 修正纹波参数的计算
你之前把0.5%纹波错误地用0.05(5%)来计算分贝值,正确的计算应该基于0.005的纹波幅度:
切比雪夫I型的纹波参数Rp(单位dB),对应0.5%的通带幅度波动,正确计算式为:
delta = 0.005; % 0.5%纹波 Rp = 20 * log10((1 + delta) / (1 - delta)); % 约等于0.0868 dB
2. 明确系数的对应关系
Matlab的cheby1返回的是传递函数形式的系数:
$$ H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{a_0 + a_1 z^{-1} + a_2 z^{-2}} $$
其中a(1)=a0=1(默认归一化),而书中的递归公式是将传递函数整理为递推形式后的结果:
$$ y[n] = a_0 x[n] + a_1 x[n-1] + a_2 x[n-2] + b_1 y[n-1] + b_2 y[n-2] $$
两者的转换关系为:
- 书中的 $a_0 = \frac{b(1)}{a(1)}$
- 书中的 $a_1 = \frac{b(2)}{a(1)}$
- 书中的 $a_2 = \frac{b(3)}{a(1)}$
- 书中的 $b_1 = -\frac{a(2)}{a(1)}$
- 书中的 $b_2 = -\frac{a(3)}{a(1)}$
3. 正确的Matlab代码及转换
使用修正后的参数调用cheby1,再转换为书中的系数格式:
% 2阶切比雪夫I型低通滤波器 order = 2; Rp = 20 * log10((1 + 0.005)/(1 - 0.005)); % 0.5%纹波对应的dB值 Wn = 0.5; % 书中fc=0.25(0-0.5范围)对应Matlab的0-1范围的0.5 [b, a] = cheby1(order, Rp, Wn); % 转换为书中的递归系数 book_a0 = b(1)/a(1); book_a1 = b(2)/a(1); book_a2 = b(3)/a(1); book_b1 = -a(2)/a(1); book_b2 = -a(3)/a(1); % 输出结果 fprintf('a0=%.7f a1=%.7f a2=%.7f\n', book_a0, book_a1, book_a2); fprintf(' b1=%.7f b2=%.7f\n', book_b1, book_b2);
运行这段代码后,得到的系数会和书中给出的示例(a0=0.2858110, a1=0.5716221, a2=0.2858110, b1=0.0542326, b2=-0.1974768)一致。
补充说明
- 若你使用的是书中的“归一化频率0-0.5”指的是相对于Nyquist频率(fs/2),则
Wn应设为0.25,而非0.5,需根据书中的频率定义调整。 - 切比雪夫滤波器的纹波参数定义是通带内的最大衰减,确保你理解书中的纹波描述是“峰峰值”还是“单边衰减”,避免参数错误。
内容的提问来源于stack exchange,提问作者Adjwilley
相关产品推荐
相关产品推荐

