R88 发表于 2013-10-25 15:58:56

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

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

那个value_buf就付了一次值,如何求平均?

R88 发表于 2013-10-25 16:11:35

我改了一下不知道这样是否还是“递推平均滤波法”:uint ad_filter(uchar channel)
{
        /*递推平均滤波法(又称滑动平均滤波法)*/
      #define N 12 //滤波初始化
      uint value_buf;       
      uchar count;
        uint sum=0;
        uchar i=0;
        for(count=0;count<N;count++)
                {
                        value_buf=MessAD(channel);
                        sum+=value_buf;
                }
        return (sum/N);
}

waterx3 发表于 2013-10-25 16:32:47

已 i++ 过了

xiaoqingy 发表于 2013-10-25 17:11:32

sum += value_buf;

R88 发表于 2013-10-25 19:27:11

waterx3 发表于 2013-10-25 16:32 static/image/common/back.gif
已 i++ 过了

那就给value_buf赋过一次值啊。。。

albert_w 发表于 2013-10-25 20:41:40

对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

后面的判断是用在buffer不满是也能出有效数字, 因为我的系统滑动时间达到了3秒, 不能让这三秒不出数或者出无效数. 坏处当然是需要做除法,影响速度, 如果都视着满buffer处理, 直接移位即可            oldDat = temp;
            temp = readD;
            iter = ++iter%32;
            sum = sum + readD - oldDat;
            if (len<32)
            {
                len++;
            }
            readD = sum / len;

R88 发表于 2013-10-26 09:09:53

albert_w 发表于 2013-10-25 20:41 static/image/common/back.gif
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

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

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

R88 发表于 2013-10-26 09:22:54

albert_w 发表于 2013-10-25 20:41 static/image/common/back.gif
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

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

他这个滑动貌似是先进先出原则,看您的程序,貌似不是啊。。

asdmaill 发表于 2013-10-26 10:21:18

我有个自己写的滑动滤波,要看看不

asdmaill 发表于 2013-10-26 10:24:11

for(k=0;k<10;k++)//将待排序数据传入排序缓存
    {
      sort_buff = Motor_U;
    }
    data_sort(sort_buff);//调用数据排序程序
    Motor_V = (sort_buff+sort_buff+sort_buff+sort_buff+
               sort_buff+sort_buff+sort_buff+sort_buff)>>3;//计算母线电压


//----------------------------------------------------------------
//数据排序程序
//----------------------------------------------------------------
unsigned int data_sort(unsigned int sort_buff)
{
    unsigned intswap_data;
    unsigned char j=0,k=0;

         for(k=0;k<=9;k++)             //数据排序
         {   
            for(j=k+1;j<10;j++)
            {
                if(sort_buff>sort_buff)
               {
               swap_data= sort_buff;
               sort_buff = sort_buff;
               sort_buff = swap_data;
               }

            }
         }
    return sort_buff;
}

asdmaill 发表于 2013-10-26 10:25:12

干脆贴出来,滑动排序,去极值,然后取平均

albert_w 发表于 2013-10-26 12:08:37

R88 发表于 2013-10-26 09:09 static/image/common/back.gif
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...

sum = value_buf;//?????弄成+=就对了

albert_w 发表于 2013-10-26 12:12:46

R88 发表于 2013-10-26 09:09 static/image/common/back.gif
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...

我也是先进先出的, 看temp, 在转圈. 缓冲区其实可以理解为32成员的环形. 刚被替换的位置iter要转一圈才再次轮到.
只是求和的时候偷懒了下, 利用上次的和,直接运算了两个元素. 坏处就是你要上带符号数了

R88 发表于 2013-10-26 12:45:34

albert_w 发表于 2013-10-26 12:12 static/image/common/back.gif
我也是先进先出的, 看temp, 在转圈. 缓冲区其实可以理解为32成员的环形. 刚被替换的位置iter要转一圈才再 ...

我刚看懂,原来头12次的函数执行读取的值都是不对的。。。

R88 发表于 2013-10-26 13:02:44

asdmaill 发表于 2013-10-26 10:25 static/image/common/back.gif
干脆贴出来,滑动排序,去极值,然后取平均

我觉得还是楼主位的程序比较简单哈。。。去极值在这个语句value_buf = get_ad();后面加上判断即可了。。。

albert_w 发表于 2013-10-26 13:09:49

R88 发表于 2013-10-26 12:45 static/image/common/back.gif
我刚看懂,原来头12次的函数执行读取的值都是不对的。。。

嗯, lz位开机会逐渐逼近. 所以我写了个变长的, 缓存多少个就计算多少个, 理解出数据

R88 发表于 2013-10-26 13:31:17

albert_w 发表于 2013-10-26 13:09 static/image/common/back.gif
嗯, lz位开机会逐渐逼近. 所以我写了个变长的, 缓存多少个就计算多少个, 理解出数据 ...

贴得代码太少了,没怎么看懂哈。。{:lol:}

1125526801 发表于 2019-9-13 21:35:52

asdmaill 发表于 2013-10-26 10:24
for(k=0;k>3;//计算母线电压




谢谢分享

darkbluewonder 发表于 2020-7-1 10:41:21

最近正要给AD进行滤波{:smile:}

VegeBird 发表于 2020-8-19 18:52:48

学习学习
页: [1]
查看完整版本: 这个AD滤波算法是不是有问题啊?