本帖最后由 highgear 于 2010-7-28 10:08 编辑
这个帖子通过讲解 rc 滤波器的设计过程, 可以学会如何设计一个迭代的数字滤波器。今后可以举一反三, 对于其他高阶的 iir 滤波器也不至于手足无措了。
数字滤波器在 mcu 应该经常被用到,在whlz58 同学的帖子里(https://bbs.21ic.com/viewthread.php?tid=170880&highlight=%E7%AE%97%E6%B3%95), whlz58同学提出了一个非常简洁的算法,这个算法来自于whlz58自己的经验总结,非常难得。我想从理论方面简单的讨论一下数字滤波器的设计,就以大家熟悉的 RC 滤波电路为例, 从理论到实践,为大家以后设计提供一点参考。
(1)由微分方程得到迭代公式
RC滤波电路很简单,就不给出电路图了。假设输入为Vi, 输出为Vo, 那么电流为:
i = C * dVo/dt
可以得到
Vo = Vi – R* I = Vi – RC * Vo/dt
整理后,可得输入与输出的微分方程:
Vo – RC * dVo/dt = Vi
假设我们的系统的采样时间为T, 具体说,设定一个时间为T 的定时中断,每次用AD 采样一个输入 x; 我们可以把微分方程化成差分方程:
由于 dy/dt -- (y(k+1) – y(k))/ T
则 Vo – RC * dVo/dt = Vi, 成为:
y – (RC/T) * ((y(k+1) – y(k)) = x(k)
令 a = RC/T, b = T/RC, 可得:
a*y(k+1) = a*y(k) – y(k) + x(k) 或者 y(k+1) = y(k) – b*y(k) + b*x(k)
上面的两个公式,关系到应用时的滤波器增益问题,后面再说。
分析:可以看出,上述公式必须保证 1-b > 0 才能成立,也就是说, 必须保证 T > RC.
(2) 由传递函数得到迭代公式
很多简单的滤波器都可以找到微分方程, 但是复杂一些的滤波器用微分方程描述就令人头痛了。这时候,使用laplace 的传递函数,就很有必要了,而且基本上,高阶的滤波器如车你雪夫等等,都是以传递函数函数形式存在的。我们知道,RC 电路突然加电DC,Vo 输出是一个指数函数:
vo(t) = Vdc – Vdc* e^(t/RC)
其实, 这是RC的阶越响应。RC的冲击响应是
v(t) = e^(t/RC)
冲击响应就是滤波器的内核(kernel), 实际上,传递函数函数就是一个系统的冲击响应。
我们来看看最简单的指数函数的传递函数:
f = 1/(s + 1/RC)
这个是RC滤波器的传递函数, 而且忽略了增益问题。我们可以用很多种方法把它转化成离散的 z 变换方程,学过数值算法的同学应该知道数值积分的方法吧, 其中,最简单的是欧拉公式:
y(k+1) = y(k) + x(k) * T
(未完) |