Получение среднего из значений, полученных датчиком с использованием C

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

Решение

Количество значений, считанных с датчика, требуется дважды. Во-первых, контролировать количество итераций 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 );

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

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

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

ИЛИ ЖЕ

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

Разве это не

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
Другие вопросы по тегам