第五篇滤波器结构转换一——直接型与级联型的互转在滤波器设计如fir1、ellip中MATLAB 默认返回的是直接型Direct Form的分子/分母系数b, a。这种结构简单直观但对于高阶如 20 阶滤波器直接型对系数量化误差极为敏感极容易在极点靠近单位圆时产生不稳定。工程中更常用的是级联型Cascade Form——将高阶系统拆解为若干个二阶节SOS的串联每个二阶节只处理一对共轭极点/零点从而大幅降低数值敏感度。本篇将带领你深入dir2cas.m与cas2dir.m探究零极点配对、增益归一化及二阶节合并的全部奥秘。1. 为什么需要级联型一个 (N) 阶系统的传递函数为[H(z) \frac{b_0 b_1 z^{-1} \cdots b_M z^{-M}}{1 a_1 z^{-1} \cdots a_N z^{-N}}]直接型I 型或 II 型将所有系数集中在一个差分方程中。当 (N) 较大时(a_k) 和 (b_k) 的动态范围差异巨大微小的量化误差可能导致极点移出单位圆。级联型将 (H(z)) 分解为 (K) 个二阶节的乘积[H(z) b_0 \prod_{i1}^{K} \frac{1 B_{i1} z^{-1} B_{i2} z^{-2}}{1 A_{i1} z^{-1} A_{i2} z^{-2}}]每个二阶节只处理一对共轭复数根或两个实根。优点极点/零点被“隔离”在各自的节中舍入误差只影响局部不会蔓延。在 FPGA/DSP 硬件实现中级联型是绝对主流。我们的工具包提供了双向转换dir2cas直接型 → 级联型便于稳定实现cas2dir级联型 → 直接型便于理论分析或与教科书对照2. 深度剖析dir2cas.m该函数接受直接型系数b, a输出增益b0以及 (K \times 3) 的矩阵B, A每行对应一个二阶节的分子/分母系数。第一步增益归一化与系数对齐b0b(1);bb/b0;a0a(1);aa/a0;b0b0/a0;先将分子分母的首项系数提取出来归一化为首项为 1 的多项式。最后b0汇聚了总增益分子首项除以分母首项。例如 FIR 滤波器a1时b0 b(1)。Mlength(b);Nlength(a);ifNM b[bzeros(1,N-M)];elseifMN a[azeros(1,M-N)];NM;end强制使b和a等长不足补零以便后续求根时长度一致。第二步确定二阶节个数 (K)Kfloor(N/2);Bzeros(K,3);Azeros(K,3);ifK*2N;b[b0];a[a0];end(K \lfloor N/2 \rfloor) 表示需要K个二阶节。如果 (N) 为偶数例如 4 阶那正好组成 2 个二阶节。但为了后续配对方便代码在末尾补了一个零使得长度变为奇数5这样broots中一定会有 4 个根偶数个便于两两配对。这是一个非常巧妙的预处理技巧。第三步求根并配对brootscplxpair(roots(b));arootscplxpair(roots(a));roots(b)求分子多项式的零点Zerosroots(a)求极点Poles。cplxpair是核心它将复数根按共轭配对排序实根排在最后。保证前两个一定是一对共轭复数便于组合成实系数的二阶节。第四步组合成二阶节fori1:2:2*K Browbroots(i:1:i1,:);Browreal(poly(Brow));B(fix((i1)/2),:)Brow;Arowaroots(i:1:i1,:);Arowreal(poly(Arow));A(fix((i1)/2),:)Arow;end从broots中每次取两个根用poly还原成多项式系数例如根为 (r_1, r_2)则多项式为 ( (z - r_1)(z - r_2) z^2 - (r_1r_2)z r_1r_2 )。real保证因为共轭配对虚部恰好抵消得到纯实数系数。注意poly返回的是 ( [1, -(r_1r_2), r_1r_2] )对应 ( 1 B_1 z^{-1} B_2 z^{-2} )。这里采用的正幂次多项式但系数排列上正好对应filter(B,A,x)所需的顺序因为 MATLAB 的filter默认按 (z^{-1}) 降幂。3. 深度剖析cas2dir.m反向转换相对简单就是将若干个二阶节的系数通过卷积乘起来。function[b,a]cas2dir(b0,B,A)[K,L]size(B);b[1];a[1];fori1:K bconv(b,B(i,:));aconv(a,A(i,:));endbb*b0;初始化为[1]常数 1。遍历每个二阶节将其系数与累积多项式进行卷积即乘法。最后乘以总增益b0。注意conv的顺序无所谓卷积满足交换律。4. 实战验证转换前后频率响应完全一致我们来测试一个 6 阶椭圆低通滤波器验证转换后是否与原滤波器等价的频率响应。% 设计一个 6 阶椭圆低通[b,a]ellip(6,0.5,40,0.4);% 转为级联型[b0,B,A]dir2cas(b,a);% 再转回直接型检验是否复原[b2,a2]cas2dir(b0,B,A);% 对比转换前后的频率响应[H1,w]freqz(b,a,512);[H2,~]freqz(b2,a2,512);% 绘制误差plot(w/pi,abs(H1-H2));title(转换前后幅频响应误差);grid on;你会发现误差在 (10^{-15}) 量级这是浮点舍入误差说明转换完全可逆。5. 特殊注意事项文件cas2dir(1).m在代码包中文件名被命名为cas2dir(1).m这是 Windows 系统下载时自动添加的副本标记。实际使用前请务必将其重命名为cas2dir.m否则 MATLAB 无法正常调用该函数。本系列博文中我们统一称其为cas2dir.m。6. 级联型排序的艺术高阶话题dir2cas中的配对顺序是“按根在复平面上的位置依次配对”但实际工程中极点/零点的配对顺序会影响中间变量的动态范围。最佳实践是极点配对将相距最近的极点配成一对cplxpair默认按实部排序往往也是距离最近的。零点配对选择能够“抵消”该极点影响的零点即距离最近的零点进行组合以减小每个节的峰值增益。我们的基础版本没有实现优化配对但对于教学和理解已经足够。如果你感兴趣可以在dir2cas中增加基于距离的贪婪匹配算法。7. 本讲小结今天我们完成了理解了直接型转为级联型的必要性与数学原理逐行剖析了dir2cas中求根、共轭配对、二阶节构造的全流程学习了cas2dir通过卷积合并二阶节的方法用数值实验验证了转换的精确可逆性。掌握了级联型之后下篇我们将挑战结构转换的另一极——并联型。并联型来源于部分分式展开在 IIR 滤波器并行处理或硬件加速中也有重要应用。所有代码均已打包点击下方链接免费获取下载链接下篇预告滤波器结构转换二——直接型与并联型的互转。我们将解析dir2par.m如何利用residuez展开部分分式并处理棘手的共轭复数极点配对。敬请期待