3. 数字滤波器基础:数字滤波器的分类(FIR与IIR)、差分方程与系统函数、Z变换基础
各位同学,咱们今天聊点硬核的——数字滤波器。说实话,我刚入行那会儿,觉得滤波器不就是把不要的频率滤掉嘛,有啥好学的?直到我在现场调试一套微机保护装置,被一个50Hz的工频干扰折腾了三天三夜……嗯,从那以后,我再也不敢小看数字滤波器了。
这一节,咱们把数字滤波器的底裤扒干净。我会从最基础的分类讲起,然后深入到差分方程、系统函数,最后聊聊Z变换。别怕,我会用最接地气的方式讲。
3.1 数字滤波器的两大阵营:FIR与IIR
数字滤波器分两类:FIR(有限脉冲响应)和IIR(无限脉冲响应)。说白了,就是一个记性好,一个记性差。
- FIR滤波器:你给它一个脉冲,它响一阵子就停了,不会没完没了。它的输出只取决于当前和过去的输入,不依赖过去的输出。
- IIR滤波器:你给它一个脉冲,它可能一直响下去,因为它的输出不仅依赖输入,还依赖过去的输出——相当于自己给自己“续命”。
我在项目中遇到过这样一个坑:用IIR滤波器做低通滤波,结果相位特性搞得一塌糊涂,保护算法的动作时间直接超标。后来换成FIR,虽然计算量大一点,但相位线性,问题迎刃而解。
核心区别一句话总结:
- FIR:无反馈,稳定,线性相位,但计算量大
- IIR:有反馈,可能不稳定,非线性相位,但计算量小
3.2 差分方程——滤波器的“数学骨架”
数字滤波器在数学上怎么描述?靠差分方程。你想想看,一个离散系统,输入是x[n],输出是y[n],它们之间的关系就是差分方程。
对于一般的N阶数字滤波器,差分方程长这样:
y[n] = b0*x[n] + b1*x[n-1] + ... + bM*x[n-M]
- a1*y[n-1] - a2*y[n-2] - ... - aN*y[n-N]
注意看:
- 等号右边前半部分:只跟输入有关——这是FIR部分
- 等号右边后半部分:跟过去的输出有关——这是IIR部分
如果所有a系数都是0,那就是纯FIR滤波器。只要有一个a系数非零,就是IIR。
我的小经验:写代码实现差分方程时,一定要小心索引越界。我曾经在DSP上跑一个IIR滤波器,因为数组下标没处理好,结果跑飞了,保护装置直接误动。从那以后,我写差分方程代码必加边界检查。
3.3 系统函数——从时域到频域的桥梁
差分方程是时域的描述,但咱们做电力系统保护的,更关心频域特性——比如50Hz的基波能通过多少?100Hz的谐波被衰减了多少?这时候就需要系统函数了。
系统函数H(z)的定义很简单:输出Z变换除以输入Z变换。
H(z) = Y(z) / X(z)
从差分方程可以直接写出系统函数:
H(z) = (b0 + b1*z^(-1) + ... + bM*z^(-M))
/ (1 + a1*z^(-1) + ... + aN*z^(-N))
你看,分子对应输入部分,分母对应输出反馈部分。分母的根叫极点,分子的根叫零点。极点的位置决定了滤波器的稳定性——所有极点必须在单位圆内,否则滤波器会振荡甚至发散。
避坑指南:我曾经设计一个带通滤波器,极点刚好压在单位圆上。仿真时看着没问题,一上实际硬件,量化误差把极点推出单位圆,滤波器直接炸了。所以,设计IIR滤波器时,一定要留足稳定裕量。
3.4 Z变换基础——离散系统的“瑞士军刀”
Z变换是分析离散系统的利器。说白了,它就是把离散序列映射到复平面上的一个工具。
定义式:
X(z) = Σ x[n] * z^(-n) (n从负无穷到正无穷)
实际中我们常用的是单边Z变换(n从0开始),因为因果系统只关心当前和过去。
几个常用序列的Z变换,我建议你背下来:
| 序列 x[n] | Z变换 X(z) | 收敛域 |
|---|---|---|
| δ[n](单位脉冲) | 1 | 整个z平面 |
| u[n](单位阶跃) | 1 / (1 - z^(-1)) | |z| > 1 |
| a^n * u[n] | 1 / (1 - a*z^(-1)) | |z| > |a| |
Z变换最重要的性质是移位性质:
Z{x[n-k]} = z^(-k) * X(z)
这个性质直接把差分方程变成了代数方程——这就是为什么我们能从差分方程直接写出系统函数。
为什么Z变换这么重要?
因为有了Z变换,我们可以:
- 把差分方程变成代数方程,求解变得简单
- 从系统函数直接看出频率响应(令z = e^(jω))
- 分析系统的稳定性和因果性
3.5 实战:一个简单的FIR低通滤波器
光说不练假把式。咱们用Z变换设计一个最简单的FIR低通滤波器——移动平均滤波器。
差分方程:
y[n] = (x[n] + x[n-1] + x[n-2] + x[n-3]) / 4
系统函数:
H(z) = (1 + z^(-1) + z^(-2) + z^(-3)) / 4
令z = e^(jω),得到频率响应:
H(e^(jω)) = (1 + e^(-jω) + e^(-j2ω) + e^(-j3ω)) / 4
这个滤波器能滤掉高频分量,保留低频。在电力系统保护中,我经常用它来做前置滤波,先把采样数据中的毛刺去掉,再送给后面的算法处理。
我的建议:初学者先从FIR滤波器入手,因为稳定、好理解。等你把FIR玩熟了,再碰IIR。IIR虽然效率高,但坑也多——稳定性、相位失真、有限字长效应,哪个都能让你头疼好几天。
好了,这一节的内容就到这儿。数字滤波器是微机保护算法的基石,后面的章节我们会反复用到这些概念。下一节,咱们聊聊如何用这些滤波器来提取基波分量——这可是距离保护、过流保护的核心。
记住:理论要扎实,动手要谨慎。我在现场见过太多因为滤波器设计不当导致的保护误动或拒动事故了。希望你们学完这节,能少走一些弯路。