IIR(递归)低通滤波器(First Order Low Pass Filter),也叫指数滑动平均滤波(Exponential Moving Average Filter)。
void setAiFilter(UNSIGNED16 tf) { if(tf == 0 || tf == m_aiFilt.ts) m_aiFilt.wk = 0; else m_aiFilt.wk = (UNSIGNED16)((m_aiFilt.ts<<16)/tf); }
setAiFilter 设置滤波时间,假设单位为ms,tf=1时,即为1ms滤波,m_aiFilt.ts为采样读取时间,m_aiFilt.ts=1时,模拟量的采样周期为1ms。
=1时,就是1ms的采样后读取周期。当滤波器在“无滤波”(tf=0)或“滤波时间等于采样周期”时,直接输出原始值,不做平滑处理。这里左移16位(m_aiFilt.ts << 16)的作用是为了实现定点数的高精度运算。
UNSIGNED16 aiFilter(UNSIGNED16 val) { if(m_aiFilt.wk != 0) { m_aiFilt.DATA.dword += (SIGNED16)((SIGNED16)val - (SIGNED16)m_aiFilt.DATA.word.wh)*(SIGNED32)m_aiFilt.wk; } else { m_aiFilt.DATA.word.wh = val; } return m_aiFilt.DATA.word.wh; }
aiFilter函数1ms调用一次,无需滤波是,直接输出采样值。
由于C语言/嵌入式系统中常用整数运算来代替浮点数,左移16位相当于把 m_aiFilt.ts 乘以2的16次,把小数部分“放大”到整数的高位,实现定点小数的精度。
后续在滤波计算时,wk 作为系数参与乘法,最后的累加结果再通过数据结构的高/低位访问,实现“除以2的16次”的效果,得到实际的滤波输出。
union { SIGNED32 dword; struct { UNSIGNED16 wl; UNSIGNED16 wh; }word; }DATA;
滤波数据定义的结构体。把数据放大2的16次,高2个字节用于存储最终的输出值。
微信搜索“Kconfig”,获取支持...

浙公网安备 33010602011771号