www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Software IIR-Filter


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einer for-Schleife. Mit was sonst. :-)

Autor: Stefan Kunz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

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

Beispiel:
int array[100];

for(int i=0; i<100; i++)
{
 array[i] = rxdata;

 if(i >= 1)
   array[i] = 0,1 * (array[i] - array[i-1]) + array[i]
}

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

Autor: Gast (Gast)
Datum:

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

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

Autor: geb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.