Median16s(), Median16u()

Die Funktion ermittelt aus einer Folge von Eingabewerten den Median. Der Median ist die Zahl, welche an der mittleren Stelle steht, wenn man die Werte nach Größe sortiert. Er kann als Medianfilter zur Verarbeitung von Eingabedaten verwendet werden (Rangordnungsfilter). Beispielsweise beid er Messung von Spannungswerten mittels ADC liefert ein Medianfilter wesentlich bessere Ergebnisse, weil hier keine sehr großen Sprünge auftreten können.

Es sind zwei Varianten für 16-Bit breite Werte definiert. Einmal ohne und einmal mit Beachtung des Vorzeichens.

Syntax: word = Median16u( valuesAddr as word, valueCount as byte )
Syntax: integer = Median16s( valuesAddr as word, valueCount as byte ) (Vorzeichenbehaftete Werte)

Als Parameter wird eine Adresse auf einen Speicherbereich im Arbeitsspeicher (z.B. ein Array), sowie die Anzahl der Werte erwartet. Zur Berechnung werden die Eingangswerte temporär auf dem Stack abgelegt. Dies bei der Dimensionierung des Stacks beachten.

Beispiel

const F_CPU=20000000
avr.device = atmega16
avr.clock  = F_CPU
avr.stack = 64
 
uart.baud = 19200
uart.recv.enable
uart.send.enable
 
dim i as byte
dim b(4) as word
dim mv as long
 
print 12;"median example"
print
wait 1
 
'Die Eingabewerte
b(0) = 55
b(1) = 99
b(2) = 44
b(3) = 22
b(4) = 11
 
print
print "Median() = ";str(Median16u( b().Addr, b().Ubound+1 ))
print
 
print "Median von Hand:"
'Eingabewerte aufsteigend sortieren
b().Sort
'Zur Ansicht ausgeben
for i=0 to b().Ubound
  print "b(";str(i);") = ";str(b(i))
next
print
i = b().Ubound/2 ' mittleres Element ist der Median
mv = b(i)
'Wenn die Anzahl der Elemente gerade ist, gibt es kein mittleres Element, hier
'spricht man dann von Low- und High-Median. Aus beiden wird dann ein Mittelwert
'gebildet.
if even(b().Ubound+1) then
  mv = (mv + b(i+1)) / 2
end if
 
print "Median() = ";str(mv)
print
print "ready"
do
loop