Получение среднего из значений, полученных датчиком с использованием 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