常见的简单的单片机数字滤波算法及其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范围内;而在模拟电路中,需要采...
单片机 供电电源有干扰纹波,如何滤除?单片机电源均为直流电源,且常见MCU供电电压为5V、3.3V、1.8V等。所以此问题可以看作是低压直流电源的纹波如何滤除的问题。首先我们要先明确一个问题:电压纹波...
如何提高msp430 单片机 内部ad转换精度,思路是什么?提高精度,光从单片机的选择和数字滤波中是做不到那么好的,要注重于模数隔离,防止耦合串扰,外界干扰等,这需要从pcb的制作上解决:防止外界干扰可通过pcb敷铜...
单片机 控制电路原理?你好,单片机控制电路原理是指利用单片机作为控制核心,通过输入输出接口与外部电路相连接,实现对外部电路的控制和监测。其原理如下:1.单片机选择:根据实际...
STC 单片机 如何采集音频信号?STC单片机可以通过外接音频模块或者内置的ADC(模数转换器)来实现音频信号的采集。外接音频模块可以将音频信号转换为数字信号输入到单片机中,而内置ADC则可以...
电容在 单片机 中的英文缩写?在单片机中,电容的英文缩写是"Capacitor"。电容是一种被用来存储电荷的被动元件,它可以在电路中储存和释放电能。在单片机中,电容常常被用来平滑电源电压、滤...
51 单片机 可以接收模拟信号吗?回答是:可以。51系列单片机品种非常多,主要的厂家有Intel、philips、Atmel、silicon等等,除了少数型号,绝大多数型号都带有A/D(模拟/数字转换器)引脚,可...
为什么在AD转换的时候数据波动很大?单片机显示的数据发生小范围变化,主要原因有以下几点:1,如果你使用的是AD转换出来的,则使用的滤波方式不合理,导致其变化,理论上,AD转化出来的数值,每一...1...
单片机 复位引脚电路中电阻和电容参数怎么确定?在单片机复位引脚电路中,电阻和电容的参数可以根据系统要求和规格来确定。以下是一些常见的参考方法:1.电阻参数确定:-复位电阻(Pull-up或Pull-down电阻...
基于89c51 单片机 的功率测量,怎么做?51单片机测量功率,实际是将功率转化为测量负载的电压与电流,再根据公式P=UI,即功率等于电压*电流,计算出功率。直流电源功率测量:(1)电压采样,设计相应...51单...