Einfacher IIR-Filter in C implementieren

Gast #3483855
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
Gast #3492361
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.

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