这个AD滤波算法是不是有问题啊?

2020-02-10 08:58发布

递推平均滤波法(又称滑动平均滤波法)
#define N 12
char value_buf[N];
char i=0;
char filter()
{
   char count;
   int  sum=0;
   value_buf[i++] = get_ad();
   if ( i == N )   i = 0;
   for ( count=0;count<N,count++)
      sum = value_buf[count];//?????
   return (char)(sum/N);
}

那个value_buf就付了一次值,如何求平均?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
R88
1楼-- · 2020-02-10 14:30
我改了一下不知道这样是否还是“递推平均滤波法”:
  1. uint ad_filter(uchar channel)
  2. {
  3.         /*递推平均滤波法(又称滑动平均滤波法)*/
  4.         #define N 12 //滤波初始化
  5.         uint value_buf[N];       
  6.         uchar count;
  7.         uint sum=0;
  8.         uchar i=0;
  9.         for(count=0;count<N;count++)
  10.                 {
  11.                         value_buf[i++]=MessAD(channel);
  12.                         sum+=value_buf[count];
  13.                 }
  14.         return (sum/N);
  15. }
复制代码
waterx3
2楼-- · 2020-02-10 15:48
已 i++ 过了
xiaoqingy
3楼-- · 2020-02-10 19:43
 精彩回答 2  元偷偷看……
R88
4楼-- · 2020-02-10 20:07
waterx3 发表于 2013-10-25 16:32
已 i++ 过了

那就给value_buf赋过一次值啊。。。
albert_w
5楼-- · 2020-02-10 20:25
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

后面的判断是用在buffer不满是也能出有效数字, 因为我的系统滑动时间达到了3秒, 不能让这三秒不出数或者出无效数. 坏处当然是需要做除法,影响速度, 如果都视着满buffer处理, 直接移位即可
  1.             oldDat = temp[iter];
  2.             temp[iter] = readD;
  3.             iter = ++iter%32;
  4.             sum = sum + readD - oldDat;
  5.             if (len<32)
  6.             {
  7.                 len++;
  8.             }
  9.             readD = sum / len;
复制代码
R88
6楼-- · 2020-02-10 23:14
albert_w 发表于 2013-10-25 20:41
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

后面的判断是用在buffer不满是也能出有 ...

的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.amobbs.com/forum.php? ... amp;highlight=ad%2B滤波

一周热门 更多>