搜索
bottom↓
回复: 19

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

[复制链接]

出0入399汤圆

发表于 2013-10-25 15:58:56 | 显示全部楼层 |阅读模式
递推平均滤波法(又称滑动平均滤波法)
#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就付了一次值,如何求平均?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入399汤圆

 楼主| 发表于 2013-10-25 16:11:35 | 显示全部楼层
我改了一下不知道这样是否还是“递推平均滤波法”:
  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. }
复制代码

出0入12汤圆

发表于 2013-10-25 16:32:47 | 显示全部楼层
已 i++ 过了

出0入0汤圆

发表于 2013-10-25 17:11:32 | 显示全部楼层
sum += value_buf[count];

出0入399汤圆

 楼主| 发表于 2013-10-25 19:27:11 | 显示全部楼层
waterx3 发表于 2013-10-25 16:32
已 i++ 过了

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

出0入42汤圆

发表于 2013-10-25 20:41:40 | 显示全部楼层
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

后面的判断是用在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;
复制代码

出0入399汤圆

 楼主| 发表于 2013-10-26 09:09:53 | 显示全部楼层
albert_w 发表于 2013-10-25 20:41
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

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

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

出0入399汤圆

 楼主| 发表于 2013-10-26 09:22:54 | 显示全部楼层
albert_w 发表于 2013-10-25 20:41
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧

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

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

出0入0汤圆

发表于 2013-10-26 10:21:18 | 显示全部楼层
我有个自己写的滑动滤波,要看看不

出0入0汤圆

发表于 2013-10-26 10:24:11 | 显示全部楼层
for(k=0;k<10;k++)//将待排序数据传入排序缓存
    {
        sort_buff[k] = Motor_U[k];
    }
    data_sort(sort_buff);  //调用数据排序程序
    Motor_V = (sort_buff[1]+sort_buff[2]+sort_buff[3]+sort_buff[4]+
               sort_buff[5]+sort_buff[6]+sort_buff[7]+sort_buff[8])>>3;  //计算母线电压


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

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

            }
         }
    return sort_buff[10];  
}

出0入0汤圆

发表于 2013-10-26 10:25:12 | 显示全部楼层
干脆贴出来,滑动排序,去极值,然后取平均

出0入42汤圆

发表于 2013-10-26 12:08:37 | 显示全部楼层
R88 发表于 2013-10-26 09:09
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...

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

出0入42汤圆

发表于 2013-10-26 12:12:46 | 显示全部楼层
R88 发表于 2013-10-26 09:09
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...

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

出0入399汤圆

 楼主| 发表于 2013-10-26 12:45:34 | 显示全部楼层
albert_w 发表于 2013-10-26 12:12
我也是先进先出的, 看temp, 在转圈. 缓冲区其实可以理解为32成员的环形. 刚被替换的位置iter要转一圈才再 ...

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

出0入399汤圆

 楼主| 发表于 2013-10-26 13:02:44 | 显示全部楼层
asdmaill 发表于 2013-10-26 10:25
干脆贴出来,滑动排序,去极值,然后取平均

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

出0入42汤圆

发表于 2013-10-26 13:09:49 | 显示全部楼层
R88 发表于 2013-10-26 12:45
我刚看懂,原来头12次的函数执行读取的值都是不对的。。。

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

出0入399汤圆

 楼主| 发表于 2013-10-26 13:31:17 | 显示全部楼层
albert_w 发表于 2013-10-26 13:09
嗯, lz位开机会逐渐逼近. 所以我写了个变长的, 缓存多少个就计算多少个, 理解出数据 ...

贴得代码太少了,没怎么看懂哈。。

出0入0汤圆

发表于 2019-9-13 21:35:52 | 显示全部楼层
asdmaill 发表于 2013-10-26 10:24
for(k=0;k>3;  //计算母线电压

谢谢分享

出0入0汤圆

发表于 2020-7-1 10:41:21 | 显示全部楼层
最近正要给AD进行滤波

出0入0汤圆

发表于 2020-8-19 18:52:48 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 14:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表