滑动平均滤波0.7z
背景:以前帮一哥们做的小项目,最近提出要加一路模拟量传感器,测量流动的溶液内部特定离子的浓度,数字波动比较大,采样时间比较长,小众化的应用,供应商是成套卖,专用主机加上几个传感器一起卖,主机内部通过专用模块配合软件处理滤波,这里只要一个传感器,成套主机和单买传感器的成本出入太大,因此想在PLC内部通过程序达到一定的滤波效果。
方案设想:在论坛上查找通读了一些相关帖子,初步的方法是,权重递推(一阶滤波),限幅,滑动平均值。
一,采样,将采样值进行工程量转化(按0.0-1.0进行标准化),
二,和上次的一阶滤波值进行比较,使用工程量绝对比较,更新本次采样的一阶滤波值。
三,上一步比较,超出限幅值,舍去本次采样值;未超出,和前面的采样值求平均值,并输出。
特殊说明:对于第二三步,超出限幅值的采样,依然进行一阶滤波,主要是考虑采样间隔较长时,信号产生真实的较大变化,比如插头拔插,当插头拔出,信号变0后,重新插上信号恢复到0.9,在前一次采样为0,后一次采样为0.9,并且持续为0.9,通过限幅前几次的采样值舍去,后几次即进入均值计算。
程序实现:
输入参数:工程量转化的参考范围(比如5530--27648) INT
采样数据源 INT
限幅值 REAL (0.0-1.0)
一阶滤波权重 REAL (0.0-1.0)
滤波次数(求平均值的样本数) BYTE
计算缓存地址 &地址指针 DWORD
输出参数:计算值输出 (和源数据类型一致) INT
权重递推(一阶滤波),Y(0)=(1-a)*Y(-1)+a*X(0)
均值计算,使用自带的表指令(最大支持100个INT数据),加上一个和值存储。滤波次数即为表最大容量。
采样后,FIFO,推出最早一次采样值,它用去减和值;然后新采样值添表,并用新采样值加和值;和值除以样本数,形成平均值,输出。
除计算缓存地址外,各输入参数可以运行时修改,便于现场测试。
当滤波次数(样本数)修改时,即表的最大容量修改,从小改大,新数据依次添入;
从大改小时,在新值添表之前,将表已存数据量(元素数量)设置为表容量,进行FIFO ,推出最早一次采样值,它用去减和值,直到表的元素数量等于滤波次数,然后将滤波次数赋值为表容量,随后按正常添表计算。
测试:
条件有限,不能实物测试,通过BITIM,取当前运行时间毫秒数,分别取低10位(1023)和低8位(255)当做数据源,每周期采样。
取低8位的监控图:
取低10位的监控图:
认知有限,还请众侠指点!