mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP FIR verstehen und programmieren


Autor: Marco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich ersuche gerade hinter die Funktionsweiße von FIR zu kommen.
Dazu habe ich hier schon eine fertige Funktion am Start.

Gebe ich ein Square-Signal rein, wird dieses durch das FIR verschliffen 
wieder ausgegeben. Controller ist ein TI DSP TMS320C28xx.

Handelt es sich dabei also um einen Tiefpass?

Gibt es überhaupt Hochpass-, Tiefpass-, Bandpass- und Basndsperren FIR 
oder denke ich verkehrt und FIR ist FIR?

Was müsste ich denn zum Beispiel in der FIR Funktion unten ändern, um 
statt eines Tiefpasses einen Hochpass oder Bandpass dargestellt zu 
haben.

Hier die gegebene Filter-Funktion und im Bild, dass was sie bei einem 
2,8kHz Rechteck Signal ausspuckt:
_iq IQssfir(_iq *x, _iq *a, Uint16 n)
{

Uint16 i;                // general purpose
_iq y;                  // result
_iq *xold;                // delay line pointer

/*** Setup the pointers ***/
  a = a + (n-1);            // a points to last coefficient
  x = x + (n-1);            // x points to last buffer element
  xold = x;              // xold points to last buffer element

/*** Last tap has no delay line update ***/
  y = _IQmpy(*a--, *x--);

/*** Do the other taps from end to beginning ***/
  for(i=0; i<n-1; i++)
  {
    y = y + _IQmpy(*a--, *x);    // filter tap
    *xold-- = *x--;          // delay line update
  }

/*** Finish up ***/
  return(y);

} //end IQssfir()

Autor: Marco L. (chro-nos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal noch die Filter - Einstellungen, falls es hilft:
#define n  5      // filter length
_iq xDelay[n] = {0, 0, 0, 0, 0};  // filter delay chain

// filter coefficients
_iq coeffs[n] = {_IQ(0.0625), _IQ(0.25), _IQ(0.375), _IQ(0.25), _IQ(0.0625)};

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> Handelt es sich dabei also um einen Tiefpass?
>
> Gibt es überhaupt Hochpass-, Tiefpass-, Bandpass- und Basndsperren FIR
> oder denke ich verkehrt und FIR ist FIR?
>
> Was müsste ich denn zum Beispiel in der FIR Funktion unten ändern, um
> statt eines Tiefpasses einen Hochpass oder Bandpass dargestellt zu
> haben.

Jup, ist ein Tiefpass.

FIR heißt nur, dass die Impulsantwort h(n) mit einer endlichen Anzahl 
Koeffizienten 0<= n <=N beschrieben werden kann. Daraus lassen sich dann 
weitere Eigenschaften ableiten, z.B. dass so ein Filter nur Nullstellen 
und keine (nichttrivialen) Polstellen hat.

Um eine andere Charakteristik zu bekommen musst du die Koeffizienten 
(=Impulsantwort) ändern. Dazu brauchst du i.d.R. einen Filterentwurf, 
z.B. mit Matlab, octave, ...

Autor: Marco L. (chro-nos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso?

Gibt es keine Möglichkeit mit allgemeinen Regeln sich passende 
Koeffizienten zusammen zu stellen?

Sprich eine folgen aufsteigender und wieder abfallender (wie im 
Beispiel) Koeffizienten ist ein Tiefpass. Bei Hochpass ist es umgekehrt?

Welche Auswirkungen hat die Anzahl der Koeffizienten auf meinen Filter?

Autor: ----- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir hat damals dieses Script sehr geholfen 
http://www.nt.fh-koeln.de/fachgebiete/gms/sources/...

Autor: Loup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo auch!

Marco L. schrieb:
> Gibt es keine Möglichkeit mit allgemeinen Regeln sich passende
> Koeffizienten zusammen zu stellen?
>
> Sprich eine folgen aufsteigender und wieder abfallender (wie im
> Beispiel) Koeffizienten ist ein Tiefpass. Bei Hochpass ist es umgekehrt?

Das ist i.d.R. nicht so einfach!

Naja, einen gewissen Zusammenhang gibt es schon, da je nach 
(FIR-)Filtertyp entweder eine Punkt- oder Achsensymmetrische 
Impulsantwort vorliegt, sind auch die Filterkoeffizienten Punkt- oder 
Achsensymmetrisch.
Die Koeffizienten die Du oben angegeben hast (0.0625 0.25 0.375 0.25 
0.0625) sind Achsensymmetrisch und sehen für mich aus, als ob sie zu 
einem TP-Filter vom Typ 1 gehören.
Sieh Dir mal 
http://de.wikipedia.org/wiki/Filter_mit_endlicher_... 
an. Die Koeffizienten sind einfach die "Höhen" der einzelnen "Peaks" der 
Impulsantwort auf den kleinen Bildchen in der Mitte.

Aber die genauen Zahlenwerte der Koeffizienten müssen i.d.R durch ein 
geeignetes Verfahren zum Filterentwurf ermittelt werden, wie ja bereits 
von Michael gesagt wurde. Es gibt da endlos viele Möglichkeiten und 
einige lassen sich (zum Üben) durchaus auf auf einem Blatt Papier 
durchführen (Kenntnisse der Theorie vorausgesetzt).

> Welche Auswirkungen hat die Anzahl der Koeffizienten auf meinen Filter?

Mehr Koeffizienten führen vereinfacht gesagt zu einer steileren 
Filtercharakteristik und einem höheren Signal-Rausch-Abstand, aber auch 
zu einer höheren Gruppenlaufzeit (Zeit die Dein Signal durch den Filter 
braucht) und einem höheren Rechenaufwand.

Grüsse
Loup

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"FIR heißt nur, dass die Impulsantwort h(n) mit einer endlichen Anzahl
Koeffizienten 0<= n <=N beschrieben werden kann. Daraus lassen sich dann
weitere Eigenschaften ableiten, z.B. dass so ein Filter nur Nullstellen
und keine (nichttrivialen) Polstellen hat."

Sorry, aber das ist so falsch.

FIR - Finite Impulse Response
Nicht die Anzahl der Koeffizienten ist endlich sondern die Anzahl der 
Output-Samples != 0 als Antwort auf einen Impuls (was auch logisch ist 
da keine Rückkopplung existiert).
Die Anzahl der Koeffizienten ist endlich, weil man kein Filter 
unendlicher Ordnung digital umsetzen kann/möchte. Also 
ignoriert/vernachlässigt man sämtliche Koeffizienten welche nahe genug 
an Null sind so dass keine wesentlichen Auswirkungen auf das 
Berechnungsergebnis resultieren.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> Sorry, aber das ist so falsch.
>
> FIR - Finite Impulse Response
> Nicht die Anzahl der Koeffizienten ist endlich sondern die Anzahl der
> Output-Samples != 0 als Antwort auf einen Impuls (was auch logisch ist
> da keine Rückkopplung existiert).
> Die Anzahl der Koeffizienten ist endlich, weil man kein Filter
> unendlicher Ordnung digital umsetzen kann/möchte. Also
> ignoriert/vernachlässigt man sämtliche Koeffizienten welche nahe genug
> an Null sind so dass keine wesentlichen Auswirkungen auf das
> Berechnungsergebnis resultieren.

Hm, da muss ich dir nun widersprechen :-)

Also zum einen widerlegst du meine Aussage nicht, dass die Anzahl der 
Koeffizienten endlich ist für eine endliche Impulsantwort. Für einen 
Impuls als Eingangssignal sind Ausgangssignal und Koeffizienten 
identisch. (Bei der klassischen Art der Implementierung durch 
Faltungssumme. Es gibt auch andere Strukturen.) Man kann also jedes 
Filter mit endlicher Impulsantwort mit einer endliche Anzahl an 
Koeffizienten realisieren. Beweis trivial.

Zum anderen nimmst du an, dass die Koeffizienten bzw. die Impulsantwort 
aus einer Approximation einer unendlichen langen Impulsantwort gewonnen 
werden. Also FIR-Filter als Approximation eines IIR-Filters. Das kann 
man natürlich so machen, wird auch manchmal so gemacht (insbesondere in 
adaptiven Anwendungen, Systemidentifikation etc.). Allerdings kannst du 
in einem "echten FIR-Filterentwurf" auch andere Filter entwerfen, vor 
allem linearphasige Filter, was ein IIR-Filter nicht kann und daher die 
Approximation der IIR-Impulsantwort ebenfalls nicht haben wird. Die 
Approximationsmethode ist also ziemlich limitiert.

Und zum Thema der Umsetzung eines Filters unendlicher Ordnung: Wenn man 
schon eine unendlich lange Impulsantwort möchte, dann kann man doch ein 
IIR-Filter einsetzen, das hat nämlich so eine. Und man braucht dafür 
auch nicht unendlich viele Koeffizienten. Man kann auch ein IIR-Filter 
so entwerfen, dass dessen Impulsantwort die gewünschte Impulsantwort 
approximiert, falls die benötigte Ordnung zur exakten Darstellung zu 
groß ist.

Aber dem Fragesteller ging es glaube ich nicht um solche Details, 
sondern eher um die Basics.

Grüße Michael

Autor: Franz Egon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aktion handgebastelte FIR-Filter
================================

Zum praktischen Verständnis von FIR-Filter ist es hilfreich, 
verschiedene Filtertypen ohne große Rechnung zu restellen.

Hier der Vorschlag:

1. Alle Koeefzienten auf 1 setzen ==> man erhällt einen gleitenden 
Mittlwertfilter der die einfachste Form eines Tiefpass darstellt.
( Eine Aufgabe für euch Mitleser: sucht den Frequenzgang eines 
gleitenden Mittelwertfilters als Bild und postet den Link hier zur 
Diskussion )

2. Aus dem obigen Tiefpass einen Hochpass machen.. alle 
Filterkoeffizienten mit der Folge +1 -1 multiplizieren.

3. Die eigenschaften des gleitenden Mittelwertfilter aus "1." mit 
verschiedenen Fensterfunktionen multiplizieren und damit die 
Tiefpasseigenschaft verbessern.

4, Aus "3." wieder einen Hochpass machen mit dem +1 -1 Verfahren aus 
"2."

5. Mit der Funktion y=sin(a x)/(a x) Koeffizienten erzeugen ==> 
Koeffizienten eines "idealen Tiefpass" entstehen. Filterfunktion 
ausprobieren.

Autor: Loup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Franz Egon schrieb:
> 1. Alle Koeefzienten auf 1 setzen ==> man erhällt einen gleitenden
> Mittlwertfilter der die einfachste Form eines Tiefpass darstellt.
> ( Eine Aufgabe für euch Mitleser: sucht den Frequenzgang eines
> gleitenden Mittelwertfilters als Bild und postet den Link hier zur
> Diskussion )

Bitte sehr (das Bild ganz unten):
http://www.dspguide.com/ch15/3.htm

> 2. Aus dem obigen Tiefpass einen Hochpass machen.. alle
> Filterkoeffizienten mit der Folge +1 -1 multiplizieren.

Seitenbandumkehr!

Das wäre übrigens eine mögliche Antwort auf die Frage des OP nach der 
Umwandlung seines TP in einen HP gewesen. Hatte ich in meiner Antwort 
oben ganz vergessen ;)

> 3. Die eigenschaften des gleitenden Mittelwertfilter aus "1." mit
> verschiedenen Fensterfunktionen multiplizieren und damit die
> Tiefpasseigenschaft verbessern.

Fenster (und Beschreibung) zu finden unter (Mitte EQ 16-1):
http://www.dspguide.com/ch16/1.htm

> 4, Aus "3." wieder einen Hochpass machen mit dem +1 -1 Verfahren aus
> "2."
>
> 5. Mit der Funktion y=sin(a x)/(a x) Koeffizienten erzeugen ==>
> Koeffizienten eines "idealen Tiefpass" entstehen. Filterfunktion
> ausprobieren.

Ebenfalls in:
http://www.dspguide.com/ch16/1.htm

Grüsse
Loup

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 1.

Ich hätte auf 1/N getippt, wobei N die Ordnung des Filters ist.

Autor: Franz Egon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast auch völlig recht, die Faktoren müssen statt "1" 1/N sein, sonst 
ist die Amplitude zu groß ( genauer gesagt N-fach ). Der Einfachheit 
halber habe ich es weggelassen, es würde das Verständnis erschweren.

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.