首先来看一个最简单的一阶低通滤波器的电路模型:
不难推出它的传递函数:
Tf与滤波器截止频率有关,但是实际程序中会变成一个参数,此时我们可以忽略它。
然而!我们的stm32接收到的信号是一串序列(离散信号),上面的公式是连续系统下的低通滤波器传递函数,还不能直接拿来编程ヽ(ー_ー)ノ,所以——让我们回忆一下《数字信号处理》课上连续系统离散化的内容,后向差分变换法:
T:采样周期,同上面的Tf,最后都会融入一个可调的参数,忽略之。
离散化后:
很显然α范围是0~1,逆z变换,取得可用于编程的时域离散方程:
这是一个一阶IIR滤波器。
C语言:(有用的功能往往只需要最简单的代码)
//一阶低通滤波,alpha范围0~1
y = alpha*x + (1-alpha)*last_y;
last_y = y;
好了此贴结束——————————————————————————————
(还是稍微贴一个小应用吧,近期垃圾小毕设,各位大佬轻喷orz)
(来回移动模拟图里那个盒子观察所测Echo脚高电平时间jscope波形 )
//下降沿时间T2
t2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
t2 += tim_overflow_counter * (htim->Init.Period); //定时器溢出中断
high_level_us = t2 - t1; //高电平持续时间 = 下降沿时间点 - 上升沿时间点//低通滤波
t = a*high_level_us + (1-a)*last_t;
last_t = t;
超声测距模块,用stm32定时器捕获实现测距,滤波器的参数调了一个大概,α=0.2,获取到的高电平时间jscope波形图如下:
蓝线----滤波前输入;黄线----滤波后输出;绿线----上次输出
直接上图分析,黄线基本跟随绿线,黄线比蓝线平滑地多而且几处尖峰脉冲被抑制,很明显滤波器可以较好地抑制输入噪声和减小突变量对输出的影响;同时可以看到输出波形相较输入波形有一个明显的滞后(当α值调小时滞后现象会更明显,反之调大则会减缓滞后现象但同时噪声抑制能力下降,如下)
α=0.5
黄线基本跟蓝线重合
α=0.01
输出平滑是非常平滑了,这输出和响应是真离了大谱了
因此一阶低通滤波器会造成输出滞后,而且动态性能和稳定性二者不可得兼——凑合着调吧,一阶滤波器要啥自行车。
菜鸡考研途中闲来之举,文中错误欢迎各位大佬批评指正。