IIR Filter in C Implementieren

Gast #2798152
Lesenswert?

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??

Gruss
#2798161
Lesenswert?

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 )
Gast #2798181
Lesenswert?

Hallo,

ich dachte, dass man dort einen Array Impelemtieren musste um die Werte 
zu speichern..

Das mit den Datentypen ist verstehe ich auch jetzt :)

Ich habe mal diesen Code Implementiert, diese würde aber denke ich mal 
nicht so ganz Funktionieren! Oder?

unsigned int iirFilter(unsigned int oldMean, unsigned int neuWert)
{
    unsigned int hilfe1;
    int i;
    unsigned int y;
    unsigned char k=32;

    for(i=0; i<k; i++)
    {
        hilfe1=(k-1) * y[i-1];
        y[i] = (1/k) * (neuWert + hilfe1);
    }
}

So würde es nicht Funktionieren!
#2798300
Lesenswert?

der neue Gast schrieb:
> Keine weiteren Vorschläge ??

Ich sagte doch: Mit Arrays hat das nichts zu tun!

Lies [i] als 'neu' und [i-1] als 'alt'.

also ist

  y[i] = 1/k * ( x[i] + ((k-1) * y[i-1])

in der 'Übersetzung'


  neues_MIttel = 1/k * (Messwert + (k-1) * altes_Mittel );


noch ein bischen umformen, damit 1/k nicht zu 0 wird und du hast es.


   1                 a
  --- * a   <==>   -----
   k                 k



Du wirst doch das wohl in C hinschreiben können! Steht doch eh schon 
alles mehr oder weniger fix/fertig da.

Es hilft auch, wenn man sich vergegenwärtigt, was man da konzeptionell 
eigentlich tut. Dann verstehst du plötzlich auch, wo das nächste Problem 
auf dich wartet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren