单片机滤波算法之一阶滤波
本文用于记录阅读完《匠人手记:一个单片机工作者的实践与思考》一阶滤波算法的记录和心得。
一阶滤波算法公式:Yn(本次滤波值)=aXn(新采样值)+(1-a)(上一次滤波值)。
a表示滤波系数(在0~1范围之内),此公式用于表达将新采样值与上一次滤波值做一个权重分配,如:a=0.4,那么本次滤波值就会等于新采样值的0.4+上一次滤波值的0.6,如果新采样值猛然突变,那么因为权重的分配,就会降低本次滤波值受到新采样值的突变影响,因为受到权重的限制。
//---------------------------------
//单字节一阶滤波程序
//入口: NewData = 新采样值
// OldData = 上次滤波值
// K = 滤波系数(0~255)代表采样值在滤波值中占的权重
//出口: 本次滤波值
//公式原型:Yn(本次滤波值)=a*Xn(新采样值)+(1-a)*Yn(上一次滤波值)
//公式变形:当新采样值<上次滤波结果时:滤波结果=上次滤波结果-(上次滤波结果-新采样值)*一阶滤波系数/256
// 当新采样值>上次滤波结果时:滤波结果=上次滤波结果+(上次滤波结果-新采样值)*一阶滤波系数/256uint8_t Filter_1st(uint8_t NewData, uint8_t OldData)
{static k = 0; //滤波系数,可以在初始化时赋值一个最初系数,在0~255之间uint32_t result; //使用uint32_t的目的是因为后续要将值*256if (NewData < OldData) {result = OldData - NewData;result = result * k;result = result + 128; //进行四舍五入,因为128/256=0.5result = result / 256;result = OldData - result;} else if (NewData > OldData){result = NewData - OldData;result = result * k;result = result + 128; //进行四舍五入,因为128/256=0.5result = result / 256;result = OldData + result;} else result = OldData;return ((uint8_t) result);
}
滤波系数=20
滤波系数较小时,一阶滤波算法可以滤除一些偶然的干扰,滤波结果平稳,但是灵敏度比较低,当数据进行突变时,数据需要多次采集之后才能跟得上变化。
②滤波系数等于中间值128
平稳度和灵敏度都比较一般,滤波结果比采样结果更平滑一些,但是不能消除干扰。
③滤波系数最大256
几乎跟采样数据一样,并无滤波效果。
一阶静态滤波算法(滤波系数不变)的不足:
1.无法兼顾平稳度和灵敏度,只能舍弃其一,我们希望:在数据快速变化时,滤波结果能快速反应(灵敏度优先);而数据趋于稳定时,在一个固定的点进行上下波动时,滤波结果能趋于平稳(平稳度优先)。
2.舍弃小数带来微弱误差,如:本次采样值=25,上次滤波结果=24,滤波系数=10,根据算法本次滤波结果=(2510+24(256-10))/256=24.0390625,进行四舍五入则会得到24,如果一直采样到25,那么滤波值会一直偏差。
改进方法:动态改变滤波系数
需要实现效果:
①当数据快速变化时,滤波结果能及时跟进变化,并且变化越快,灵敏度越高(灵敏度优先)。
②当数据趋于稳定后,在一个范围波内振荡时,滤波结果能趋于稳定(平稳度优先)。
③当数据稳定后,滤波结果能逼近于采样值,消除舍弃小数带来的误差。
如何做到:
改变系数之前需要做的准备:
①数据变化是否朝着同一个方向变化(如连续采集的两个值都大于上次滤波值,视为变化方向一致,判断是否为同一方向的次数可视情况而定)。
②数据变化是否较快(判断采样值和上次滤波值之间的差值)
调整系数的原则:
①当两次数据变化方向不一致时,说明有抖动,将滤波系数清0,忽略本次采样值。
②当数据持续向一个方向变化时,逐渐提高滤波系数,提高新采样值的权值。
③当数据变化较快(差值>消抖计数加速反应阈值时)时,加快滤波系数的变化,即突变的非常厉害时。
以上纯属个人见解,有误之处还望大家指正。
单片机滤波算法之一阶滤波相关推荐
- matlab中基于十字形窗口的滤波算法,#215;字形滤波窗口在Matlab自适应中值滤波算法中的应用 - 21ic中国电子网...
由于种种原因,图像在生成.传输.变换等过程中往往会受到各种噪声的污染,从而导致图像质量退化.噪声信号的滤波是图像处理的基本任务之一,主要有线性滤波和非线性滤波两种方法.线性滤波方法一般具有低通特性,而 ...
- java 滤波算法_双边滤波算法
1.原理 高斯滤波是以距离为权重,设计滤波模板作为滤波系数,只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息. 高斯滤波的缺陷如下图所示:平坦区域正常滤波,图像细节没有变化,而在突变的 ...
- c语言双边滤波算法,快速双边滤波 附完整C代码
很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...
- C 语言实现的滑动平均滤波算法,滑动平均滤波算法(递推平均滤波法)
/// ///滑动平均滤波算法(递推平均滤波法) /// /// /// GN为数组value_buf[]的元素个数,该函数主要被调用,利用参数的数组传值 /// private const int ...
- 【老生谈算法】matlab实现线性平滑滤波算法——线性平滑滤波算法
matlab线性平滑滤波程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]免疫算法+matlab程序.docx 2.算法详 ...
- 一阶RC低通滤波算法原理与实现
文章目录 1. 一阶低通滤波算法原理 2. 一阶滤波算法的特点 3. 基本算法的例程 4. 优化:减少乘.除的运算次数以提高运算速度 5. 改进:动态调整滤波系数 动态调整滤波例程 本文整理自网络,参 ...
- 滑动平均滤波_单片机数字滤波算法如何实现?(附代码)
关注.星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥 单片机主要作用是控制外围的器件,并实现一定的通信和数据处理.但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进 ...
- c语言滤出是个最小值,经典滤波算法及C语言程序
<经典滤波算法及C语言程序>由会员分享,可在线阅读,更多相关<经典滤波算法及C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.经典的滤波算法经典的滤波算法 可以用用可以用用 ...
- 自动驾驶 - 滤波算法
自动驾驶 - 滤波算法 目前比较常用的滤波算法有: 平均值滤波算法 中位值滤波算法 一阶滤波算法 卡尔曼滤波算法 1. 平均值滤波算法 1.1. 算法介绍 平均值滤波算法是比较常用,也比较简单的滤波算 ...
最新文章
- centos7.4.3 部署python-pcl亲测可用(采坑记)
- html action get post请求参数乱码,input type=text 发送请求参数,中文乱码问题
- win10 详细配置JAVA环境变量(最详细),操作步骤如下:
- JVM_垃圾收集器与内存分配策略01
- 新东方雅思词汇---6.1、oppose
- C/C++ 文件读取操作 竞赛篇
- Acrobat Pro DC 2021 for Mac(pdf编辑器)中文版
- 区块链 Fisco bcos 智能合约(13)-Solidity的设计模式
- 姜启源《数学建模》学习笔记 第一周
- 瑞利信道的多普勒谱的原理与MATLAB仿真
- MTK7620A FLASH W25Q256学习
- TIMESTEN安装配置指南-中文版
- AV1 解码器 dav1d
- NCURSES程序设计之魔数方阵
- 广发卡知识知多少?不懂来看,不然吃亏了!
- Loongson_2F/ 3A【tftp+u盘】方式安装系统(开机不认u盘)
- ios html加载css样式,iOS加载HTML, CSS代码
- Linux中 ps命令详解
- 使用dba_waiters检查锁等待
- 热搜排序 半衰期的应用