本文摘要(由ai生成):
文章主要介绍了嵌入式开发中常用的滑动均值滤波算法。首先简单介绍了嵌入式开发中常用的传感器,以及在数据采集中出现的噪声问题和常用的数学方法。然后以 STM32 软件项目入门实战中的多路电压采集系统为例,详细介绍了滑动均值滤波算法的实现步骤。最后通过 MATLAB 对该算法的滤波效果进行了验证,并分析了滑动均值滤波算法的使用特性。
在嵌入式开发过程中会用到各种各样的传感器,比如压力传感器、光敏传感器、加速度传感器、温湿度传感器、角速率传感器等等。在这些传感器数据采集过程中掺杂着噪声,使得传感器测量精度误差过大【传感器数据数据波动很大】,传感器数据输出噪声来源可能是由于震动、温度的变化、电磁干扰等很多因素引起的,我们用数字信号处理的方法来消除或者抑制这种噪声。常用的数学方法有FFT滤波算法、DFT滤波算法、kalman算法、中值滤波算法、平均值滤波算法、滑动均值滤波、最小二乘法、限幅滤波算法、高通滤波、低通滤波等。每种算法都有各自的特点和的应用场景,用好这些数学工具可以让你的产品或作品更加富有灵魂,让产品更加“智能化”。
本系列文章主要讲解以上各类算法和应用场景。文本首先介绍滑动均值滤波算法。以STM32软件项目入门实战中多路电压采集系统这个项目为例,讲述滑动均值滤波。在此之前我们必须清除ADC采集为什么要用到滑动均值滤波,首先采集口的模拟量可能夹杂着不同频段,不同峰值的干扰信号,那么ADC采集的数据量就会偏移原有的真实结果。通过硬件与数字滤波两种手段可大大减少采集误差,提高数据的精度和稳定性。软件方法有算数平均值(是将N个数值作和,之后除以数值个数。)、滑动平均值滤波、卡尔曼、FFT等。
滑动均值滤波算法实现步骤如下:首先是传感器数据的获取,采用的ADC+循环DMA的方式采集电压数据,以5个数据为1组,并将这些数据依次入队,也就是下面数组,最先进入到队列的数据不停地冲刷,依次能达到数据滑动的目的。
上图是对5路ADC采样值进行的滑动均值滤波,每五个为一次做依次均值处理,因为ADC_ConvertedValue[]里面的数据由DMA不断进行刷新,GetADValue函数调用频率可以不和ADC采样频率一致。
下图是采用半实物半仿真的方式来验证该算法的滤波效果,也就是ADC采集的值通过串口打印,将采集的ADC结果存储起来,用MATLAB进行处理。
红色线是用均值滤波算法处理后的结果,蓝色线是ADC的原始数据。可以看出滤波鲜果是很不错。滑动均值滤波使用时特性如下:对周期性干扰信号有良好的抑制作用,平滑度高,适用于高速率信号采集,算法简单便于计算。因为ADC采集在100KHz以上,所以本算法适合该应用场景。采样分组N值较大的情况下会导致灵敏度低,对于干扰信号较大的情况下也就是信噪比小的情况不适用该算法。