我一直在使用科学家和工程师数字信号处理指南来帮助我理解递归滤波器,并且我现在想设计一个低通切比雪夫滤波器。这本书提供了一种递归系数的食谱。例如,纹波为 0.5% 且 fc=0.25 的 2 极滤波器将具有系数:
a0= 2.858110E-01 a1= 5.716221E-01 a2= 2.858110E-01
b1= 5.423258E-02 b2= -1.974768E-01
其中每个连续过滤值的计算方式为:
y[n] = a0 * x[n] + a1 * x[n-1] + a2 * x[n-2] + ...
b1 * y[n-1] + b2 * y[n-2].
根据我从https://www.mathworks.com/help/signal/ref/cheby1.html收集到的信息,在Matlab中计算同一滤波器系数的代码是:
[b,a] = 切比1(2, 0.1737, 0.5)
其中 0.1737 是转换为分贝的 0.5% 纹波 (40*log10((1+0.05)/(1-0.05))),0.5 是 0 到 1 范围内的截止频率,而不是像中那样的 0 到 0.5这本书。
这为 a 和 b 各产生了 3 个数字。
b = 0.4470 0.8939 0.4470
a = 1.0000 0.5508 0.2731
但是这些与书本上的数字没有相似之处,而且 b 不应该有 3 个数字。 Matlab 称这 6 个数字为“传递函数系数”,而书中称这 5 个数字为“递归系数”。我的问题是:如何在Matlab中计算5个递归系数?
产生差异的原因如下:
cheby1
使用不同的定义来定义频率和纹波。
书中滤波器的直流增益为0 dB,纹波向上(即滤波器放大了部分频率),在截止频率处增益为-3 dB。
在Matlab中,滤波器的最大增益为0 dB(不一定在DC),纹波向下(因此滤波器在所有频率上都有非正增益),截止频率处的增益(dB)等于减去特定纹波.
在纹波中,您使用40*log10((1+0.05)/(1-0.05))
从百分比到dB
的转换是不正确:它应该是
20*log10(1+0.005)
或-20*log10(1-0.005)
。这本书似乎使用了第二种选择;无论如何,这两个定义之间的数值差异很小。
系数在两种情况下具有相同的含义,但顺序和符号不同。用
b
、a
表示 Matlab 的系数向量,由 cheby1
给出,书本的系数用 a0
、a1
、a2
表示; b1
,b2
,等价于:b = [a0 a1 a2]
; a = [1 -b1 -b2]
。
通过将问题中的递归方程与 Matlab 文档中的 H(z) 表达式进行比较,可以轻松建立第 3 项中的等价性。
freqz
绘制滤波器的频率响应非常有用。对于这本书的版本,
a0=2.858110E-01; a1=5.716221E-01; a2=2.858110E-01;
b1=5.423258E-02, b2=-1.974768E-01;
freqz([a0 a1 a2],[1 -b1 -b2])
给出幅度响应(第二张图像是第一张图像的缩放版本)
可以看出,纹波向上为−20*log10(1-0.005) = 0.044 dB,在归一化频率0.5处增益为−3 dB。
另一方面,Matlab的设计
[b,a] = cheby1(2, -20*log10(1-0.005), 0.5);
freqz(b,a)
给出(同样,第二张图片是第一张图片的缩放版本)
其中纹波等于指定值,但向下,即 20*log10(1−0.005) = −0.044 dB,归一化频率 0.5 处的增益等于该值。