从使用C的传感器获得的值获得平均值

时间:2011-12-10 00:05:17

标签: c arrays sensor average

好的,所以我得到这个代码来进行平均:(用C语言编写)

.
.
        int sum[3];
        int j;
        int avg;
      for(;;) //infinite loop
      {
       for(j=0;j<3;j++){
        i = ReadSensor(); // function that keeps saving sensor values as int i
        sum[j]=i;
        }
       avg=sum[0]+sum[1]+sum[2]+sum[3]; 
       printf("Sonar: %d \r \n", avg >> 2);
      }
.
.

这是对的吗?我移动2除以avg / 2 ^(2)即4 问题是我期待大约15的价值,但我得到大约8--9 ..我不知道为什么会发生这种情况?

基本上传感器的读数在15-17之间波动,我想获得平均值而不是打印噪声值。我的代码是否正确?那我为什么输错了??

4 个答案:

答案 0 :(得分:3)

看起来你的脚本只捕获三个值(j = 0,j = 1,j = 2),然后除以4。

答案 1 :(得分:3)

你有一些问题,这里有一些建议:

  • 您正在迭代内部循环3次,但是您说您有4个传感器,您应该将for循环更改为:for (j = 0; j < 4; j++)
  • sum是一个包含3个元素的数组,但在计算avgsum[3])时,您正在访问数组末尾的元素1。这将导致未定义的行为。出于这个原因,我应该将sum声明为char sum[4]
  • (可选)sum在上面的示例中不需要是数组,它可以只是int
  • (可选)如果要将int除以4,请使用除法运算符。编译器应该更好地优化您的特定体系结构的代码而不是您。

这是您的代码现在的样子,具体取决于您是否需要保留数组:

int sum[4];
int total, j;

for (;;)
{    
   total = 0; /* reset at every iteration of the outside loop */   

   for (j = 0; j < 4; j++) {
      sum[i] = ReadSensor();
      total += sum[i];
   }

   printf("Sonar: %d \r \n", total / 4);
}

OR

int total, j;

for (;;)
{    
   total = 0; /* reset at every iteration of the outside loop */   

   for (j = 0; j < 4; j++)
      total += ReadSensor();

   printf("Sonar: %d \r \n", total / 4);
}

答案 2 :(得分:2)

不是这个

avg=sum[0]+sum[1]+sum[2]+sum[3];

应该是

avg=sum[0]+sum[1]+sum[2];

作为循环以及声明int sum[3];意味着我们只尝试存储3个值。

现在,如果你想要4并且可以使用除法运算符。有新代码应该替换上面提到的行

int sum[4];

for(j=0;j<4;j++)

avg=sum[0]+sum[1]+sum[2]+sum[3]; // this part stays the same

答案 3 :(得分:1)

从传感器读取的值的数量需要两次。首先,控制for循环的迭代次数。第二,作为总和的除数。引入一个变量(比如N)来捕获它。

此外,通过移位划分听起来不对,因为这会将传感器的读数限制为2的幂。

enum { N = 4 };

sum = 0;
for( j = 0; j < N; j++) {
   i = ReadSensor(); // function that keeps saving sensor values as int i
   sum += i;
}
avg = sum / N; 
printf( "Sonar average: %d\n", avg );
相关问题