No to mamy 100 pomiarów. Każdy trochę inny. Który jest najbliższy prawdziwej wartości?
Na początek posortujemy zmierzone wartości:
qsort (usec, SERIA, sizeof (float), compare_float); usectmp=0;
Możemy wyświetlić zmierzone wartości. Bywają czasami dziwaczne.
if (debug) for (i=0;i<SERIA;i++) { printf(" %d: %3.0f \n", i ,usec[i]); fflush(0);}
W tabeli roboczej zliczamy ile było takich samych pomiarów, grupując razem różniące się o pojedyncze mikrosekundy, odrzucamy pewną liczbę najmniejszych i największych:
for(i=0;i<10000; i++) tab_rob[i]=0; for (i=SERIA1;i<SERIA-SERIA1;i++) { j=usec[i]/10; // Jesli nie wykryto echa, indeks wyjdzie poza tablice if(j<10000) tab_rob[j]++; }
Szukamy, jaka wartość najwięcej razy wystąpiła w pomiarach, odrzucamy pomiary których było mniej niż 50% tych najczęstszych. Z tego, co pozostało wyliczamy średnią:
// Znajdz maksimum max=0 ; for (i=0;<10000;i++) if (tab_rob[i]>max) max=tab_rob[i]; for (i=0;i<10000;i++) if (tab_rob[i]<max*0.5) tab_rob[i]=0; sum1=0; sum2=0; for (i=0;i<10000;i++) if (tab_rob[i] >0) { sum1=sum1+tab_rob[i]; sum2=sum2+i*tab_rob[i]; }
No i mamy wynik pomiaru. Wystarczy go wyświetlić (tu dodatkowo jeszcze czas przeprowadzenia pomiaru wyświetlamy), ale oczywiście można go do innych celów wykorzystać, zapisać w bazie danych, użyć do zapalenia sygnalizatorów, włączenia alarmu zbliżenia się na niedozwoloną odległość...
usectmp=(float)sum2/sum1; time (&czas); loctime = localtime (&czas); strftime (data, 50, "%Y-%m-%d %H:%M:%S", loctime); printf("%s %4.1f cm\n",data, usectmp/SPEEDDIV*10); }
Opisany tu program został użyty w praktyce do mierzenia ilości oleju napędowego w zbiorniku zakładowej stacji paliw. W zbiorniku o pojemności 5000 litrów błąd pomiaru jest mniejszy niż 10 litrów.