一个非常适合单片机的滤波算法

2023-05-16

连接:http://bbs.21ic.com/icview-170880-1-1.html

-------------------------------------------------以下为原文 -------------------

连接:http://bbs.21ic.com/icview-170880-1-1.html

 

单片机大多资源小,算法占用的资源越小越好,现在介绍就是一个占用很小资源的算法,这个算法是本人在进行扫描仪设计,实现灰度转二值时实现动态阈值,当时为了跟踪灰度等级的变化,需要一个灰度积分跟踪电路,开始使用一个电容积分电路,用灰度信号对电容充电,放电时以该电容电压的比例进行,实现对输入信号的跟踪,但用电容的电路设计比较复杂。过后发现这种比例放电的思想用软件实现非常简单,且具有积分、微分的作用。
具体公式如下:
       SUM=SUM-SUM/n+S 
       其中:S为采样值,SUM为保存值,n是放电比例、最好选2的幂次数,单片机移位即可,不需要做除法,跟随后得到的值为SUM/nSUM注意不溢出,预留的容量为采样数最大值的n倍,初始化时如果是跟踪一段时间后使用,可以是任何值,否则可以用采样值乘n初始化。使用值为SUM/n(下文中SA),实现SUM/nS的跟踪。还有一个关键是计算周期T,即多长时间进行一次。
一、积分作用:
1.平滑滤波(滑动平均滤波)
由公式中可以看出,每次采样、计算后,当前采样的影响对SUM/n只有1/n,而且采到的值随次数的增加影响越来越小直至没有,相关性逐渐减弱,而且是连续相关。如果计算周期与采样周期相同,使用计算后的值对干扰有n倍的抑制,即积分的平滑滤波作用,如1ms采样一次,同时运算一次,
则使用值SA=SUM/n为抑制干扰的结果,且同样是1ms给出一个结果,使用两个变量实现平滑滤波,并且是即时使用的,与采样几次平均的平滑不同。



 

 

2.动态阈值
在很多应用中需要动态阈值,比如触摸按键的键阈值门限,血压计的心率检出,前面提到的灰度转二值黑白图像等(灰度转二值因为扫描速度2.5Mbyte/S,不能使用软件运算,但可以使用可编程逻辑实现)。动态阈值是对信号积分后得到的低频变化再与基本门限相加在触摸按键中增加动态阈值可以提高其适应性和可靠性。关键是根据按键反应时间和按键间隔确定按键积分参数,跟踪速度,n、T越大跟踪的越慢,积分效果越好。
 

3.锁相作用:把上边的积分运算,用于对时间上周期的信号,例如根据过零触发信号锁定交流电源周期,使用两次T时间不同,其它相同的运算,由于T不同,跟踪速度不同,当两次运算的结果相等时可以确认为锁定,这时得到的是准确的电源周期值,而相位偏差也很小。

二、微分作用:
公式中的SA趋近采样值S,如果S是线性的,SA的值是可控滞后于S,那么运算的间隔时间T不同,得到的跟踪曲线的滞后特性不同,这种滞后特性的差和间隔时间就是微分特性,表示曲线的变化规律。如电热水壶,温度的变化相当于采样时间是还相当慢的,局部可以作为线性变化来处理。下边以设计电热水壶的过程来说明微分作用。
电热水壶出口一直使用蒸汽开关这种需要交专利费的方式。不使用蒸汽开关检测压力只能使用热敏器件检测温度。
温度检测的环境要求:
1.        海拔高度不同的地区水开的温度不同。
2.        热敏器件的误差较大,必须克服,否则可生产性不足。
3.        环境温度不同,电源电压不同,装水量不同。
由要求1、2决定检测温度不能判别水开与否,需要检测温度的变化率,但温度变化率的判别又和要求3相关,下边曲线图为热水器的加热曲线。蓝线为即时温度,橙色为一次运算后的曲线。

图中加热过程中间添加了冷水,曲线有一段下降,过后的加热过程两个曲线有个差异滞后,同一个时间的两个曲线差表示了加热效率的变化,其中最大的加热效率体现了环境温度不同,电源电压不同,装水量不同的综合效果。由于滞后的时间可以通过计算周期T来调整,知道滞后时间又有相减的差,这就是微分效应,加热过程整个就是效率的变化过程。我们可以通过1秒钟计算一次,2秒钟计算一次,加上原始数据得到三个曲线,效率的变化一目了然。
        第一次的水开检测使用效率的方法,同时也会得到水开时的温度检测值,微分特性本身是可以预知变化趋势的,如果1秒钟计算一次,用当前检测值减去这次计算的结果,这个差与当前值相加,就可以做为当前1秒后的结果,也就是预知1秒后加热的检测值,结合第一次得到的水开温度检测值,以后的水开检测就有两个判断条件。

 

---------------------------------------------- 以下为匠人的分析-----------------------------

拨开迷雾看真相,作者的这个算法,本质上,就是一阶滤波(低通滤波)。

引用作者原来的公式

SUM=SUM-SUM/n+S
首先点破一下,等号前面的SUM代表的是本次运算结果,而等号后面的SUM代表的是上次运算结果。

且看匠人如何推导: 
设:
SUM=A
SUM/n=B=本次滤波结果
1/n=a (一阶滤波系数)
S=本次新采样值

则:
A=nB
B=A/n


另外:
A代表本次值
A’B’ 代表上次值

作者原公式逐步推导:
原始:SUM=SUM-SUM/n+S
1步:A=A’ – A’/n +S
2步:nB=nB’ – B’ +S
3步:B= (nB’ – B’ +S)/n
4步:B=B’ –B’/n +S/n
5步:B=1- 1/nB’ + 1/n*S
6步:B= 1-aB’+ a *S

推导到最后一步,是不是很眼熟啦?
呵呵,这就是经典的一阶滤波(低通滤波)的标准公式了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个非常适合单片机的滤波算法 的相关文章

  • 一个C++程序员的学习经历

    正在上网的时候有这个念头的 xff0c 所以急急忙忙找了一些学习编程的高人的感想 xff1a 我开始学VC时就是自己一个人在啃 xff0c 也没什么人指导 xff0c 当时没有条件上网 xff0c 资料特别少 xff0c 在书店里随便买本书
  • Mac mini 2018 win10 外接显卡终极教程

    Mac mini 2018 win10 外接N卡应该算是最简单了 但是有些小问题 xff0c 比如说总是需要插拔雷电3的线材 xff0c 对于强迫症或者偏执来说总是感觉不爽 一种解决方案是用refind 启动方法 xff0c 将refind
  • Layui上传系列之二(多文件分块上传优化实现)

    接下来 xff0c 就要实现layui的uploader分块上传了 xff0c 在官网上没有提到分块上传 xff0c 倒是有一个多文件选择后 xff0c 显示文件列表的例子 目录 现状分析 我的做法 功能优化 上代码了 现状分析 对于我们能
  • tigervnc+noVNC远程使用RViz

    写在前面 遇到了远程桌面访问ubuntu系统并使用RViz的需要 xff0c 试了常用的vnc4server xff0c 在没有外接显示器的情况下 xff0c vnc4server需要虚拟一个显示器出来 xff0c 虚拟显示器可以使用Xvf
  • VINS-Mono融合轮式编码器和GPS(三):后端优化

    VINS Mono融合轮式编码器和GPS xff08 三 xff09 xff1a 后端优化 开篇介绍理论目标函数IMU约束1 残差2 优化变量3 Jacobian4 协方差 实践配合代码查看 开篇 项目地址VINS GPS Wheel xf
  • ROS-Gazebo (一):关于Gazebo无法加载模型,长时间卡在开始界面的问题解决方法

    在使用ROS Gazebo的过程中首先遇到的问题就是长时间加载不出模型 来 通常的解决方法是 从官方模型库下载号所有的基本模型 然后解压到 gazebo models文件夹里面就可以了 具体的下载地址和详细的操作方式可以 百度或者谷歌 34
  • 用SST89E516RD自制51单片机仿真器

    原文网址 xff1a http www1 eccn com tech06 te074653 asp 用SST89E516RD自制51单片机仿真器 文 xff0f 吴汉清 单片机实验和开发中最重要的一个环节就是程序的调试 xff0c 在业余条
  • Latex (一) 安装和环境变量的设置

    一 安装 Tex有很多不同的版本 xff0c 很多人喜欢用ctex xff0c 但是最推荐是官方版本Texlive 搜了很多资料 xff0c 一般windows的话 xff0c 可以将Tex live 43 Tex studio作为标配 x
  • KITTI 数据集 参数—— tracking devkit中的rotation_y和alpha角

    根据devkit中的readme txt和cs overview pdf的描述以及根据通过对数据集做的小实验总结的 xff0c 如果过有错误的地方欢迎指正 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 拯救者Y7000P 安装Ubuntu16.04问题解决

    先列一下问题 xff1a 1 wifi开不来了 xff1b 2 触摸板没法用 3 休眠后打不开 目前1 3 xff0c 解决了 xff0c 但是2依然没法解决 xff0c 不过问题不大 xff0c 大不了用鼠标 首先 xff0c 问题的原因
  • VSCode python调试库代码以及添加相关扩展支持opencv

    调试python 代码的时候可以再launch json 文件中添加 justMycode 34 false 来调试安装的包的代码 由于opencv 底层调用的C xff0c 所以如果要在代码提示中正确提示可能要安装额外插件 xff1a 比
  • vscode python包的引用一些问题

    个人使用vscode碰到的一些python包的引用问题以及尝试解决的一些办法 xff0c 可能只适用我自己的情况 项目目录大概如下 xff1a lib是根目录下的一个文件夹 xff0c 里面每个文件夹都是一个python 包 xff0c 都
  • MATLAB 矩阵的化简rref()函数

    在用MATLAB求解线性方程组的时候 xff0c 可以使用 rref 函数对矩阵进行化简 xff0c 从而很方便直观的得到原方程的解 xff0c 举一个简单的例子 xff1a 解下列线性方程组 则用MATLAB的rref函数解上述方程组的代
  • MATLAB求符号函数的函数值的方法

    在MATLAB中定义函数的方法有许多种 xff0c 比较常用的一种是定义符号变量 x 和 y 举一个简单的例子 xff1a 对函数 y 61 x 2 用上述方法的MATLAB语言如下 xff1a syms x y y 61 x 2 要想画出
  • C++寻找数组最大值和最小值

    寻找数组中的最大最小值 include lt iostream gt using namespace std include lt algorithm gt int main int n cin gt gt n int p 61 new i
  • Excel如何同时查找多个数据

    在使用多个excel表的时候 xff0c 有时需要在一个表中查找另一个表中的某些信息 xff0c 怎样能一步到位 xff0c 将所有要查找的信息一次找出来而不是一个个的Ctrl 43 F xff1f 这是前几天帮辅导员老师统计新生的数据时遇
  • python tkinter 全部组件(widget)及事件类型(event)一览

    对于一个简单的GUI程序设计来说 xff0c 我觉得无非就是三个要素 xff0c widget xff08 部件 xff09 xff0c layout xff08 布局 xff09 xff0c event xff08 事件的响应 xff09
  • DS18B20 1-WIRE ROM搜索算法详解

    转自 xff1a http blog sina com cn s blog 57ad1bd20102uxxw html 1 WIRE 搜索算法详解 xff08 1 xff09 0 前言 美信公司 xff08 http www maximin
  • 关于python tkinter 多线程依然无响应问题

    今天解决了一个GUI程序的多线程问题 因为GUI程序在执行高IO操作的时候容易出现假死和无响应的状态 xff0c 所以需要用到多线程 但我的程序开了线程之后依然是无响应状态 几次尝试 xff0c 终于找到问题所在 1 首先 xff0c 我的

随机推荐