OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4328|回复: 6

一种adc过滤小算法,很巧妙但感觉有问题,路过的顺便分析一下

[复制链接]

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2015-9-17 16:21:07 | 显示全部楼层 |阅读模式
static int _filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff = m;
      sum += _buff;
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}

这个是在网上搜集的一段过滤算法,感觉他本来的目的应该是  更新数据的平均值,就是 有10个数据以移位的方法求平均值,感觉很巧妙,
但是如果真这样写进程序内,else 后边的会执行吗 
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-9-17 16:31:26 | 显示全部楼层
static int flag_first = 0这样定义的,会执行啊
回复 支持 反对

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-9-17 16:37:01 | 显示全部楼层
回复【2楼】k-ad:
------------------------------不是局部变量吗
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-9-17 16:37:29 | 显示全部楼层
一开始先定义flag_first = 0,执行if的。之后就开始执行else的~
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复 支持 反对

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2015-9-17 16:41:18 | 显示全部楼层
static int flag_first = 0;
定义flag_first的初始化状态,后面不会再执行,具体百度关键字static
回复 支持 反对

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-9-17 16:41:22 | 显示全部楼层
回复【4楼】Mcu_learning:
---------------------------------
是因为他是static 类型对吗 
ok 的确如此 长知识了   
考证:

特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值. 
示例程序一
#include <iostream>

using namespace std;

void staticLocalVar()
{
 static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作
 cout<<"a="<<a<<endl;
 ++a;
}

int main()
{
 staticLocalVar(); // 第一次调用, 输出a=0
 staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1
 return 0;
}

实验:

个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 反对

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2015-9-17 22:47:41 | 显示全部楼层
不知道第一个if(flag_first == 0)去掉对程序会不会有影响。
我的想法是当第一个数据m=0的时候,实际上判断这个flag_first好像是不需要的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 21:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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