Forum: Digitale Signalverarbeitung / DSP / Machine Learning Software IIR-Filter


von Gast (Gast)


Lesenswert?

Guten Morgen,

ich möchte ein Signal, welches im Array befindet mit einem IIR-Filter 
filtern. Das Array ist 100 groß.

Meine Gleichung (IIR Filter) dazu sieht so aus:

Wert = 10% * new + (1-10%) * old

Wie kann man diese Gleichung in C oder C# umsetzen?
Es soll nur ein Array dazu verwendet werden.

von Helmut (Gast)


Lesenswert?

Mit einer for-Schleife. Mit was sonst. :-)

von Stefan Kunz (Gast)


Lesenswert?

such bei google mal nach "winfilter" kostenlos und ding spuckt C-Code 
für verschiedene Filter-Typen aus.
Die Formel die du da verwendest ist weder ein FIR- noch ein IIR-Filter 
sondern nur die Nachbildung eines Tiefpasses, wärend FIR bzw IIR-Filter 
verschiedene Filter zulassen(Hochpass, Bandpass, Bandstop).
Nebenbei spuckt dir das Programm dann auch die Frequenzverläufe aus, 
woran du dann gut erkennen kennst ob der Filter passt oder nicht.

MfG
Stefan

von Helmut (Gast)


Lesenswert?

Das ist sehr wohl ein IIR-Filter.
Das geforderte Filter zu implemntieren ist ja wohl das Einfachste was es 
gibt. Dazu braucht man kein Filterprogramm.
Man muss natürlich die Grundbefehle von C kennen, z.B. die for-Schleife.
Mehr braucht man dazu wirklich nicht.

von Gast (Gast)


Lesenswert?

Um die Wirkung des IIR-Filters zu sehen, müsste der ganze Vorgang 
mehrmals erfolgen.

Beispiel:
1
int array[100];
2
3
for(int i=0; i<100; i++)
4
{
5
 array[i] = rxdata;
6
7
 if(i >= 1)
8
   array[i] = 0,1 * (array[i] - array[i-1]) + array[i]
9
}

Die Implememtierung des IIR-Filters in C müsste doch so aussehen, oder?

von Gast (Gast)


Lesenswert?

Folgende Zeile stimmt nicht:
1
array[i] = 0,1 * (array[i] - array[i-1]) + array[i];

So ist echt korrekt:
1
array[i] = 0,1 * array[i] + (1-0.1) * array[i-1];

von geb (Gast)


Lesenswert?

Da werden jetzt lustig Float-Operationen mit Integer-Variablen gemischt.

Die Zeile sollte so sein:

array[i]= array[i]/10 + array[i-1]*9/10;

wobwi man noch aufpassen muss, daß es beim array[i-1] nicht zu einem 
überlauf kommt. Falls das sein kann dann:

array[i]= array[i]/10 + (int)((long)array[i-1]*9/10);

Grüße Gebhard

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.