Forum: Digitale Signalverarbeitung / DSP / Machine Learning Einfacher IIR-Filter in C implementieren


von Thomas (Gast)


Lesenswert?

Hallo zusammen,

im Rahmen meines Studiums soll ich einen einfachen IIR-Filter mit C-Code 
implementieren. Leider hat mir die Suchfunktion nicht wirklich 
weitergeholfen.
Der Filter hat folgende Differenzengleichung:

y(k) = c * {x(k) – x(k-2)} – y (k-1)

Mein C-Code würde folgendermaßen aussehen:
1
void IIR(float *x, float *y)
2
{
3
  int k;
4
  
5
  y[0] = c * x[0];
6
7
  for (k=1; k < NUM_SAMPLES; k++)
8
  {
9
    if(k < 2)
10
    {
11
      y[k] = c * x[k] - y [k-1];
12
    }
13
    else
14
    {
15
      y[k] = c * (x[k] - x[k-2]) - y[k-1];
16
    }
17
  }
18
}

Ist die Implementierung so möglich?

Ich habe auch schon mal was von der Verwendung eines Ringpuffers 
gelesen.  Wie würde hier die Implementierung aussehen?

Vielen Dank
Thomas

von Matthias (Gast)


Lesenswert?

In deinem Fall berechnest du offline die gefilterten Daten.
Wenn du einen Filter für online-Verwendung brauchst, könnte man zb 
folgendes schreiben:
1
#define NTAPS 3
2
3
// Buffer
4
float X[NTAPS];
5
float Y[NTAPS];
6
7
// Koeffizienten
8
float a[]={c,0,-c};
9
float b[]={0,1,0};
10
11
float IIR(float* x, float* y, float* a, float* b)
12
{
13
  int k;
14
15
    for(k = 1; y[0] = a[0]*x[0]; k < NTAPS; k++)
16
    {
17
        y[0] = y[0] + a[k]*x[k] - b[k]*y[k];
18
    }
19
20
    for(k = NTAPS-1; k > 0; k--) // verschiebe Werte um eins nach hinten
21
    {
22
       y[k] = y[k-1];
23
       x[k] = x[k-1];
24
    }
25
26
    return y[0]; // Filter-Ausgang
27
}

Das wäre der allgemeine Fall und ist nicht als Ringbuffer gebaut.
y[0] stellt neuesten Wert dar. X[0] kriegt immer den neuen Messwert 
zugewiesen, usw.

von Besucher (Gast)


Lesenswert?

Google mkfilter

der erste Treffer. Dort findest Du alles, Sourcecode für Filter sowie 
Berechnung der Koeffizienten

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Ich hab mal sowas hier hereingestellt:

Beitrag "IIR Filter in Integer"

Grüsse

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.