工控常用滤波方法(限幅+中值+算术平均+滑动平均)

2024-09-05 09:12

本文主要是介绍工控常用滤波方法(限幅+中值+算术平均+滑动平均),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工控常用滤波方法

  • 简介
  • 限幅滤波法
  • 中值滤波法
  • 算术平均滤波法
  • 滑动平均滤波

简介

在实际的工程应用中,实际反馈的信号由于是通过电压及电流转换而来的数字量信号,在现场可能会受到比较大的干扰问题,这样的扰动会影响控制系统的输出精度,也会使其产生比较大的偏差。

故在实际应用中,通常不会直接将反馈的信号作为信号输入,会在之前加一个滤波器以使数据更平滑,在此,非常有必要引入数字滤波的概念。

常用的滤波方法有很多,如限幅滤波法、中值滤波法、算术平均值滤波法及滑动平均滤波法。

限幅滤波法

由于被测对象的惯性导致实际采样值的变化速率有限;但由于采样电路的误差和电磁干扰会造成采样值的起伏,又由于起伏频率比较高,因此可以通过数字滤波消除。

对很多实际应用来说,相邻两次采样值之差△Y是不可能超过某一定值的,因为任何物理量变化都需要一定时间,因此当 △Y大于某一定值时,可以判断测量值肯定是某种原因引起的干扰,应将其去掉,用上一次的采样值来代替本次采样值,即Y(i)=Y(i-1)。这就是限幅滤波的原理,可用公式表示为:

|Y(i)-Y(i-1)|≤△Ymax ——则Y(i)=Y(i)
|Y(i)-Y(i-1)|>△Ymax ——则Y(i)=Y(i-1)
———————————————————
Y(i)——第i次采样值;
Y(i-1)——第i-1次采样值;
△Ymax——相邻两次采样值最大可能偏差。

在这里插入图片描述

程序内容如下:

#Time(IN := NOT #Time.Q,PT := #SamplingPeriod);IF #Time.Q THENIF ABS_REAL(IN := #Data_Input - #Data_Max) <= #Data_Max THEN#Data_Output := #Data_Input;ELSE#Data_Output := #Data_Mid;END_IF;#Data_Mid := #Data_Input;
END_IF;

中值滤波法

中值滤波是把 N次采样值大小顺序排列,然后取中值作为周期采样的一种滤波方法。这种滤波方法非常适合于变量变化缓慢的场合删除偶然干扰。
可用公式表示为:

Y(i)=Mid(x1,x2,x3…xn)
——————————————
Y(i)——周期采样值;
xl,x2,xn——周期内的n次采样值,一般取n为奇数;
Mid——取 xl,x2,……,xn 的中间值。

中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,对温度、液位的变化缓慢的被测参数有良好的滤波效果,使之不被模糊。

这些优良特性是线性滤波方法所不具有的。其缺点是对流量、速度等快速变化的参数不宜

中值滤波法涉及到排序算法,即把收集到的N个信号排序,如果使用的是传统PLC,大量的运算会延长PLC扫描周期,采样的数据量不宜过多。软PLC性能较强,可以适当增大数据量进行操作。

程序如下图:

在这里插入图片描述
在这里插入图片描述

#Time(IN := NOT #Time.Q,PT := #SamplingPeriod);//每一个扫描周期采集一次数据,采集满十次之后取中值
IF #Time.Q AND #Number <= 10 THEN#DataMid[#Number] := #Data_Input;#Number := #Number + 1;
END_IF;IF #Number >= 11 THEN//冒泡排序FOR #i := 0 TO 9 BY 1 DOFOR #j := 1 TO 10-#i BY 1 DOIF #DataMid[#j - 1] > #DataMid[#j] THEN#Temp := #DataMid[#j - 1];#DataMid[#j - 1] := #DataMid[#j];#DataMid[#j] := #Temp;END_IF;END_FOR;END_FOR;//取中值输出#Data_Output:=#DataMid[5];#Number := 1;
END_IF;

算术平均滤波法

在模拟量接口单元中一般都配备了求算术平均值的功能,但由于这些接口单元采样时间较快(通常是毫秒级的),而且采样时间不能调整,因此对于一些采样时间较长的场合而言,仍然需要编程求平均值。
对于一些存在周期干扰的过程,也可以采用算术平均值的方法进行平滑滤波,其公式为:

Y(i)=(x1,x2,x3…xn)/N
——————————————
Y(i)——算术平均值;
xl,x2,xn——周期内的N次采样值;

从式中可以看出,算术平均值就是在一定的采样周期内进行次采样,然后将 N次采样相加再除以 N得到的平均值,将这个平均值作为该周期的最后测量结果。实现次算法的程序相对容易实现,其程序流程图如图。

在这里插入图片描述

#Time(IN := NOT #Time.Q,PT := #SamplingPeriod);//每一个扫描周期采集一次数据,采集满十次之后取中值
IF #Time.Q AND #Number <= 10 THEN#DataMid[#Number] := #Data_Input;#Number := #Number + 1;
END_IF;IF #Number >= 11 THEN#Data_Output := (#DataMid[0]+#DataMid[1]+#DataMid[2]+#DataMid[3]+#DataMid[4]+#DataMid[5]+#DataMid[6]+#DataMid[7]+#DataMid[8]+#DataMid[9]+#DataMid[10])/11;#Number := 1;
END_IF;

滑动平均滤波

在算术平均值滤波或加权平均值滤波中,必须采样N次动作作为一个采样周期,这样采样速度慢不适合某些变量变化较快的场合。
为了克服这个缺点,可以在存储器中设一个N个变量的缓冲区,每次采样去最旧的一个数据,加一个最新的数据,然后再进行算术平均值滤波或加权平均值滤波,
显然,每采样一次就可得到一个采样周期值,这样方法称为滑动平均值滤波。

这里以算术平均值作演示。

在这里插入图片描述

#Time(IN := NOT #Time.Q,PT := #SamplingPeriod);//每一个扫描周期采集一次数据,采集满十次之后取中值IF #Time.Q THEN//移位,把第11位去除FOR #i := 10 TO 1 BY -1 DO#DataMid[#i] := #DataMid[#i - 9];END_FOR;//把第一位赋最新值#DataMid[0] := #Data_Input;//输出滤波值#Data_Output := (#DataMid[0] + #DataMid[1] + #DataMid[2] + #DataMid[3]+ #DataMid[4] + #DataMid[5] + #DataMid[6] + #DataMid[7] + #DataMid[8]+ #DataMid[9] + #DataMid[10]) / 11;
END_IF;

这篇关于工控常用滤波方法(限幅+中值+算术平均+滑动平均)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138533

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法