软件实现数字滤波

2023-10-30

数字滤波器,说白了,就是多次采样求平均值的一个过程,精确一点的,就是再顺序排列,去掉首位再求平均值,哈哈!!这就是数字滤波器的原理!!就是求平均数!!




单片机数字滤波的算法

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

 

采用数字滤波算法克服随机干扰的误差具有以下优点

l         数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

l         数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

l         只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

l         在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

 

(1)限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

 

算法的程序代码如下:

 

#define A               //允许的最大差值

char data;               //上一次的数据

char filter()

{

char datanew;       //新数据变量

datanew=get_data();   //获得新数据变量

if((datanew-data)>A||(data-datanew>A) )

   return data;

else

  return datanew;

}

 

说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

  

(2)中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

 

算法的程序代码如下:

#define N 11   //定义获得的数据个数

char filter()

{

   char value_buff[N];           //定义存储数据的数组

char count,i,j,temp;

for(count=0;count<N;count++) //获取数据

{

   value_buf[count]=get_data();

   delay();                //如果采集数据比较慢,那么就需要延时或中断

}

 

for(j=0;j<N-1;j++)           //用冒泡法对数据进行排序,当然最好用其他排序方法

{

   for(value_buff[i]>value_buff[i+1]

       {

         temp=value_buff[i];

         value_buff[i]=value_buff[i+1];

         value_buff[i+1]=temp;

    }

}

return value_buff[(N-1)/2];

 

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

 

(3)算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

算法的程序代码如下:

char filter()

{

int sum=0;

for (count=0;count<N;count++)

{

   sum+=get_data();

   delay():

}

return (char)(sum/N);

}

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

 

 

(4)加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

 

                              

 

 

                              

式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

 

样例程序代码如下:

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区

char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

char filter()

{

char count;

char value_buff[N];

int sum=0;

for(count=0;count<N;count++)

{

   value_buff[count]=get_data();

       delay();

}

for(count=0;count<N;count++)

       sum+=value_buff[count]*jq[count];

return (char)(sum/sum_jq);

}

 

(5)滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

 

程序代码如下:

char value_buff[N];

char i=0;

char filter()

{

    char count;

    int sum=0;

    value_buff[i++]=get_data();

    if(i==N)

         i=0;

for(count=0;count<N;count++)

       sum=value_buff[count];

return (char)(sum/N);

}

 

今天就写到这,因为数字滤波的算法还有很多种方法,比如一阶滞后低通滤波器(惯性滤波法),限时滤波,容错冗余三中取二滤波法等等。不过由于个人能力和时间的原因,还没能把它们一一地列出。以后我会不断地找资料把它们完善

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

软件实现数字滤波 的相关文章

随机推荐

  • 实时音频编解码之十一Opus编码

    本文谢绝任何形式转载 谢谢 第四章 Opus编码 Opus是较为成熟的开源商用语音编解码器 其编码质量高且无版权使用费 因WebRTC标准中规定要支持该音频编码器 所以当今各大浏览器都支持Opus编码器 Opus有很多突出的优点 如延迟低
  • SpringBoot-01工程初始化及打包运行

    开发环境 Idea Jdk环境 jdk1 8 开发电脑 Mac 一 工程初始化记录 1 创建一个空工程 2 创建springboot module 配置工程的指定jdk 有时候工程无法识别到mvn工程 可以邮件pom xml文件添加为mvn
  • Xshell7家庭和教育版去除免费许可证弹窗

    Xshell7的版本已经对普通个人用户免费使用了 但是每次关闭软件的时候 总是会弹出一个免费许可证弹窗的提醒 虽然几秒钟之后 就会自动关闭 但是就算不是强迫症 估计也会挺难受吧 参考网上一些朋友的方法 可以在安装完成后 利用反编译方法去除
  • 大学职业生涯规划书_计算机专业,4000字,合肥大学

    前言 不知不觉中自己已然跨入了大学 这是一个知识的海洋 学识渊博的老师和和周围的一群学霸同学 以及美丽的校园环境和浓厚的学习环境 这一切让我不得不加快脚步 不敢松懈 通过一学期的学习 我也充分的感受到大学貌似就是个小型社会 在这里大限度的自
  • PyCharm调试

    目录 一 PyCharm命令运行项目 1 打开自己创建的Django项目 编辑 2 配置Django Server
  • Spring Boot高频题

    1 什么是Spring 宏观上来说 是Spring帮我们构建的整个生态圈 微观上来说 就是我们平时所说的SSM中的Spring框架 在官网中就是Spring FrameWork框架 2 什么是Spring Boot Spring Boot是
  • 微信小程序后台的HTTP API 上传文件功能

    最近帮一家公司做微信小程序 同时需要帮着做后台 遇到一个上传文件的功能 其实没多难 记录一下 我用的是python语言后台 就简单的把实现原理说一下 我看了微信小程序开发文档 上面是这么说的 按照文档所说 提交信息 构建url url ht
  • AI入门之神经网络(9)基于c++、opencv的dnn模块的视频手势识别

    基于c opencv的dnn模块的手势识别 先看效果 老规矩话不多 实现的方法步骤 细节全在我的代码注释里面 只你跟着注释写 相信你也写得出来的 include
  • C#-OPENCVSHARP多目标追踪-传统算法

    C OPENCVSHARP多目标追踪 传统算法 在学习C 中的opencvsharp操作过程中 了解到通过传统算法便可实现在视频中得简易版多目标追踪 网上所发表的文章中使用Nuget程序包较为老旧 同时代码操作较为复杂 由此发表该文章 如有
  • LeetCode Plus One Java版解题报告

    https oj leetcode com problems plus one 题意 一个整数按位存储于一个int数组中 排列顺序为 最高位在array 0 最低位在 n 1 例如 98 存储为 array 0 9 array 1 8 解题
  • Makefile六层功力的锻炼(一)

    Makefile六层功力的锻炼 一 Makefile六层功力的锻炼 一 一 概述 二 关于程序的编译和链接 三 Makefile介绍 1 Makefile的规则 2 一个示例 3 make是如何工作的 四 最后 声明 大部分内容来自陈皓的跟
  • 将DOTA标签格式转为VOC格式形成xml文件

    DOTA数据集的格式为 前8个数字分别为gt的4个点坐标 x y 转换为VOC标注的代码为 这里有两种选择 1 将原有的8坐标转换为4坐标的最小外界矩形 即hbb形式 xmin ymin xmax ymax 2 保留原有 坐标 即obb形式
  • 【大数据】Flink 详解(一):基础篇

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 编程(代码、软件)规范(适用嵌入式、单片机、上位机等)

    目录 前言 第1章 文件 1 1 头文件 1 2 定义文件 第2章 注释规范 2 1 共性注释规范 2 2 文档注释规范 2 3 C语言风格注释规范 第3章 排版规范 3 1 缩进与对齐 风格 3 2 空行 3 3 代码行 3 4 代码行内
  • Spring事务和事务传播机制

    目录 一 Spring中事务的实现 1 手动式事务 编程式事务 2 声明式事务 二 事务隔离级别 1 MySQL事务隔离级别 2 Spring事务隔离级别 三 Spring事务传播机制 一 Spring中事务的实现 1 手动式事务 编程式事
  • 音频信号调制,解调,加噪,去噪,滤波,matlab实现

    题目分析 调制解调通信系统实现 录制一段语音信号 对其进行幅度调制解调 对比两端语音信号的频谱 并播放看其是否有偏差 在此基础上 将调制后的语音信号加上一个噪声 再滤波 观察恢复语音信号的失真现象 需要完成以下任务 采集一段语音信号 做原信
  • ACE_Message_Block

    ACE Message Block 2009 06 28 10 16 15 分类 ACE 字号 订阅 ACE Message Block是ACE中一个很核心的基础类 应用非常广泛 所以需要花点心思去研究 学习的过程有几点心得体会记录下吧 创
  • Java完数【纠错版】

    完数 纠错版 一个数如果恰好等于它的因子之和 这个数就称为 完数 例如6 1 2 3 编程找出1000以内的所有完数 输入 无 输出 i1 i2 i3 输入用例 null 输出用例 6 28 496 public class Main pu
  • nodejs与javascript

    标题 Nodejs 1 nodejs和javascript Node js 不是一种独立的语言 也不是一个 JavaScript 框架 是一个让 JavaScript 运行在服务端的开发平台 它让 JavaScript 成为脚本语言世界的一
  • 软件实现数字滤波

    数字滤波器 说白了 就是多次采样求平均值的一个过程 精确一点的 就是再顺序排列 去掉首位再求平均值 哈哈 这就是数字滤波器的原理 就是求平均数 单片机数字滤波的算法 单片机主要作用是控制外围的器件 并实现一定的通信和数据处理 但在某些特定场