做信号处理的同行应该都有这种感觉滤波器这东西看着是入门级的内容真正用好的时候才发现处处是坑。一阶和二阶滤波器几乎贯穿了从传感器数据采集、音频处理到雷达信号处理的每一个环节但很多人对它们的理解停留在“一阶衰减慢二阶衰减快”这个粗糙的层面真到了要选型、算参数、调效果的时候就有点抓瞎了。这篇东西我想把一阶滤波器和二阶滤波器的区别彻底讲透。不只是公式推导更多是结合我自己在嵌入式、雷达信号仿真和工业采集项目里实际用过的场景聊聊它们各自的脾气、适用面以及那些教材里不会写的踩坑经验。不管你是刚入门信号处理的同学还是做工程需要临时补课的开发者这篇文章应该能帮你省下不少试错的时间。1. 一阶与二阶滤波器先搞清楚它们到底差在哪1.1 从传递函数看本质差别要理解一阶和二阶的区别最直接的办法是看它们的传递函数长什么样。一阶低通滤波器最典型的形式是H(s) 1 / (1 s/ωc)其中ωc 2πfc也就是截止角频率。这个式子的特点就是分母里s的最高次数是1所以叫“一阶”。它的幅频响应在高频段以-20dB/十倍频程的速度滚降也就是频率每升高10倍增益掉到原来的1/10。二阶低通滤波器的标准形式则是H(s) ωn² / (s² 2ζωns ωn²)这里ωn是自然角频率ζ是阻尼比。分母里s的最高次数是2幅频响应的高频滚降速度是-40dB/十倍频程。除了滚降速度翻倍二阶系统还多了一个关键参数——阻尼比ζ它直接决定了滤波器在截止频率附近是出现谐振峰还是平缓过渡。很多人觉得“二阶就是比一阶多了一个极点”这话没错但多出来的这个极点带来的不只是衰减变快还有相位延迟变大、阶跃响应可能出现过冲甚至在某些Q值下会产生谐振放大。这些“副作用”恰恰是工程里最容易忽略的地方。1.2 时域响应、频域特性和相位延迟的直观对比光看公式不够直观我把两者在时域和频域上的表现放在一起对比这样更好理解。特性一阶低通二阶低通巴特沃斯/Q≈0.707高频滚降速率-20dB/十倍频程-40dB/十倍频程阶跃响应过冲无过冲单调上升有过冲约4.3%随后衰减振荡相位滞后最大90°180°-3dB截止频率处相位-45°-90°电路元件数无源实现1个R1个C2个R2个C或RLC组合典型设计参数只需定ωc需要定ωn和Q或ζ这里最值得留意的是相位特性。一阶滤波在截止频率处的相位滞后是45°而二阶在同样是-3dB点的地方已经滞后到了90°。如果你的系统对相位敏感比如用在闭环控制回路里做反馈滤波或者用在需要保持波形形状的测量链路上这个差距可能直接决定系统稳不稳定。我举个实际例子。之前做一个电机电流采样滤波一开始用二阶巴特沃斯低通截止频率设在1kHz结果发现电流环相角裕度明显不够系统在某个转速区间开始振荡。后来换成同截止频率的一阶低通虽然高频纹波衰减变差了但相位裕度救回来了系统稳定多了。这就是“阶数不是越高越好”的典型教训。2. 一阶滤波器简单可靠但别指望它“一刀切”2.1 一阶RC低通原理、截止频率计算与元件选型一阶RC低通应该是最经典的模拟滤波器了一个电阻串进去一个电容对地并联输出从电容两端取。它的截止频率公式是fc 1 / (2πRC)这个公式看着简单但实际选元件的时候很容易翻车。第一个坑是源阻抗。如果前级输出阻抗不是零它和R会形成分压等效截止频率会偏移。比如传感器输出阻抗有10kΩ你用一个10kΩ电阻做滤波实际的R变成了20kΩ截止频率比设计值低了整整一倍。第二个坑是负载阻抗。输出端如果你接了一个低阻抗负载比如ADC的采样保持电路在某些模式下输入阻抗只有几十千欧它会和电容形成并联同样影响滤波特性。实操上我一般会让R取几百欧到几十千欧之间C取纳法到微法级别同时确保负载阻抗至少是R的10倍以上。还有一个经常被忽略的点是电容类型。陶瓷电容有直流偏压效应X5R/X7R在额定电压下容量可能掉到标称值的50%以下这会让你辛辛苦苦算好的截止频率直接跑偏。要求高的场合我习惯用C0G电容或者薄膜电容至少容量稳定。2.2 一阶低通滤波的数字化实现从模拟到离散数字一阶低通滤波器几乎无处不在最常见的实现是y[n] y[n-1] α * (x[n] - y[n-1])其中α是滤波系数范围在0到1之间。α越大滤波越“快”响应越灵敏平滑效果越弱α越小平滑效果越强但延迟也越大。α怎么算如果是从模拟滤波器双线性变换映射过来精确公式是α (2πfc/fs) / (2πfc/fs 1)当fc远小于fs时可以近似为α ≈ 2πfc / fs我举个实际代码。假设采样率fs是1000Hz希望截止频率fc是20Hz#define FS 1000.0f #define FC 20.0f float alpha 2.0f * 3.14159265f * FC / (2.0f * 3.14159265f * FC FS); float y 0.0f; float lowpass_one(float x) { y alpha * (x - y); return y; }这段代码是嵌入式里最常见的写法就一个乘法和一个加法处理速度极快。但有个细节要注意如果用的是定点MCUα通常是个小于1的小数需要做Q格式定点化。我之前在STM32上用Q15格式实现把α乘以32768再取整累加过程中要注意中间变量的位宽否则很容易溢出或者精度不足。2.3 一阶滤波器的典型应用场景盘点一阶滤波器在工程里的定位不是“精准切频”而是“打个底”把明显的毛刺和高频噪声先干掉。我总结几个最常见的场景传感器数据平滑。加速度计、陀螺仪、温湿度传感器输出的原始数据通常伴随高频噪声用一阶低通就能获得不错的效果。比如MPU6050的原始加速度数据静止状态下抖动可以达到±0.05g做一个截止频率5Hz的一阶低通抖动直接降到±0.01g以内。PWM转模拟电压。MCU的PWM输出经过一个一阶RC低通可以把占空比信息变成平滑的直流电平。这个场景下截止频率要远低于PWM频率通常取PWM频率的1/10甚至更低才能把纹波压到可接受范围。检波输出平滑。雷达信号处理中目标回波经过包络检波之后会有很多寄生纹波用一阶低通做视频平滑可以在不显著损失目标起伏信息的前提下让检测门限更稳定。控制环路的反馈滤波。就像我前面说的在闭环系统里一阶引入的相位滞后最小适合对稳定性要求高的场合。3. 二阶滤波器更陡的滚降但也要付出代价3.1 二阶低通的核心参数特征频率、阻尼比与Q值二阶低通比一阶复杂的地方在于它要多管一个参数。这里先澄清一下几个容易搞混的概念自然角频率ωn、阻尼比ζ以及品质因数Q。它们的关系是Q 1 / (2ζ)Q值越高阻尼越小滤波器在截止频率附近越容易出现谐振峰。具体来说Q 0.5过阻尼阶跃响应没有过冲但过渡过程比较慢。Q 0.707ζ 0.707临界阻尼附近这就是巴特沃斯响应的Q值幅频特性最平坦没有谐振峰。Q 1欠阻尼截止频率附近有约1.3dB的增益凸起。Q 2谐振峰很明显在截止频率附近信号会被放大可能导致系统不稳定。这就引出了“同样是二阶低通特性却完全不同”的问题。巴特沃斯、贝塞尔、切比雪夫是三种最常见的二阶响应类型类型关键指标特点适用场景巴特沃斯最大平坦幅频无谐振峰滚降均匀常规滤波绝大多数场景贝塞尔最大平坦群延迟相位线性波形保真度好对过冲和相位敏感的信号调理切比雪夫更陡的过渡带通带有纹波群延迟波动大需要更陡滚降但对通带纹波不敏感很多人默认“二阶就是巴特沃斯”其实不对。巴特沃斯只是Q0.707的一个特例。如果你的应用特别在意波形形状比如心电信号、振动信号分析贝塞尔可能更合适代价是滚降速度比巴特沃斯慢。3.2 常见二阶电路实现RLC、Sallen-Key、MFB二阶滤波器的硬件实现主要有三条路RLC无源、Sallen-Key有源和MFB多重反馈有源。RLC无源最直观一个电感加一个电容就能形成二阶。但电感在低频段体积大、损耗大、Q值受限所以实际低频应用里用得不多高频射频电路里倒是很常见。在音频和低频信号处理里有源滤波器是主流。Sallen-Key结构用一个运放和四个无源元件就能实现二阶增益可以任意设置。它的优点是元件少、简单对运放的要求不高。缺点是Q值对元件容差比较敏感高Q设计时容易偏移。MFB结构同样用运放实现但它的增益带宽和Q值的稳定性更好一些适合高Q值的窄带滤波器和陷波器。代价是计算稍微复杂一点反馈电阻的取值要和输入阻抗搭配合理否则容易引入噪声。我个人的习惯是通用低通滤波首选Sallen-Key因为计算简单、调试方便做陷波器或者高Q窄带滤波用MFB更靠谱电路更稳。3.3 二阶滤波器的典型应用场景二阶滤波器的应用场景明显比一阶更“硬核”一些通常是要真正“切除”某些频段而不是简单平滑。ADC抗混叠滤波。采样系统里高于奈奎斯特频率的噪声会折返到低频段必须在前端用滤波器压掉。这里一阶的-20dB/十倍频程往往不够二阶甚至更高阶才是常规选择。音频DAC重建滤波。音频信号在DAC输出后需要进行平滑重建四阶到八阶的巴特沃斯是常见方案。不过如果用二阶起步可以很好地理解整个设计思路。50Hz工频干扰抑制。工业现场采集微弱信号时50Hz工频干扰是个大麻烦。用双T型陷波器本质上是二阶结构的一种变体可以把50Hz附近压掉40dB甚至更多同时不影响其他频段。雷达信号处理中的多普勒滤波。雷达回波的动目标检测需要滤除地杂波等静止目标回波二阶高通或带通滤波器可以用来提取多普勒频移配合MTI动目标显示算法使用。CIC抽取/插值滤波器。在多速率信号处理里CIC滤波器本质上是多个积分器和梳状滤波器的级联其频响特性也是高阶的但设计时常常从二阶的思路来理解它的旁瓣衰减和通带滚降。4. 一阶、二阶还是更高阶选型思路与实操要点4.1 选型决策路径从需求倒推参数面对一个滤波需求先别急着选阶数按下面这几步走基本不会有大偏差。第一步明确要衰减的是哪个频段目标衰减量是多少。比如“1kHz以上的噪声要衰减20dB以上”和“要衰减60dB以上”对应的阶数肯定是不同的。第二步确认系统对延迟和相位是否敏感。如果是闭环控制、波形保真测量优先考虑相位特性好的类型如果只是观察幅值相位问题可以往后放。第三步评估过冲是否可容忍。一阶没有过冲二阶巴特沃斯有过冲但不大切比雪夫过冲更大。如果过冲会造成超调甚至损坏设备那就要慎重。第四步考虑实现成本。模拟电路里每增加一阶至少增加一个RC环节数字滤波器里每增加一阶至少多一个延迟单元和乘法器。一阶能解决的事没必要非上二阶。4.2 截止频率到底怎么定从一个实际例子开始滤波器的参数不可能凭空拍脑袋定。我以一个常见的传感器采集场景来算一笔账。假设有一个压力传感器信号带宽是10HzADC采样率是1kHz传感器和电路引入了20kHz的开关噪声和50Hz的工频干扰。目标是把50Hz以上的噪声至少衰减20dB同时尽量保留10Hz以内的信号。如果用一阶低通要在50Hz处衰减20dB按照-20dB/十倍频程的斜率截止频率需要设在5Hz以下也就是fc≤5Hz。但这样一来10Hz的信号也会被衰减约6dB信号损失有点大。如果改用二阶低通巴特沃斯在50Hz处衰减20dB按照-40dB/十倍频程的斜率截止频率可以设在约22Hz左右。10Hz的信号基本不受影响衰减不到1dB。这就充分体现了二阶的优势同样的截止频率下高阶滤波对阻带之外的信号“保护”得更好。4.3 从MATLAB/fdatool到工程落地系数导出的那些坑做数字滤波器设计我最常用的工具还是MATLAB的filterDesigner老版本叫fdatool。它可以根据你设定的响应类型、阶数、截止频率自动算出系数也能直接导出C头文件。用filterDesigner导出的二阶巴特沃斯低通系数格式一般是b0、b1、b2、a1、a2对应差分方程y[n] b0x[n] b1x[n-1] b2x[n-2] - a1y[n-1] - a2*y[n-2]这里有一个非常常见的坑导出的系数是浮点数而MCU上通常要用定点数。如果你直接把浮点系数四舍五入成短整型滤波器很可能完全失效甚至不稳定。解决方法是做Q格式定点化先确定精度比如Q15然后把系数乘以32768再取整计算过程中用32位中间累加最后右移15位输出。此外还要检查直流增益。MATLAB导出的系数默认直流增益可能是1但如果你手动修改过参数增益偏移会直接影响输出幅值。实操上可以在仿真里先给滤波器输入一个直流信号看输出是否等于输入不等于就说明要做增益归一化。% 用MATLAB设计一个2阶巴特沃斯低通 % 采样率Fs1000Hz截止频率Fc30Hz Fs 1000; Fc 30; [b, a] butter(2, Fc/(Fs/2), low); % 查看系数和频率响应 freqz(b, a, 1024, Fs); % 验证直流增益是否为1 dc_gain sum(b) / sum(a); % 如果dc_gain不等于1需要做增益补偿 b b / dc_gain;5. 常见问题与排查技巧实录5.1 滤波器“没效果”排查很多人调试滤波器时最容易遇到的问题是“我明明加了低通怎么噪声还在”这种时候先别怀疑滤波器本身按这个顺序排查。检查截止频率是否算对。数字滤波器里的频率参数全部要归一化到采样率的一半也就是奈奎斯特频率。如果你把Fc直接填成50Hz而采样率是1000Hz、奈奎斯特频率是500Hz那实际截止频率是50/500×50050Hz不对应该归一化到Fc/(Fs/2)50/5000.1如果误填成50滤波器设计出来就乱了。检查滤波器和信号的连接顺序。数字滤波器如果放在ADC采样之后但前面没有抗混叠滤波高频噪声依然会折叠回低频段这种问题靠数字低通是救不回来的。检查代码里是不是用了整数除法。C语言里面如果写成alpha 6.28 * fc / fs而fc是int型会先做整数除法结果直接变成0滤波器也就等于没加。我见过最离谱的一次同事调一整天滤波都没效果最后发现代码里把滤波器输出没有赋值给原变量计算完直接丢了用的还是未经滤波的原始数据。5.2 延迟大到不能忍滑动窗口、低通延迟的优化思路滤波器的延迟是个老大难问题。滑动平均滤波器均值类滤波器实现简单但延迟和窗口长度直接相关。窗口长度是N延迟大约是(N-1)/2个采样周期。比如采样率1kHz窗口长度100延迟就是49.5ms。这个数值在高速控制场合基本不可接受。一阶低通的群延迟在截止频率处大约等于1/(2πfc)。如果用1Hz的截止频率延迟大约160ms用10Hz截止频率延迟大约16ms。二阶低通的群延迟在截止频率附近更大而且频率越接近截止频率延迟越明显。如果你必须在低延迟下做滤波有几个思路可以试离线处理场景用零相位滤波。MATLAB的filtfilt函数就是先正向滤波再反向滤波相位偏移互相抵消波形零失真但只能在非实时系统用。实时场景选贝塞尔响应。贝塞尔滤波器的设计目标就是最大平坦群延迟虽然滚降慢但波形保真度好。降低截止频率会恶化延迟所以在噪声水平和延迟之间要做平衡。不要为了追求干净波形而把截止频率压到极低延迟可能带来的问题比噪声还致命。5.3 50Hz工频陷波器设计与容差问题工频干扰是数据采集里的老朋友了。双T型陷波器是抑制50Hz的标准方案但它有个致命弱点对元件容差特别敏感。双T陷波器的中心频率由电阻和电容共同决定公式是f0 1 / (2πRC)如果你的R或者C偏离1%中心频率就会偏移约0.5Hz。而50Hz陷波器一般要求带宽只有几个赫兹稍微偏一点实际抑制效果就大打折扣。所以做这种电路电阻要用1%精度的金属膜电阻电容要用C0G或聚丙烯电容最好配对挑选。数字域的陷波器就没有元件漂移的问题但要注意量化噪声和系数精度。一个设计良好的数字IIR陷波器只要系数精度足够抑制效果可以做到非常稳定。我在实际项目中用过自适应陷波器通过LMS算法在线跟踪50Hz的频率漂移效果比固定陷波器好很多适合电网频率不稳的场合。5.4 仿真没问题上板就废数字实现的几个细节最后说一个几乎人人都会遇到的现象滤波器在MATLAB里仿真完美移植到嵌入式设备上就完全不正常。其实原因不外乎这几个采样率不对。晶振偏差、ADC触发方式改成软件触发导致采样不均匀都会让实际采样率偏离设计值滤波器特性随之漂移。信号被截断或者溢出。定点实现中如果输入信号幅值超出ADC量程输出会削波如果中间累加变量位宽不够会出现溢出结果波形变得一团糟。浮点转定点精度不足。DSP库的Q15/Q31格式各有适用范围Q15只有15位小数精度对于窄带高Q值的滤波器来说可能不够会导致中心频率偏移。我自己踩过的坑是用STM32的CMSIS-DSP库做二阶IIR滤波初始化时忘记调用arm_biquad_cascade_df1_init_f32然后滤波器输出全是NaN。查了好久才发现是状态缓冲区的指针没传对。所以移植数字滤波器的时候初始化函数、状态缓冲区对齐、采样率配置这三件事一定逐项检查。最后再分享一点个人经验滤波器这个东西做久了你会形成一种直觉。我现在的习惯是无论接到什么滤波需求先用一阶低通跑一版看波形摸清楚噪声的主要频段和信号的大致带宽再做精细设计。很多时候一阶就已经够了直接上二阶甚至更高阶反而是给自己找麻烦。另外提醒一句滤波器只是信号链路中的一环它不能解决所有问题。布线不合理、接地不良、电源噪声太大这些根源性问题靠滤波器是压不住的。先解决硬件基础再谈滤波算法这个顺序不能反。希望这篇东西能帮你少走一些弯路。
阅读完成 · 觉得有帮助?