You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:44:53