请教数位滤波功能

espon2006   2012-1-4 10:29 楼主
各位先进,大家好,能否提供或说明其数位滤波在MSP430G2452上的可行性?
最近老师要我制作这个功能於2452身上,方法为输入一波形进入2452的PIN脚,再由滤波後输出至PC端显示其滤波效果,实在快昏头ㄌ。
希望能有先进能帮帮忙,或是提点开释一下,一直通不了这一关阿

回复评论 (1)

你可以将波形输入到ADC引脚,然后采样后进行简单的一阶数字滤波实现啊

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

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
{

    value_buf[count]=get_data();

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

}



for(j=0;j
{

    for(value_buff>value_buff[i+1]

       {

         temp=value_buff;

         value_buff=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
{

    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 code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};  //code数组为加权系数表,存在程序存储区

char code sum_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
{

    value_buff[count]=get_data();

       delay();

}

for(count=0;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
       sum=value_buff[count];

return (char)(sum/N);

}



今天就写到这,因为数字滤波的算法还有很多种方法,比如一阶滞后低通滤波器(惯性滤波法),限时滤波,容错冗余三中取二滤波法等等。不过由于个人能力和时间的原因,还没能把它们一一地列出。以后我会不断地找资料把它们完善。
点赞  2012-1-5 18:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复