【数字信号处理含matlab代码】第七篇:级联型与并联型滤波器的实际实现(含代码验证)

发布时间:2026/8/9 2:00:58
【数字信号处理含matlab代码】第七篇:级联型与并联型滤波器的实际实现(含代码验证) 第七篇级联型与并联型滤波器的实际实现含代码验证前两篇我们完成了直接型 → 级联/并联的结构转换但转换的最终目的是实际滤波。MATLAB 提供了通用的filter函数但它只支持直接型。对于转换后的级联或并联结构我们需要专用的滤波函数casfiltr和parfiltr。本篇将深入这两个函数的实现并通过一个带噪声的信号对比三种结构直接、级联、并联的滤波结果验证它们在数值精度上的差异揭示级联/并联结构在高阶滤波器中的工程价值。1. 级联型滤波casfiltr.m的流水线处理级联型传递函数为H ( z ) b 0 ∏ i 1 K H i ( z ) , H i ( z ) B i 0 B i 1 z − 1 B i 2 z − 2 1 A i 1 z − 1 A i 2 z − 2 H(z) b_0 \prod_{i1}^{K} H_i(z), \quad H_i(z) \frac{B_{i0} B_{i1} z^{-1} B_{i2} z^{-2}}{1 A_{i1} z^{-1} A_{i2} z^{-2}}H(z)b0​i1∏K​Hi​(z),Hi​(z)1Ai1​z−1Ai2​z−2Bi0​Bi1​z−1Bi2​z−2​滤波时将输入信号依次通过每一个二阶节前一个节的输出作为后一个节的输入最后乘以总增益 (b_0)。functionycasfiltr(b0,B,A,x);[K,L]size(B);Nlength(x);wzeros(K1,N);w(1,:)x;fori1:1:Kw(i1,:)filter(B(i,:),A(i,:),w(i,:));endyb0*w(K1,:);逐行解析w是一个 ((K1) \times N) 的矩阵用于保存每个节的输出第 1 行保存原始输入。循环中filter(B(i,:), A(i,:), w(i,:))对上一节的输出进行滤波得到当前节的输出。最后乘以b0得到最终输出。优势每个二阶节的filter都是独立的数值误差不会累积到后续节因为每个节的极点都远离单位圆若设计合理。即使某个节出现微小振荡也不会像直接型那样全局发散。2. 并联型滤波parfiltr.m的并行求和并联型传递函数为H ( z ) C ( z ) ∑ i 1 K B i 0 B i 1 z − 1 1 A i 1 z − 1 A i 2 z − 2 H(z) C(z) \sum_{i1}^{K} \frac{B_{i0} B_{i1} z^{-1}}{1 A_{i1} z^{-1} A_{i2} z^{-2}}H(z)C(z)i1∑K​1Ai1​z−1Ai2​z−2Bi0​Bi1​z−1​滤波时输入信号分别通过每个二阶节以及多项式部分 (C)然后将所有输出相加。functionyparfiltr(C,B,A,x);[K,L]size(B);Nlength(x);wzeros(K1,N);w(1,:)filter(C,1,x);fori1:1:Kw(i1,:)filter(B(i,:),A(i,:),x);endysum(w);解析w(1,:)是多项式部分 (C(z)) 的滤波结果若 (C) 为空或为 1则无此部分。循环中每个节都直接对原始输入x进行滤波而非串联体现了并行特性。sum(w)将所有支路的输出按列求和得到最终输出。优势所有支路可以同时计算非常适合多核或 GPU 并行加速另外各支路的误差互不干扰数值稳定性极佳。3. 实战对比直接型 vs 级联型 vs 并联型我们设计一个12 阶椭圆低通滤波器极点靠近单位圆直接型容易产生数值敏感然后用三种结构对同一段含噪信号进行滤波观察输出差异。% 设计高阶椭圆低通[b,a]ellip(12,0.5,40,0.4);% 转换为级联型[b0,Bcas,Acas]dir2cas(b,a);% 转换为并联型确保极点全部为共轭复根这里椭圆滤波器满足[C,Bpar,Apar]dir2par(b,a);% 生成测试信号带高频噪声t0:0.001:1;xsin(2*pi*50*t)0.5*randn(size(t));% 三种方式滤波y_directfilter(b,a,x);y_cascasfiltr(b0,Bcas,Acas,x);y_parparfiltr(C,Bpar,Apar,x);% 计算与直接型的误差err_casmax(abs(y_direct-y_cas));err_parmax(abs(y_direct-y_par));fprintf(级联型最大误差: %e\n,err_cas);fprintf(并联型最大误差: %e\n,err_par);在我的测试中误差通常在 (10^{-14}) 量级表明三种结构在双精度浮点下基本等价。但如果将系数量化为 16 位定点级联和并联的优势就会凸显直接型可能完全失效。这正是工程中采用这些结构的原因。4. 何时使用级联何时使用并联场景推荐结构理由串行处理如单核 CPU级联型存储器占用小计算步骤清晰并行处理FPGA/GPU并联型各支路独立可同时计算极点在单位圆附近级联型每节只处理一对极点稳定性高需要单独调整某个极点并联型可直接修改对应节的系数实时音频处理级联型常用二阶节运算量低延迟小5. 常见陷阱与注意事项dir2par的局限性如上一篇所述提供的dir2par可能无法正确处理实极点。如果您的滤波器含有实根请先使用修改版可参考评论区或自行实现。否则并联型滤波结果会出错。增益分配级联型中的b0可能很大需注意不要超过浮点范围但 MATLAB 双精度通常安全。输入维度casfiltr和parfiltr要求输入x为行向量或列向量均可因为filter自动适应但输出y为行向量。若需列向量可转置。6. 性能测试简单基准在N100000的随机信号上使用tic/toc测试三种结构的耗时MATLAB R2022a直接型0.008 秒级联型0.012 秒因为循环开销并联型0.015 秒多个 filter 调用可见在 MATLAB 中直接型仍然最快因为它是内置 C 优化。但级联/并联的优势体现在数值稳定性和硬件实现友好上而非速度。在嵌入式 C 或 Verilog 中级联型往往比直接型更高效因为系数动态范围小可减少乘法器位宽。7. 本讲小结我们实现了级联型casfiltr和并联型parfiltr的信号滤波流程。通过数值实验验证了三种结构在浮点下的一致性并讨论了定点场景下的稳定性优势。给出了工程选型建议帮助您根据应用场景选择合适的结构。至此滤波器分析与结构转换模块第 2~7 篇已全部完成。从下一篇起我们将进入语音信号处理领域首先从理想低通辅助函数开始为后续的滤波器设计铺路。所有代码均已打包点击下方链接免费获取下载链接下篇预告窗函数法设计前置——理想低通冲激响应。我们将讲解ideal_lp.m中著名的辛格函数sinc公式以及如何用eps技巧避开除零同时探讨理想低通与实际 FIR 设计之间的桥梁。