打印

请教滑动平均滤波法

[复制链接]
7563|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jack.king|  楼主 | 2010-12-30 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教滑动平均滤波法。在网上看到别人写的程序如下:
#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);
}

请问为什么最后sum/N 我实际用了下,好像有点问题

相关帖子

沙发
yewuyi| | 2010-12-30 14:49 | 只看该作者
i应该是个全局变量。
这个函数的作用就是每次把读到的AD值送到value_buf[N]中i指向的地址。
sum对value_buf[N]中所有的元素求和。
求和值再除以12做平均。

从表面看,这个程序没什么错误。

使用特权

评论回复
板凳
mmax| | 2010-12-30 14:51 | 只看该作者

sum = value_buf[count];

少个+号。

使用特权

评论回复
地板
jack.king|  楼主 | 2010-12-30 15:03 | 只看该作者
呵呵,我也认为少了个+号,可是网络上面搜索到的都没有!呵呵!我在应用的时候加了+号!是可以的!

使用特权

评论回复
5
jack.king|  楼主 | 2010-12-30 15:04 | 只看该作者
请问:yewuyi大侠,我看不出有求和啊!

使用特权

评论回复
6
老鱼探戈| | 2010-12-30 15:27 | 只看该作者
改成 sum + = value_buf[count];

使用特权

评论回复
7
jack.king|  楼主 | 2010-12-30 15:54 | 只看该作者
呵呵!

使用特权

评论回复
8
yewuyi| | 2010-12-30 16:25 | 只看该作者
呵呵,确实少了个+

使用特权

评论回复
9
yinchunhua| | 2010-12-30 19:35 | 只看该作者
这个程序不对的,不是少+号的问题。如果有+号那就是平均滤波了,而不是滑动滤波算法。滑动滤波算法应该是这样的:
#define N 12
char value_buf[N];
char i=0;
int sum=0;
char filter()
{
  char Temp_Value;

  Temp_Value = get_ad();
  sum += value_buf[i] - Temp_Value;
  value_buf[i++] = Temp_Value;
  if ( i == N ) i = 0;
  return (char)(sum/N);
}//注意 value_buf全部初始化为第一次采集的值!!

使用特权

评论回复
10
不亦心| | 2010-12-30 20:12 | 只看该作者
LZ位的程序就是少了个“+”

你给出的是程序有误,,,

平均滤波,是下面的,你看看和LZ位的区别
#define N 12
char filter()
{
int sum=0;
for(count=0;count<N;count++)
{
sum+=get_ad();
delay();
}
return (char)(sum/N);
}



9# yinchunhua

使用特权

评论回复
11
jack.king|  楼主 | 2010-12-30 20:55 | 只看该作者
我找的程序是直接复制的
地址为:http://blog.21ic.com/user1/349/archives/2005/2886.html

使用特权

评论回复
12
mmax| | 2010-12-30 22:40 | 只看该作者
另外一种近似的平均方法,不用数组,而且平均的点数可以在软件中根据需要随时调整。
比如判断是动态N取小一些,判断是稳态,N就取大一些。

int N = 12;  //全局变量平均点数
int nAverageValue = 0;//平均值

void average()
{
       long temp = 0;
       int v = get_ad();
       temp =  nAverageValue *(N-1) +v;
       nAverageValue = temp  / N;
}

使用特权

评论回复
13
5_0_5| | 2010-12-30 23:03 | 只看该作者
滑动滤波本身就是一种平均滤波

LZ的程序少个+号,9楼的代码相对高效些

最好是把N改成2的幂数,求平均直接左移

使用特权

评论回复
14
mmax| | 2010-12-30 23:09 | 只看该作者
9楼的程序是不对的。

假设每次采集回来的数是100不变,很多次运算后函数返回是0。呵呵。

使用特权

评论回复
15
YINGZEZIGA| | 2010-12-31 11:31 | 只看该作者
5_0_5说的没有错,滑动滤波本身就是均值滤波的一种而已,而且程序中的数组只是保存中间变量,不用每一次都加上一遍,只需要像yinchunhua那样吃一个吐一个就可以了,应用的时候要注意不要使SUM值越界,另外使用2的幂次可以防止除法运算。

使用特权

评论回复
16
nongfuxu| | 2010-12-31 14:39 | 只看该作者
干嘛不用中值滤波,滑动了取中间平均值.

使用特权

评论回复
17
yuanquan12345| | 2015-11-2 16:21 | 只看该作者
正需要,做个记号。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

488

主题

2158

帖子

1

粉丝