当前位置: 代码迷 >> 单片机 >> 怎么在单片机中实现高效的数据实时滤波
  详细解决方案

怎么在单片机中实现高效的数据实时滤波

热度:30   发布时间:2016-04-28 16:11:36.0
如何在单片机中实现高效的数据实时滤波
在中断程序中没一个采样周期都会从外设采集到一个数据readbuf[0],该数据中存在毛刺,毛刺可认为是连续两次采样结果之差的绝对值大于一个阈值N,N为宏定义的一个数。但如果连续M次都出现这样的大数则认为是有效数字,M也为宏定义。
由于单片机资源有限,实时性又要求很高,因此不值如何才能高效滤除毛刺又不降低系统的实时性。

    原有程序如下:这个算法没有写完,没有考虑到连续M次大数应该为有效数据的情况,而且对于单片机来数这样的算法已经相当复杂了,希望那位大虾能够指点一种更简单高效的算法,而且需要考虑到M个大数的情况。

testbuf=   readbuf[0];     //将数据放入一个临时变量
  if(testbuf> =65   &&   testbuf <=300)                 //数值范围滤波
  {
  testbuf=(uchar)(testbuf-64);                   //数值偏置预处理

    if(abs(readbuf1[0]-testbuf) <=N     )     //判断两次数据之差是否大于N
        readbuf[0]=testbuf;   //不大于的话保留数据至readbuf[0]
    else
        {
    if(first0!=1)//如果大于N又分为两种情况,因为程序第一次运行时前次数据是没有的需要忽略第一次运行的数据差大于N的情况
                        goto   endint;                             //无效数据   跳出此次采样
    else
        {
readbuf[0]=testbuf;
first0=0;//将是否是第一次采集的标志为清零
}
}

readbuf1[0]=readbuf[0];//将此次有效采样值作为下次采样的比较值
send(readbuf[0]);//发送有效数据
}
  else
        {
readbuf[0]=readbuf1[0];//数据超出范围的话有效数据为上次采样的数据  
  }

------解决方案--------------------
很难有定论,关键要看使用的方法
  相关解决方案