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