首页 > 其他分享 >常用滤波

常用滤波

时间:2023-08-07 16:47:54浏览次数:43  
标签:采样 常用 HAL int 滤波 value ADC

常用滤波

文档参考:https://sneak.blog.csdn.net/article/details/129629485

常用滤波

文档参考:https://sneak.blog.csdn.net/article/details/12962948

未添加滤波算法

main函数

while(1){	
    HAL_ADC_Start(&hadc1);						//开启ADC1,放置在while循环中
	ADC_value=HAL_ADC_GetValue(&hadc1);			//获取ADC1的数值
	HAL_Delay(10);								//延迟函数,防止采样失效
	printf("ADC_value:%d\n", ADC_value);
}

一阶互补滤波

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

//一阶互补滤波
int firstOrderFilter(int newValue, int oldValue, float a)
{
	return a * newValue + (1-a) * oldValue;
}
 
ADC_value=HAL_ADC_GetValue(&hadc1);			//获取ADC1的数值
//主函数
while(1){
    HAL_ADC_Start(&hadc1);						//开启ADC1,放置在while循环中
    Filtering_Value = firstOrderFilter(HAL_ADC_GetValue(&hadc1),ADC_value,0.3);    //滤波算法
	HAL_Delay(10);								//延迟函数,防止采样失效
	printf("ADC_value:%d\n", ADC_value);
	printf(“ADC_value:%d\n”, ADC_value);
}

一阶互补滤波的局限性还是很大的,效果非常一般。

中位值滤波

方法:连续采样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];
}

中值滤波对消除异常值和平稳化AD采样都具有十分有效的结果。

算术平均滤波

方法:连续取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;
}

平滑均值滤波相较于普通的算术平均滤波,突出一个平滑特性。可以从上述VOFA+的波形图看出,平滑滤波可以有效抵消AD采样的刺噪并稳定化采集(据作者同门实战反应平滑滤波的效果还是非常好的,尤其在控制方面)。

限幅平均滤波

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


限幅平均滤波类似于缝合怪,但是效果是非常显著的,它有效的解决了实际场景下突变噪声对AD采样的影响,但是消耗内存。

卡尔曼滤波

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

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

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

//卡尔曼滤波
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;                                             //返回滤波值
}

作者本人是非常喜欢卡尔曼滤波的,VOFA+显示的波形图开源看出卡尔曼滤波有一定的去噪稳定特性的,虽然效果不是特别优秀。卡尔曼滤波的普适性很强,尤其在控制与多传感器融合方向,只要参数调整的好,效果出奇优秀。

标签:采样,常用,HAL,int,滤波,value,ADC
From: https://www.cnblogs.com/baolixin/p/17611698.html

相关文章

  • Linux常用的shell命令汇总
    本文介绍Linux系统下常用的系统级命令,包括软硬件查看、修改命令,有CPU、内存、硬盘、网络、系统管理等命令。说明命令是在Centos6.464位的虚拟机系统进行测试的。本文介绍的命令都会在此Centos下运行验证(也有部分命令会在suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出......
  • Ceph常用命令汇总
    对象用户和桶$radosgw-adminusercreate--display-name="johnnyrotten"--uid=johnny$radosgw-adminuserrm--uid=johnny$radosgw-adminuserrename--uid=johny--new-uid=joe$radosgw-adminuserrm--uid=johnny--purge-data$radosgw-adminbucketr......
  • 信号的频谱分析与信号滤波
    信号的频谱分析与信号滤波试验目的:熟悉信号的频谱分析与信号滤波。信号的频谱分析例、建立一个含50Hz和120Hz幅值为2的正弦信号(sin),然后叠加一个幅值为1的随机信号,利用Matlab分析其频谱。并滤除噪声信号和120Hz正弦信号。实验提示:1、FFT谱分析:利用FFT分析含噪声的时域信号的频率组......
  • Mitsubishi 三菱FXPLC入门之常用基本编程环节
    学习PLC,主要学习的就是它的编程,一说到编程我就头皮发麻,总觉得我学了编程后离脱发、秃头也就不远了。在学习PLC之前,我以为编程都是打代码,后来才发现,PLC的编程基本是梯形图,这让我大松一口气,好歹不用面对那些一串一串的英文字符,谢天谢地。犹记得高中的语文考试,阅读理解、诗......
  • SQL常用(SqlSever)
    目录sql视图查询重复数据锁表查询锁表循环使用while循环插入CTE递归查询条件查询窗口函数常用函数查询表的字段更多系统视图和函数检查数据库中是否存在某个表sql视图SQL视图(View)是一种虚拟的表,它只是一个SELECT语句的命名结果集,与物理表不同,它没有存储在数据库中的数据。视......
  • 常用板子
    树状数组点击查看代码intc[N];intask(intx){intres=0;for(;x;x-=x&-x)ans+=c[i];returnans;}voidadd(inti,intx){for(;x<=n;x+=x&-x)c[x]+=y;}intpre(intl,intr){returnask(r)-ask(l-1);}......
  • hutool, 转换map常用规则
                   ......
  • 【开发中】Git常用命令详解
    基于平时工作的场景,整理了使用频率较高的一些命令和参数,作为一个Git命令的备忘录。gitclone概述:将远程Git仓库克隆到本地,自动将远程仓库的所有分支和历史记录复制到本地。格式:gitclone[-b<name>]<repository>[<directory>]参数:-b<name>,等同--branch<name>不将新创......
  • javascript~常用工具类的封装
    JavaScript1.type类型判断isString(o){//是否字符串returnObject.prototype.toString.call(o).slice(8,-1)==='String'}isNumber(o){//是否数字returnObject.prototype.toString.call(o).slice(8,-1)==='Number'}isObj(o){//是否对象......
  • MySQL数据库的常用命令
    1.创建数据库指定字符集:CREATE DATABASEdb_nameDEFAULTCHARACTERSETutf8COLLATEutf8_general_ci 2.新建用户:createuser'hive'@'localhost'identifiedby'123456';如果提示:ERROR1290(HY000):TheMySQLserverisrunningwiththe--skip-gra......