STM32常用数据采集滤波算法

news2024/11/15 10:12:50

例如,STM32进行滤波处理时,主要目的是处理数据采集过程中可能产生的噪声和尖刺信号。这些噪声可能来自电源干扰、传感器自身的不稳定性或其他外部因素。

1.一阶互补滤波

方法:取a=0~1,本次滤波结果=(1-a)本次采样值+a上次滤波结果 优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合 缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号。

int firstOrderFilter(int newValue, int oldValue, float a)
{
	return a * newValue + (1-a) * oldValue;
}

2.中位值滤波

方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值 优点:能有效克服因偶然因素引起的波动干扰;对温度、液位等变化缓慢的被测参数有良好的滤波效果 缺点:对流量,速度等快速变化的参数不宜。

//中值滤波算法
int middleValueFilter(int N)
{
    int value_buf[N];
    int i,j,k,temp;
    for( i = 0; i < N; ++i)
    {
        value_buf[i] = HAL_ADC_GetValue(&hadc1);	
				
    }
    for(j = 0 ; j < N-1; ++j)
    {
        for(k = 0; k < N-j-1; ++k)
        {
            //从小到大排序,冒泡法排序
            if(value_buf[k] > value_buf[k+1])
            {
                temp = value_buf[k];
                value_buf[k] = value_buf[k+1];
                value_buf[k+1] = temp;
            }
        }
    }
		
    return value_buf[(N-1)/2];
}

3.算术平均滤波

方法:连续取N个采样值进行算术平均运算; N值较大时:信号平滑度较高,但灵敏度较低 N值较小时:信号平滑度较低,但灵敏度较高 N值的选取:一般流量,N=12;压力:N=4 优点:试用于对一般具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。 缺点:测量速度较慢或要求数据计算较快的实时控制不适用。

int averageFilter(int N)
{
   int sum = 0;
   short i;
   for(i = 0; i < N; ++i)
   {
        sum += HAL_ADC_GetValue(&hadc1);	
   }
   return sum/N;
}

4.滑动平均滤波

方法:把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。 N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统 缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合 比较浪费RAM(改进方法,减去的不是队首的值,而是上一次得到的平均值)

//平滑均值滤波
#define N 10
int value_buf[N];
int sum=0;
int curNum=0;
int moveAverageFilter()
{
    if(curNum < N)
    {
        value_buf[curNum] = HAL_ADC_GetValue(&hadc1);
        sum += value_buf[curNum];
			  curNum++;
        return sum/curNum;
    }
    else
    {
        sum -= sum/N;
        sum += HAL_ADC_GetValue(&hadc1);
        return sum/N;
    }
}

5.限幅平均滤波

方法:相当于“限幅滤波法”+“递推平均滤波法” 每次采样到的新数据先进行限幅处理再送入队列进行递推平均滤波处理 优点:对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。 缺点:比较浪费RAM

//限幅平均滤波
#define A 50        //限制幅度阈值
#define M 12
int data[M];
int First_flag=0;
int LAverageFilter()
{
  int i;
  int temp,sum,flag=0;
  data[0]=HAL_ADC_GetValue(&hadc1);
	for(i=1;i<M;i++)
	{
		temp=HAL_ADC_GetValue(&hadc1);
		if((temp-data[i-1])>A||((data[i-1]-temp)>A))
		{
		  i--;flag++;
		}
		else
		{
			data[i]=temp;
		}
	}
  for(i=0;i<M;i++)
  {
    sum+=data[i];
  } 
  return  sum/M;
}

6.卡尔曼滤波

核心思想:根据当前的仪器"测量值" 和上一刻的 “预测量” 和 “误差”,计算得到当前的最优量,再预测下一刻的量。里面比较突出的是观点是:把误差纳入计算,而且分为预测误差和测量误差两种,通称为噪声。还有一个非常大的特点是:误差独立存在,始终不受测量数据的影响。

优点:巧妙的融合了观测数据与估计数据,对误差进行闭环管理,将误差限定在一定范围。适用性范围很广,时效性和效果都很优秀。

缺点:需要调参,参数的大小对滤波的效果影响较大。

//卡尔曼滤波
int KalmanFilter(int inData)
{
		static float prevData = 0;   //先前数值 上一次滤波后的数据,作为下一次滤波的初始值
		static float p = 10, q = 0.001, r = 0.001, kGain = 0;    // q控制误差  r控制响应速度 
		
    	//更新估计误差方差
		p = p + q;
    	//计算卡尔曼增益
		kGain = p / ( p + r );                                     
    	//计算本次滤波估计值
		inData = prevData + ( kGain * ( inData - prevData ) );  
    	//更新测量方差
		p = ( 1 - kGain ) * p;                                     
		prevData = inData;
		return inData;                                             //返回滤波值
}

prevData:保存上一次滤波后的数据,用于下一次的滤波。 p:估计误差方差,表示当前估计值的不确定性。 q:过程噪声方差,表示系统模型的不确定性。 r:测量噪声方差,表示测量数据的不确定性。 kGain:卡尔曼增益,决定了测量数据和估计数据对当前状态估计的影响程度。

初始化静态变量

更新估计误差方差

计算卡尔曼增益

更新估计值

更新估计误差方差

保存当前估计值

返回滤波后的值

7.限幅滤波

核心思想:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。 优点:能克服偶然因素引起的脉冲干扰 缺点:无法抑制周期性的干扰,平滑度差

#define  A 51
u16 Value1;

u16 filter1() 
{
  u16 NewValue;
	Value1 = ftable[b-1];
  NewValue = ftable[b];
	b++;
	a++;
	if(a==255) a=0;
	if(b==255) b=1;
  if(((NewValue - Value1) > A) || ((Value1 - NewValue) > A))
	{
		print_host(ftable[a],NewValue);
    return NewValue;
	}
  else
	{
		 print_host(ftable[a],Value1);
     return Value1;
	}
}

8.加权递推平均滤波

核心思想: 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权;通常是,越接近现时刻的数据,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。 优点: 适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。 缺点: 对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

#define FILTER8_N 12
int coe[FILTER8_N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};    // 加权系数表
int sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; // 加权系数和
int filter_buf[FILTER8_N + 1];
int filter8() 
{
  int i;
  int filter_sum = 0;
  filter_buf[FILTER8_N] = ftable[a];		
	a++;
	if(a==255)   a=0;
  for(i = 0; i < FILTER8_N; i++) 
 {
    filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉
    filter_sum += filter_buf[i] * coe[i];
  }
  filter_sum /= sum_coe;
//	printf("%d\n",filter_sum);
  return filter_sum;
}

void pros8(void)
{
	u16 i=0;
	for(i=0;i<255;i++)
	{
     print_host(ftable[i],filter8());
	}
}

9.消抖滤波

方法: 设置一个滤波计数器,将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零; 如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出); 如果计数器溢出,则将本次值替换当前有效值,并清计数器。 优点: 对于变化缓慢的被测参数有较好的滤波效果; 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。 缺点: 对于快速变化的参数不宜; 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。

#define FILTER9_N 51
u16 i = 0;
u16 Value;
u16 filter9() 
{
  int new_value;
	Value = ftable[b-1];
  new_value = ftable[b];		
	b++;
	if(b==255)   b=1;
  if(Value != new_value) 
	{
    i++;
    if(i > FILTER9_N) 
		{
      i = 0;
      Value = new_value;
    }
  }
  else   i = 0;
  return Value;
}

void pros9(void)
{
	u16 i=0;
	for(i=0;i<255;i++)
	{
     print_host(ftable[i],filter9());
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习的零碎知识点

显卡内存 什么是显卡内存 简单来说就是&#xff0c;Windows 会在物理显存/「专用 GPU 内存」不够用或只有集成显卡的情况下&#xff0c;将物理内存 RAM 当作 GPU 的虚拟显存/「共享 GPU 内存」来使用。 什么是 Windows「共享 GPU 内存」&#xff0c;它与 VRAM 有什么不同 (s…

基于SSM数据分析的垃圾分类管理系统---附源码75778

摘要 随着城市化进程的加速&#xff0c;垃圾分类成为解决城市环境污染问题的重要举措。本文提出了一种基于SSM框架的垃圾分类管理系统&#xff0c;通过数据分析技术实现对垃圾分类过程的监测和管理。该系统结合了Spring、SpringMVC和MyBatis等框架&#xff0c;实现了垃圾分类数…

【GIS开发小课堂】写一个高德地图巡航功能的小DEMO

介绍 此项目使用vite为基础架构&#xff0c;内部实现均以typescript开发&#xff0c;可替换为自己的业务逻辑&#xff0c;并迁移到react&#xff0c;vue&#xff0c;umi等其他框架。 通过调用高德地图的API和threejs的开发&#xff0c;实现了一个小鸭子&#xff08;可替换为自己…

如何使用UWA Gears连接模拟器进行性能测试

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 日常工作中&#xff0c;模拟器是测试岗位常用的一款工具&#xff0c;能够很好地解决例如公司内无法…

产业园区数字化转型升级怎么做?这个应对策略你或许可以参考下!

近年在政策红利、技术创新、需求升级等多重因素驱动下&#xff0c;中国产业园区数字化转型步伐加快&#xff0c;呈现出四个发展新趋势&#xff1a; 空间载体向虚实交互的数字空间拓展 服务模式向产业链级生态化服务升级 赋能工具向依托产业大脑“协同作战”演进 发展方式向注…

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置&#xff1a; 拖动后播放位置&#xff1a; 在Slider组件中&#xff0c;添加onChange方法进行监听&#xff0c;当视频轨道拖放结束时&#xff0c;触发this.seekTo()函数&#xff0c;其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…

每日一练:两两交换链表中的节点

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff…

【网络】传输层协议UDP

一、再谈端口号 1.1 理解端口号 网络中两台主机进行通信的本质是主机的进程间进行通信&#xff0c;端口号标识了主机进行通信的不同的应用程序。 在 TCP/IP 协议中, 用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号…

浅谈新型电力系统背景下虚拟电厂运营体系研究-安科瑞叶西平

摘要&#xff1a;随着智能电网关键技术以及自动需求响应技术的日益发展&#xff0c;分布式发电、储能、电动汽车、可控负荷等需求侧资源有望成为发电侧可调资源的有效替代资源&#xff0c;通过响应电力市场中的电价信号或政府和能源行业的政策激励参与需求响应项目的实施&#…

java重点学习-集合(List)

七 集合&#xff08;List&#xff09; 7.1 复杂度分析 7.2 数组 1.数组(Array)是一种用连续的内存空间存储相同数据类型 数据的线性数据结构。 2.数组下标为什么从0开始 寻址公式是:baseAddressi*dataTypeSize&#xff0c;计算下标的内存地址效率较高 3.查找的时间复杂度 随机(…

如何把提醒事项以倒数日的形式放在桌面上?

在快节奏的现代生活中&#xff0c;我们常常需要记住各种重要的日期和事件&#xff0c;比如会议、纪念日、项目截止日期等。如果能将这些提醒事项以倒计时的形式直接展示在桌面上&#xff0c;无疑会为我们的生活和工作带来极大的便利。这样的功能不仅可以帮助我们提前做好规划&a…

oracle 使用 PL/SQL Developer创建表并插入单条、多条数据

第一步&#xff1a;使用工具创建表&#xff08;前提是库已经创建好了&#xff09;&#xff1a;在当前用户下找到Tables 然后点击并右键&#xff0c;点击新建 写上表名&#xff0c;写上表名的注释 第二步添加字段&#xff1a;点击列&#xff0c;然后分别写上你自己需要的字段及名…

“跨越数据边界:企业级实时计算平台构想”——2024 DolphinDB 年度峰会演讲回顾

9 月 6 日&#xff0c;“以实时&#xff0c;见未来”2024 DolphinDB 年度峰会在杭州举办。DolphinDB 创始人、CEO 周小华博士为大家带来了主题为“跨越数据边界&#xff1a;企业级实时计算平台构想”的精彩演讲。 从最初的一站式大数据平台&#xff0c;到高性能时序数据库&…

个性化推送太多?OFGB帮你关闭,隐私无忧

随着win 11的推出&#xff0c;微软在提供新功能和改进的同时&#xff0c;也在系统中加入了各种形式的广告&#xff0c;这些广告虽然为微软带来了额外的收入&#xff0c;但却可能影响了我们的体验&#xff0c;甚至引起了一些不满。 在这样的背景下&#xff0c;开发者社区中出现…

第15-05章:获取运行时类的完整结构

我的后端学习大纲 我的Java学习大纲 6.1.第一组方法API: 1.API列表&#xff1a;java.lang.Class 类&#xff1a; 2.代码测试&#xff1a; public class ReflectionUtils{ puvblic static void main(String[] args){}// 第一组Testpublic void api_01{//上面截图的代码......…

MVVM 基础

文章目录 MVC 设计模式传统的 MVC 架构Cocoa version of MVCMVC 设计模式的几个指导原则 MVVM 设计模式IOS 上的应用鸿蒙上 MVVMAndroid Data binding 参考&#xff1a; MVC 设计模式 日常大家都会听到&#xff0c;名字很简单&#xff0c;但是很实用&#xff0c;日常 Android …

紧急警报 工厂水泵房深夜意外进水:物联网监控如何避免百万损失

紧急警报&#xff01;工厂水泵房深夜意外进水&#xff1a;物联网监控如何助力避免百万损失 在当今高度自动化的工业生产环境中&#xff0c;任何微小的异常都可能迅速升级为重大的安全事故&#xff0c;对企业的运营造成不可估量的影响。近期&#xff0c;一起发生在某大型制造工…

数据挖掘实战-基于朴素贝叶斯算法构建真假新闻分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

外包干了半年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了半年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让…

10个登录页面优化的案例研究和示例,激发你的灵感

什么是落地页优化&#xff0c;为什么它很重要&#xff1f; 落地页优化是一门将首次浏览转化为行动&#xff08;即转化率&#xff09;的艺术和科学。其主要目的是调整和微调您的数字欢迎界面&#xff0c;让每一位访问者都感受到这是为他们量身打造的。 这个过程不仅仅是简单的…