Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR verstehen und programmieren


von Marco (Gast)


Angehängte Dateien:

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:
1
_iq IQssfir(_iq *x, _iq *a, Uint16 n)
2
{
3
4
Uint16 i;                // general purpose
5
_iq y;                  // result
6
_iq *xold;                // delay line pointer
7
8
/*** Setup the pointers ***/
9
  a = a + (n-1);            // a points to last coefficient
10
  x = x + (n-1);            // x points to last buffer element
11
  xold = x;              // xold points to last buffer element
12
13
/*** Last tap has no delay line update ***/
14
  y = _IQmpy(*a--, *x--);
15
16
/*** Do the other taps from end to beginning ***/
17
  for(i=0; i<n-1; i++)
18
  {
19
    y = y + _IQmpy(*a--, *x);    // filter tap
20
    *xold-- = *x--;          // delay line update
21
  }
22
23
/*** Finish up ***/
24
  return(y);
25
26
} //end IQssfir()

von Marco L. (chro-nos)


Lesenswert?

Hier mal noch die Filter - Einstellungen, falls es hilft:
1
#define n  5      // filter length
2
_iq xDelay[n] = {0, 0, 0, 0, 0};  // filter delay chain
3
4
// filter coefficients
5
_iq coeffs[n] = {_IQ(0.0625), _IQ(0.25), _IQ(0.375), _IQ(0.25), _IQ(0.0625)};

von Michael (Gast)


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, ...

von Marco L. (chro-nos)


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?

von ----- (Gast)


Lesenswert?


von Loup (Gast)


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_Impulsantwort#Grundtypen 
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

von Alex (Gast)


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.

von Michael (Gast)


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

von Franz Egon (Gast)


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.

von Loup (Gast)


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

von Alex (Gast)


Lesenswert?

Zu 1.

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

von Franz Egon (Gast)


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.

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.