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

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

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi