der neue Gast schrieb:
> Hallo an alle Profis
>
> ich möchte in der C-Sprache einen bei einem Mikrocontroller den IIR
> Filter Implementieren. Diese soll die Analog-Digital Wandler Werte über
> eine bestimmte lange Zeit(z.B. 10sekunden) zusammenfassen und Glätten.
>
> Die Gleichung lautet
>
> y[i] = 1/k * ( x[i] + ((k-1) * y[i-1])
>
> z.B. mit k=32
>
> Ich habe diese Funktion "unsigned long iirFilter(unsigned int newval)"
> benannt! Wie würdet ihr diese am besten Implementieren??
Im Grunde fast genau so, wie sie da als Formel steht (aber auf die
Datentypen und möglicher Überläufe/Unterläufe der Zwischenergebnisse
achten)
Nur eines noch:
i ist in deiner Formel ein 'Zeitparameter'. d.h. der Filter braucht
* den neuen Messwert
* den alten Mittelwert
und er liefert den neuen Mittelwert.
x[i] ist der Messwert zum Zeitpunkt i
y[i] ist der neue Mittelwert für diesen Zeitpunkt i
y[i-1] ist der vorhergehende Mittelwert vom Zeitpunkt (i-1)
(mit Arrays hat das ganze nichts zu tun)
Der Filter errechnet einen neuen Mittelwert, indem er 'alten Mittelwert'
und 'neuen Messwert' miteinander verrechnet.
d.h. dein Funktion sieht so aus
unsigned long iirFilter(unsigned long oldMean, unsigned int newval)
(Wieso ist eigentlich der Returnwert ein unsigned long, wenn dein
Messwert nur ein unsigned int ist? Der Mittelwert einer Folge von Zahlen
kann ja sowieso nicht größer sein als die größte Zahl. Also
unsigned int iirFilter( unsigned int oldMean, unsigned int newVal )