打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
单片机的数字滤波器设计

数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术广泛应用在各个领域。比如摄像头,麦克风,都是数据采集的工具。被采集数据是已经被转换为电信号的各种物理量,比如温度、水位、风速、压力等。可以是模拟量,也可以是数字量。在互联网行业快速发展的今天,数据采集已经被广泛应用于互联网以及分布式领域,数据采集领域已经发生了重要的变化。

而在数据采集中存在着各种噪声。滤除噪声的方法有很多种,既有数字滤波器,也有模拟滤波器。这里我们采用了基于单片机和C语言来设计并开发数字滤波系统。

我们针对单片机数据采集系统中经常出现的随机干扰,通过手动输入来模拟数据采集过程,验证了集中使用较为普遍的克服随机告饶的单片机数字滤波算法,并给出了相应的C程序,尤其对中位值滤波和中位值平均滤波算法程序进行了改进。同时,也对这集中滤波算法进行了比较,并指出了每一种算法的具体使用范围和注意事项。另外,我们使用了PROTEUS进行仿真验证了这集中滤波方法。

另外,我们还使用了ADDA来采集及输出数据。

1.     数字滤波设计原理

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

1.1中值滤波

中位值滤波是先对某一参数连续采集N次(一般N取奇数),然后把N次采样值按从小到达的顺序排列,取中间值为本次采样值。该滤波方法实际上市一中排序方法。我们在此采用的是冒泡法排序。由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换。

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

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

 3 char filter()

 5 {

 7      char value_buf[];

 9      char count,i,j,k,temp;

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

13      {

14            value_buf[count]=get_data();

17            delay();

18      }

20      for(i=0;i<N-1;i++) //选择排序

22      {  
         k=i;

24       for(j=i+1;j<N;j++)

26       if(value_buf[j]<value_buf[k]) k=j;

28       temp=value_buf[k];

30       value_buf[k]=value_buf[i];

32       value_buf[i]=temp;

34      }

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

37 }

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

1.2     算术平均滤波

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

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

1 #define N 12

 2 char filter()
 5 {

 7        int count;

 9        int sum=0;

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

13      {

15             sum+=get_ad();

16             delay();

17      }

18      return (char)(sum/N);

19 }

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

1.3加权平均滤波

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

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

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

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

 2 #define N 12

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

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

 5 char filter_5()

 6 {

 7      char count;

 8      char value_buf[N];

 9      int sum=0;

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

11     {

12          value_buf[count]=get_data();

13          delay();

14     }

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

16              sum+=value_buf[count]*jq[count];

17      return (char)(sum/sum_jq);

18 }

1.4 中位值平均滤波

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

       具体算法程序如下:

#define N 12 

 2 char filter() 

 3 {  

 4        char count,i,j; 

 5        char value_buf[N]; 

 6        int sum=0; 

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

 8       { 

 9            value_buf[count] = get_ad(); 

10            delay(); 

11        } 

12        for (j=0;j<N-1;j++) 

13       { 

14            for (i=0;i<N-j;i++) 

15           { 

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

17               { 

18                         temp = value_buf[i]; 

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

20                         value_buf[i+1] = temp; 

21                } 

22            } 

23        } 

24          for(count=1;count<N-1;count++) 

25                      sum += value[count]; 

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

27 } 

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

1.5 限幅滤波

限幅滤波的基本原理是把两次相邻时刻(nn-1)的采样值YnYn-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

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何利用单片机和C语言来设计数字滤波系统
单片机数字滤波的算法
数字滤波算法
实现种软件滤波方法及其示例程序c
【滤波器学习笔记】一阶RC低通滤波
VC++动态链接库编程之DLL典型实例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服