单片机的数字滤波设计

发布者:和谐共处最新更新时间:2019-04-28 来源: eefocus关键字:单片机  数字滤波  算法 手机看文章 扫描二维码
随时随地手机看文章

1 数字滤波设计原理

这里有很多种数字滤波方法,我们见选用其中几种来进行设计,如中值滤波、算术平均滤波、加权平均滤波等等。所以下面我将详细介绍它们。


1.1 中值滤波

       中位值滤波是先对某一参数连续采样N次(一般N取奇数),然后把N次采样值按从小到大排列,取中间值为本次采样值。


       该滤波方法实际上是一种排序方法,我在此采用的是冒泡法排序。由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换。


       该算法的样例子程序如下:


#define N 11  //N值可根据实际情况调整 

char filter() 

{

     char value_buf[]; 

     char count,i,j,k,temp; 

     for(count=0;count     {

           value_buf[count]=get_data();

           delay();

     }

     for(i=0;i     {   

         k=i; 

      for(j=i+1;j      if(value_buf[j]      temp=value_buf[k];

      value_buf[k]=value_buf[i];

      value_buf[i]=temp;

     }

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

}


 中位值滤波能有效地克服偶然因素引起的波动或采样器不稳定引起的误码等脉冲干扰。对温度、液位等缓慢变化的被测参数采用此算法能收到良好的滤波效果,但对于流量、压力等快速变化的数据,不宜采用中位值滤波。


1.2 算术平均滤波

     算术平均滤波法适用于对一般的具有随机干扰的信号进行滤波。这种信号的特点是信号本身在某一数值范围附近上下波动,如测量流量、液位时经常遇到这种情况。算术平均滤波法是要按输入的N 个采样数据,寻找这样一个Y,使得Y 与各个采样值之间的偏差的平方和最小。


    具体实现此算法的子程序如下:


#define N 12

char filter() 

{

       int count;

       int sum=0;

      for(count=0;count     {

            sum+=get_ad();

            delay();

     }

     return (char)(sum/N);

}

    算术平均滤波适用于对一般具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值范围附近做上下波动,在这种情况下仅取一个采样值做依据显然是不准确的。算术平均滤波对信号的平滑程序完全取决于N,当N较大时,平滑度高,但灵敏度低;当N较小时,平滑度低,但灵敏度高,应视具体情况选取N,以便既少占用计算时间,又达到最好的效果。

1.3 加权平均滤波



      在算术平均滤波和移动平均滤波中,N次采样值在输出结果中的权重是均等的,取1/N。用这样的滤波算法,对于时变信号会引入滞后,N值越大,滞后越严重。为了增加新采样数据在移动平均中的权重,以提高系统对当前采样值中所受干扰的灵敏度,可采用加权平均滤波,它是移动平均滤波算法的改进。


     加权平均滤波是对连续N次采样值分别乘上不同的加权系统之后再求累加和,加权系统一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的辨识。各个加权系统均为小于1的小数,且满足总和等于1的约束条件。这样,加权运算之后的累加和即为有效采样值。


      为方便计算,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后便是有效采样值。具体的样例子程序如下:


//code数组为加权系统表,存在ROM区。

#define N 12

char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};

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

char filter_5()

{

     char count;

     char value_buf[N];

     int sum=0;

     for(count=0;count    {

         value_buf[count]=get_data();

         delay();

    }

    for(count=0;count             sum+=value_buf[count]*jq[count];

     return (char)(sum/sum_jq);

}

1.4 中位值平均滤波

  它相当于是“中位值滤波法”和“算术平均滤波法”的结合。它连续采样N个数据,然后去掉一个最大值和一个最小值,最后计算N-2个数据的算术平均值。一般N值的选取:3-14。


       具体算法程序如下:


#define N 12  

char filter()  

{  

       char count,i,j;  

       char value_buf[N];  

       int sum=0;  

       for (count=0;count      {  

           value_buf[count] = get_ad();  

           delay();  

       }  

       for (j=0;j      {  

           for (i=0;i          {  

               if ( value_buf[i]>value_buf[i+1] )  

              {  

                        temp = value_buf[i];  

                        value_buf[i] = value_buf[i+1];  

                        value_buf[i+1] = temp;  

               }  

           }  

       }  

         for(count=1;count                     sum += value[count];  

         return (char)(sum/(N-2));  

}

这种滤波方法兼容了移动平均滤波算法和中位值滤波算法的优点,所以无论对缓慢变化的信号,还是对快速变化的信号,都能取得较好的滤波效果。


1.5 限幅滤波

限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值ΔY比较,如果两次采样值的差值超过了允许的最大偏差值ΔY,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除。剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效。可用如下公式表示:


|Yn-Yn-1|≤ΔY;则Yn有效


|Yn-Yn-1|>ΔY;则Yn-1有效


此算法的样例子程序如下:




#define A 10  //A值可根据实际情况调整

 

char data;   //上一次的数据

 

char filter_1()

 

{

 

char datanew; //新数据变量

 

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

 

//滤波算法

 

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

 

return data;

 

return datanew;

 

}



该算法主要用于处理变化比较缓慢的数据,如温度、物体的位置等。使用时关键在于最大偏差值的Δy的选择,通常可根据经验获得,也可按照输出参数可能的最大变化速度Vmax及采样周期T来决定ΔY的值,即ΔY=VmaxT。


关键字:单片机  数字滤波  算法 引用地址:单片机的数字滤波设计

上一篇:单片机常用滤波算法
下一篇:10种软件滤波方法的及示例程序

推荐阅读最新更新时间:2024-11-09 10:46

[单片机] crc32
// Referenced from http://www.w3.org/TR/PNG/#D-CRCAppendix #ifdef MAKE_CRC32_TABLE static unsigned long crc_table ; static int crc_table_computed = 0; static void make_crc_table(void) { unsigned long c; unsigned long n, k; for (n = 0; n 256; n++) { c = n; for (k = 0; k 8; k++) { if (c & 1
[单片机]
如何模拟实现应用在数据采集系统中的89C51单片机I/O口串行通信?
目前普遍采用的MCS51 和PIC 系列单片机通常只有一个(或没有)UART异步串行通信接口,在应用系统中若需要多个串行接口(例如在多机通信系统中,主机既要和从机通信又要和终端通信)的情况下,通常的方法是扩展一片8251 或 8250 通用同步/异步接收发送芯片(USART),需额外占用单片机I/O 资源。 MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS
[单片机]
如何模拟实现应用在数据采集系统中的89C51<font color='red'>单片机</font>I/O口串行通信?
本土车芯打响突围战,车规MCU迎来重磅玩家
对于本土车芯企业来说,这是一个充满机遇的时代。 一方面,在智能 电动汽车 发展趋势下,汽车产业资本加速向供应链端倾斜,车芯企业有了更多的发展资金与底气。另一方面,“芯荒”下汽车供应链的变革也给本土车芯企业提供了发展与赶超的时间。 这个充满想象空间的冰山正浮出海面,给行业带来新的兴奋点的同时,我们也看到更多的本土车芯企业走了出来,短时间内批量交付了多条车规产品线,且凭借着更灵活的响应能力、更开放的开发模式,开始受到主机厂的广泛认可与选择。 汽车供应链变革正当时 2021年以来,主机厂与芯片厂商达成战略合作关系的信息不绝如缕,越来越多主机厂选择与芯片厂商建立更紧密的合作关系。在近日GTC大会上,比亚迪也官宣与英伟达达成
[汽车电子]
本土车芯打响突围战,车规<font color='red'>MCU</font>迎来重磅玩家
采用AT89S52单片机实现机载电气盒测试仪的设计与用途介绍
1 引言 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。AT89S52使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,AT89S52拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,
[单片机]
采用AT89S52<font color='red'>单片机</font>实现机载电气盒测试仪的设计与用途介绍
51单片机最小系统的构成与绘制
一、51单片机最小系统构成 51单片机最小系统是一个最基本的硬件配置,通常由一个51单片机、晶体振荡器、电源、外部芯片(如LCD屏幕、键盘、LED等)以及必要的电路组成。其主要功能是提供一种简单的方式来开始使用和学习51单片机,使其能够进行基本的输入、输出、计算和控制其具体构成如下: 1、51单片机芯片:51单片机是一种基于哈佛结构的8位微控制器,具有强大的输入输出能力、易于编程、稳定可靠等特点。目前市面上流行的有AT89C51、AT89S51、STC89C51等。 2、晶体振荡器:晶体振荡器是提供时钟信号的重要组成部分,一般为11.0592MHz,它能够提供稳定的时钟信号,保证51单片机的正常工作。 3、电源:为51单片机最
[单片机]
51<font color='red'>单片机</font>最小系统的构成与绘制
基于stc89c52单片机控制步进电机
51单片机是许多单片机初学者的入门开发板,今天给大家做一个基于51内核的stc89c52板子来控制步进电机,可以实现步进电机的正反转、加减速。另外,使用板子自带的Ds18b20模块进行环境测温,并将测得的数据用lcd液晶屏进行显示。并在温度达到设定值时蜂鸣器报警。 第一步,硬件 1 stc89c52开发板,这个板子就不多讲了,网上有很多 2 步进电机,用的是网上非常便宜的4相5线步进电机 28BYJ-48,电压为5v 第二,程序 1 步进电机程序,定义步进电机的IO口以及方向以便调速和转向 2 LCD程序,主要是三个函数,一个初始化函数,一个写函数,一个显示函数 3 温度传感器Ds18b20,主要是这个读函
[单片机]
基于stc89c52<font color='red'>单片机</font>控制步进电机
“缺芯”持久战下,国产MCU突围进行时
转眼间,2022年进程将近过半。相较于去年,今年全球芯片短缺的情况虽然在一定程度上得到了缓解,但总体仍然处于紧缺状态,距离全面缓解还有一段时间。 特别是因疫情、地缘冲突等的持续,以及终端市场新能源汽车需求暴增,业内普遍认为,缺芯在今明年甚至更长远的未来,还会继续存在。因此,如何实现更稳定的芯片供应和更长远的供应链安全,依然是整车厂及Tier1亟待思考的问题。 多重因素影响下,缺芯恐成持久战 图片来源:沈晖新浪微博截图 5月31日,威马汽车 CEO 沈晖在个人微博上谈及了对近期网传博世等汽车零部件酝酿涨价的看法,他表示,博世还有其他Tier1涨价不是传闻,且这次涨价的“主角”依然是芯片。“我们做了简单估算,智能
[汽车电子]
“缺芯”持久战下,国产<font color='red'>MCU</font>突围进行时
瑞萨推出全新RA8入门级MCU产品群, 提供极具性价比的高性能Arm Cortex-M85处理器
RA8E1与RA8E2提供理想的标量和矢量计算性能以及同类卓越的功能集,满足价值导向型市场需求 2024 年 11 月 5 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子 今日宣布,推出RA8E1和RA8E2微控制器(MCU)产品群,进一步扩展其业界卓越和广受欢迎的MCU系列。 2023年推出的RA8系列MCU是首批采用Arm® Cortex®-M85处理器的MCU,实现市场领先的6.39 CoreMark/MHz(注)性能。新款RA8E1和RA8E2 MCU在保持同等性能的同时,通过精简功能集降低成本,成为工业和家居自动化、办公设备、医疗保健和消费品等大批量应用的理想之选。 RA8E1和RA8E2 MCU采用
[单片机]
瑞萨推出全新RA8入门级<font color='red'>MCU</font>产品群,  提供极具性价比的高性能Arm Cortex-M85处理器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved