【数字信号处理含matlab代码】滤波器结构转换(二)——直接型与并联型的互转

发布时间:2026/8/9 2:00:58
【数字信号处理含matlab代码】滤波器结构转换(二)——直接型与并联型的互转 第六篇滤波器结构转换二——直接型与并联型的互转重要声明本文是对原第六篇的全面修订。原代码dir2par.m存在严重缺陷循环范围错误、实数极点被丢弃、合并方式不稳健经读者指正后我们重新推导了数学原理并给出通用修正版代码。本修正版将作为该篇的唯一正式版本所有后续示例均基于此。1. 并联型的数学基础——部分分式展开任意有理传递函数可表示为H ( z ) B ( z ) A ( z ) C ( z ) ∑ i 1 N r i 1 − p i z − 1 H(z) \frac{B(z)}{A(z)} C(z) \sum_{i1}^{N} \frac{r_i}{1 - p_i z^{-1}}H(z)A(z)B(z)​C(z)i1∑N​1−pi​z−1ri​​其中C ( z ) C(z)C(z)是多项式部分当M ≥ N M \ge NM≥N时存在r i r_iri​是对应于极点p i p_ipi​的留数。为了得到实系数子系统的并联需要将共轭复数极点对合并为一个二阶实系数分式r 1 − p z − 1 r ∗ 1 − p ∗ z − 1 b 0 b 1 z − 1 1 a 1 z − 1 a 2 z − 2 \frac{r}{1 - p z^{-1}} \frac{r^*}{1 - p^* z^{-1}} \frac{b_0 b_1 z^{-1}}{1 a_1 z^{-1} a_2 z^{-2}}1−pz−1r​1−p∗z−1r∗​1a1​z−1a2​z−2b0​b1​z−1​其中系数由留数和极点直接计算b 0 r r ∗ 2 Re ( r ) b_0 r r^* 2\text{Re}(r)b0​rr∗2Re(r)b 1 − ( r p ∗ r ∗ p ) − 2 Re ( r ⋅ p ∗ ) b_1 -(r p^* r^* p) -2\text{Re}(r \cdot p^*)b1​−(rp∗r∗p)−2Re(r⋅p∗)a 1 − ( p p ∗ ) − 2 Re ( p ) a_1 -(p p^*) -2\text{Re}(p)a1​−(pp∗)−2Re(p)a 2 p ⋅ p ∗ ∣ p ∣ 2 a_2 p \cdot p^* |p|^2a2​p⋅p∗∣p∣2对于实数极点p pp留数为r rr保留一阶节r 1 − p z − 1 ⇒ 分子 [ r , 0 ] , 分母 [ 1 , − p , 0 ] \frac{r}{1 - p z^{-1}} \quad \Rightarrow \quad \text{分子 }[r,\ 0], \quad \text{分母 }[1,\ -p,\ 0]1−pz−1r​⇒分子[r,0],分母[1,−p,0]并联型的优点各支路极点独立误差互不传播适合并行计算多核/GPU可单独调整特定极点如陷波器。2. 原始dir2par.m的致命缺陷已被废弃原代码流程调用residuez获取留数r、极点p、多项式C。用cplxpair对极点排序并用cplxcomp映射留数。根据N奇偶性用循环配对共轭极点并对每对再次调用residuez合并。错误点循环for i1:2:N-2漏掉了最后两个极点当N NN为偶数时。奇数阶时最后一个实数极点被完全丢弃。二次调用residuez合并共轭对属于多余操作且容易引入数值误差。因此该函数仅对无实极点的偶数阶系统勉强可用其余情况均会丢失极点。请勿在生产代码中使用原版。3. 修正版dir2par_fixed.m—— 支持任意极点我们重写了一个健壮的通用函数直接利用闭合公式合并共轭对并正确处理实数极点。function[C,B,A]dir2par_fixed(b,a)% 直接型转并联型通用修正版% 输入b, a - 直接型系数a(1) 通常为 1% 输出C - 多项式部分FIR部分% B - Kx2 矩阵每行为分子 [b0, b1]% A - Kx3 矩阵每行为分母 [1, a1, a2]二阶节或 [1, a1, 0]一阶节% 1. 部分分式展开[r,p,C]residuez(b,a);% 2. 按极点的实部排序便于将共轭对聚在一起[p_sorted,idx]sort(real(p));r_sortedr(idx);% 3. 初始化B[];A[];% 4. 遍历所有极点i1;tol1e-8;whileilength(p_sorted)% 检查是否与下一个极点构成共轭对ifilength(p_sorted)...abs(imag(p_sorted(i)))tol...abs(p_sorted(i)-conj(p_sorted(i1)))tol% 提取共轭对p1p_sorted(i);p2p_sorted(i1);r1r_sorted(i);r2r_sorted(i1);% 合并公式b0r1r2;b1-(r1*p2r2*p1);a1-(p1p2);a2p1*p2;B[B;real([b0,b1])];A[A;real([1,a1,a2])];ii2;% 跳过已处理的两个极点else% 实数极点或未配对的复数极少出现p0p_sorted(i);r0r_sorted(i);B[B;real([r0,0])];A[A;real([1,-p0,0])];ii1;endendifisempty(C)C[];endend关键改进不再依赖cplxcomp和二次residuez。直接使用解析公式运算高效且数值稳定。实极点生成一阶节分母第三项为 0完整保留所有极点。4. 反向转换par2dir.m无需修改并联型转直接型利用residuez反向合并它是通用的原版代码正确function[b,a]par2dir(C,B,A)[K,L]size(A);R[];P[];fori1:1:K[r,p,k]residuez(B(i,:),A(i,:));R[R;r];P[P;p];end[b,a]residuez(R,P,C);bb(:); a a(:);它逐个提取每个子节的留数和极点再整体合并能正确处理任何结构。5. 验证修正版 —— 含实数极点和复数极点的混合系统构造一个三阶系统分母有实根0.5 0.50.5和一对共轭复根0.8 e ± j π / 4 0.8e^{\pm j\pi/4}0.8e±jπ/4% 分母多项式 (1 - 0.5z^-1)(1 - 1.1314z^-1 0.64z^-2)aconv([1,-0.5],[1,-1.1314,0.64]);b1;% 使用修正版转换[C,B,A]dir2par_fixed(b,a);% 转回直接型[b2,a2]par2dir(C,B,A);% 比较disp(原始分母 a:);disp(a);disp(还原分母 a2:);disp(a2);fprintf(最大误差%e\n,max(abs(a-a2)));输出误差应在10 − 15 10^{-15}10−15量级证明转换完全可逆且没有丢失任何极点。6. 并联型滤波实现parfiltr.m的正确使用parfiltr.m本身逻辑正确它并行处理每个子节并对输出求和。但前提是B和A必须由dir2par_fixed生成否则若实极点丢失滤波结果必然错误。yparfiltr(C,B,A,x);其中C可为空即[]表示无多项式部分。7. 并联型与级联型的工程选型对比特性级联型乘积并联型求和稳定性各节独立整体稳定当且仅当每节稳定同左误差传播误差沿链累积各支路独立误差不传播硬件实现串行处理并行处理系数动态范围较小通常可能较大留数可能很大适用性所有有理系统所有有理系统修正版已支持对于定点实现并联型由于支路独立对系数量化误差的鲁棒性稍优于级联型但级联型在串行流水线中更节省资源。最新代码包含修正版及全部函数点击下载下篇预告级联型与并联型滤波器的实际实现含代码验证。我们将使用casfiltr.m和修正后的parfiltr配合正确转换对比直接型滤波的数值表现并通过一个高阶椭圆滤波器的案例展示结构稳定性的优势。敬请期待