1. 项目概述
在嵌入式信号处理领域,IIR(无限脉冲响应)滤波器因其高效的计算特性和优异的频率选择性能而广受欢迎。最近我在一个工业传感器项目中遇到了工频干扰问题,需要在STM32平台上实现50Hz带阻滤波器。经过反复验证,最终采用直接II型结构的巴特沃斯滤波器方案,不仅满足了实时性要求,滤波效果也相当出色。
巴特沃斯滤波器的最大特点是具有最大平坦的通带特性,特别适合需要保持通带信号不失真的应用场景。相比FIR滤波器,IIR滤波器可以用较低的阶数实现陡峭的过渡带,这对资源有限的嵌入式系统尤为重要。下面我将分享从理论推导到STM32实现的完整过程,包括关键代码解析和实际部署中的避坑经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 滤波器设计与理论基础
2.1 巴特沃斯滤波器特性分析
巴特沃斯滤波器的幅度响应在通带内最为平坦,其传递函数表示为:
|H(ω)|² = 1 / [1 + (ω/ωc)^(2n)]
其中n为滤波器阶数,ωc为截止频率。这种设计使得:
- 通带内没有纹波(与切比雪夫滤波器对比)
- 过渡带相对平缓(与椭圆滤波器对比)
- 相位非线性程度适中
在工频干扰抑制场景中,我们通常需要阻带中心频率为50Hz(或60Hz),带宽约4-10Hz。通过MATLAB的butter函数可以方便地生成所需系数,例如8阶巴特沃斯带阻滤波器在48-52Hz范围内的衰减可达40dB以上。
2.2 直接II型结构优势
IIR滤波器有多种实现结构,包括:
- 直接I型:直观但需要双倍延迟单元
- 直接II型:最小延迟结构(本文采用)
- 级联型:更好的数值稳定性
- 并联型:适合多频段处理
直接II型结构将差分方程分解为两个部分:
- 递归部分(极点):计算中间变量wn
- 非递归部分(零点):生成最终输出
其内存效率最高,仅需N个延迟单元(N为滤波器阶数)。对于STM32这类资源受限的MCU,这种结构能显著减少RAM占用和计算量。
3. STM32实现详解
3.1 滤波器数据结构设计
c复制typedef struct {
float a[3]; // 分母系数 a[0]通常为1
float b[3]; // 分子系数
float w[2]; // 延迟寄存器
} IIR_BS_Filter;
