Получение среднего значения, полученного датчиком с помощью C - PullRequest
0 голосов
/ 10 декабря 2011

Хорошо, поэтому я получаю этот код для усреднения: (написано на 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 ]

3 голосов
/ 10 декабря 2011

У вас есть несколько проблем, вот несколько советов:

  • Вы повторяете внутренний цикл 3 раза, однако вы говорите, что у вас 4 датчика, вам следует изменить цикл for на: for (j = 0; j < 4; j++).
  • sum - это массив из 3 элементов, однако при вычислении avg (sum[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);
}
3 голосов
/ 10 декабря 2011

Похоже, ваш скрипт захватывает только три значения (j = 0, j = 1, j = 2), а затем делится на четыре.

2 голосов
/ 10 декабря 2011

Разве это не

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
1 голос
/ 10 декабря 2011

Количество значений, считанных с датчика, требуется дважды. Во-первых, контролировать количество итераций цикла for. Во-вторых, как делитель суммы. Введите переменную (скажем, N), чтобы зафиксировать это.

Кроме того, деление по сдвигу не звучит правильно, потому что это ограничивает количество показаний датчика до степени два.

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 );
...