常见的简单的单片机数字滤波算法及其C++实现
在现在的控制系统中电路变的越来越复杂,器件相互之间的干扰也越来越强烈,模拟滤波电路已经不能满足了,数字滤波便应运而生了,数字滤波可实现高难度的复杂处理,而且滤波效果好,抗干扰性强,精度可控等诸多优点。单片机的主要作用是控制外围的器件,并实现一定的通讯和数据处理。在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。
下面我们就来看看几种常见的数字滤波技术:
限幅滤波(程序判断滤波)
比较相邻的两个采样值Yn和Yn-1,根据经验来判断,确定2次采样允许的最大偏差值。每次检测到新值时都判断:如果Yn-Yn-1<=A,则本次值有效,否则本次值无效,并用Yn-1值代替Yn。
C++语言实现如下:
运行结果:
说明:
自己输入的1、2、3、4、5、6、7得到的都是当前值,0、8、9得到的是上一次的值。其实限幅滤波法一般使用于处理变化较为缓慢的数据,例如:温度、位置等。关键是合适的门限值的选取。优点:能有效克服因偶然因素引起的脉冲干扰。缺点:无法抑制那种周期性的干扰平滑度差。中值滤波(中位值滤波)
对某一个参数连续采样N次(一般为奇数),然后将数据从小到大的排列,再取中间值作为采样值,整个过程其实就是一个序列排序的过程。
运行结果:
说明:
中值滤波其实就是涉及到一个排序的问题了,中值滤波非常适合用于去掉由于偶然因素引起的波动或者是由于采样器不稳定而引起的脉动干扰,对缓慢变化的被测参数用此法能收到良好的滤波效果,但是对于快速变化的参数一般不宜采用中位值滤波法。优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果3.缺点:
对流量、速度等快速变化的参数不宜算术平均滤波
这个可能是最简单的了,小学生可能都会这个思想了。那就是连续采样好多个数据然后求和在除以总采样数了。
运行结果:
说明:
算术平均滤波算法适用于对具有随机干扰信号进行滤波。这种信号的特点是有一个平均值,信号在某一个数值附近上下波动。信号的平均平滑程度完全取决于采样数据的多少,当采样值较大时,平滑度高,灵敏度低。当采样值比较少时,平滑度第,灵敏度高。优点:适用于对一般具有随机干扰的信号进行滤波;这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。3.缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用;比较浪费RAM。中位值平均滤波(防脉冲干扰平均滤波法)
相当于中位值滤波+算术平均滤波,连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。也很简单了。
运行结果:
说明:
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。优点:融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。对周期干扰有良好的抑制作用。平滑度高,适于高频振荡的系统。3.缺点:
计算速度较慢,和算术平均滤波法一样。比较浪费RAM。加全平均滤波
即不同时刻的数据加以不同的权,通常是,越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
运行结果:
说明:
适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。消抖滤波
设置一个滤波计数器,将每次采样值与当前有效值比较:如果采样值=当前有效值,则计数器清零;如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出);如果计数器溢出,则将本次值替换当前有效值,并清计数器。
运行结果:
说明:
1.优点:
对于变化缓慢的被测参数有较好的滤波效果; 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。2.缺点:
对于快速变化的参数不宜; 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。就先写这几种简单的吧,以后了在慢慢写了。
喜欢我文章的朋友,欢迎关注、分享、点赞、评论。
STM32单片机从零开始使用教程(六) 单片机上的数字滤波器
滑动窗口均值滤波
滑动窗口滤波顾名思义,给定一个时间窗口不断移动,每次都取这个窗口内数据的平均值作为输出结果,能够去除高频的尖峰噪声。
其数字系统的传递函数为
可以绘制出其频谱图为
是明显的低通滤波器
虽然下降的很慢,但是实现起来简单,也不会占用什么太多的资源
我们在代码中可以开辟一个数组作为这个滑动窗口
然后通过不断的移动指针来去掉最旧的值并添加最新的值(虽然其实我是用了一个变量)
中值滤波器
同样顾名思义,就是取中间那个值作为结果。工程师起的名字就是这么好懂。
对连续的N(一般为奇数)次采样结果按顺序排列,再取其中值作为本次采样值。
虽然相当于是延长采样时间降低采样频率,但是能有效去除高频椒盐噪声
数据的插入可以参考前面的均值滤波器,这里把它封装成一个函数
至于这里的排序函数就可以自由选择了,时间复杂度高达O(n^2)的冒泡排序,O(nlogn)的二分排序等等
对于比较长的窗口而言自然还是效率高的算法比较好。排序结果可以放到一个新的数组中,免得以后不知道新数据该顶替谁。
限幅滤波器
同样顾名思义,就是限制信号的幅值,当输入信号的幅值超过设定的阈值就把他降低到阈值或者去掉这个点
这个没什么说的,一个if就完事了。
卡尔曼滤波
还有一个十分现代化的滤波方式——卡尔曼滤波,这个比前面说的这些复杂一些,按下不表,下次再讲。
相关问答
5v 单片机滤波 电容大吗?根据具体的应用场景来看,5V单片机滤波电容的大小需要进行综合考虑。一般来说,在数字电路中,采用的电容值较小,通常在pF~10nF范围内;而在模拟电路中,需要采...
5v1a开关电源给 单片机 供电,如何做 滤波 整流?开关电源已经有整流滤波电路,供给单片机时只需加一个100到220uF左右的电解电容和一个0·01uF的高频电容即可开关电源已经有整流滤波电路,供给单片机时只需加...
单片机 有了信号调理电路就不用整流 滤波 电路?不,单片机的信号调理电路和整流滤波电路是两个不同的功能模块。信号调理电路主要用于对输入信号进行放大、滤波、放大等处理,以适应单片机的输入要求。而整流...
如何提高msp430 单片机 内部ad转换精度,思路是什么?提高精度,光从单片机的选择和数字滤波中是做不到那么好的,要注重于模数隔离,防止耦合串扰,外界干扰等,这需要从pcb的制作上解决:防止外界干扰可通过pcb敷铜...
单片机 如何通过ADC模块采集模拟信号?朋友们好,我是电子及工控技术,我来回答这个问题。众所周知单片机是一种超大规模的集成电路,它只能“读懂”并处理数字信号,对于连续量的模拟信号则无能为力。...
什么模块可以让 单片机 的 数字 信号转换成音频信号?你好!关于这个问题:什么模块可以让单片机的数字信号转换成音频信号?1、单片机本身可以模拟输出音频信号2、输出音频信号其实就是AD采样的逆向工程。即DA3、...
5v 单片机 和传感器总电源, 滤波 电容越大越好吗?-ZOL问答应该不用吧,一般开关电源都是直流输出的,如果要滤波的话,一般在电源输出前方并联个100uF或220uF的电容,接近单片机电源的地方(越靠近单片机越好)并个104的钽电容...
单片机 控制大电流器件,如何实现电路隔离?单片机控制大电流器件,如何实现电路隔离?单片机用在工业现场,出现异常状况多数是源自于干扰,造成程序跑飞、控制失灵,有时出现严重事故。根据题目说的,单...单...
单片机 ad转换器锯齿波产生原理?单片机AD转换器通过逐渐增加或逐渐减小的数字信号来产生锯齿波形。具体原理如下:1.单片机AD转换器产生锯齿波形的原理是...单片机AD转换器锯齿波产生原理是...
单片机 lcd怎么同时显示两个变量?那就是个整流桥堆,说白了相当于里面有4个整流二极管。并联104电容用于针对高频信号滤波,提升电源纯净度。那就是个整流桥堆,说白了相当于里面有4个整流二极管...