Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR Filter: Gain Normierung


von Manfred M. (bittbeisser)


Angehängte Dateien:

Lesenswert?

Ich habe da immer noch ein Problem mit FIR Filtern. Irgendwie stimmt die 
Gain da nicht. Also bei Tiefpässen ist das ja kein Problem, da kann man 
ja einfach einen Korrekturfaktor ermitteln und dann auf die Filter 
Koeffizienten anwenden.

Aber wie muss ich da vorgehen, wenn es sich um Hochpässe oder Bandpässe 
handelt? Da soll die Summe der Koeffizienten ja 0 sein. Da dann einen 
Korrekturfaktor zu ermitteln geht irgendwie nicht, da der ja auch die 
negativen Koeffizienten so verändert, dass die Verhältnisse gleich 
bleiben.

Also an der eigentliche Funktion der Filter ändert dieser Gain Fehler 
erstmal nichts, aber wenn man die Reaktion auf die Sprungantwort oder 
eine Impulsfolge betrachtet, sieht man eine deutliche Abweichung von der 
erwarteten Ruhelage, die darauf hindeutet, das die Summe der 
Koeffizienten ungleich 0.0 ist, wie es für diese Filter richtig währe.

Ich verwende u.a. einen Algorithmus von 
http://www.cardinalpeak.com/blog/a-c-class-to-implement-low-pass-high-pass-and-band-pass-filters/ 
.
Die beiden Anhängsel zeigen den Frequenzverlauf und die Signalantwort.

Also eigentlich sollte die Ruhelage zwischen 4 und 6 ms auf der 
Null-Linie liegen, was sie aber wegen des Gain Fehlers nicht tut.

Was kan ich tun, um das zu vermeiden?

von derguteweka (Gast)


Lesenswert?

Moin,

Gain stimmt schon von deinem Filter, im Durchlassbereich wackelt das ja 
schoen um die 0 dB Linie.

Der kleine Offset, den du im Zeitbereich z.B. zwischen 4..6ms siehst, 
kommt von der Sperrdaempfung bei der Frequenz 0 - die ist ja nicht 
unendlich (wie's schoen waere), sondern nur bei ca. -25 dB - das sind 
dann halt 0.056 als Ausgang. Wenn du das weghaben willst, brauchst du 
ein Filter, das bei 0 Hz auch eine Nullstelle in der 
Uebertragungsfunktion hat. Bei Band/Hochpaessen wird das zB. dann der 
Fall sein, wenn sie eine gerade Anzahl von Taps haben.

Gruss
WK

von Manfred M. (bittbeisser)


Lesenswert?

Danke für die Erklärung. So habe ich das bisher noch nicht gesehen.

Tatsächlich ist die Summe der Koeffizienten -0.0617 was dann etwa -24.2 
dB entspricht und durch Anwendung einer Fensterfunktion, kann ich diese 
Abweichung auch verringern.

Aber das mit der Nullstelle bei f=0 konnte ich jetzt nur beim Hochpass 
testen. Möglicherweise liegt das aber an der Erstellungsmethode (siehe 
Link im vorigen Post), die wohl einige Einschränkungen hat.

von J. S. (engineer) Benutzerseite


Lesenswert?

Was war das für eine Fensterfunktion? Diese ist ja mit ein Limiter für 
die untere Frequenz. Den Gain kannst Du entsprechend einstellen, wenn Du 
die gefensterten Koeffizienten summierst. Interessant sind dabei die 
Betrachtungen des jeweils erreichbaren Spitzenpegels.

von Manfred M. (bittbeisser)


Lesenswert?

Als Fensterfunktionen habe ich die üblichen Verdächtigen realisiert, 
soweit ich deren Realisierung nachvollziehen konnte. Also: Von Hann, 
Hamming, Blackman, Lanczos, Cosinus und Gauß.

Mir ist klar, dass man damit die Sperrdämpfung verbessern kann, wenn man 
die Nebenwirkung akzeptiert.

> Den Gain kannst Du entsprechend einstellen, wenn Du die gefensterten
> Koeffizienten summierst.
Das scheint nur beim Tiefpass zu gehen oder wenn es nur positive 
Koeffizienten gibt. Im Übrigen ist der Korrekturfaktor für die meisten 
Fensterfunktionen bekannt, jedenfalls soweit sie auf irgendwelchen 
cos-Ausdrücken basieren. Allerdings brauchte ich die bei normalen FIR 
Filtern nicht anwenden, sondern nur den Eingangsdaten einer FFT. Wegen 
der Eingangs erwähnten Abweichung, bin ich aber davon ausgegangen, dass 
ich da in irgendeiner Weise nachbessern muss.

von J. S. (engineer) Benutzerseite


Lesenswert?

Manfred M. schrieb:
> Das scheint nur beim Tiefpass zu gehen oder wenn es nur positive
> Koeffizienten gibt.

Nein, das geht immer. Man muss eben die Ansteuerung berücksichtigen. Für 
eine kontinuierliche normierte "1" = Gleichspannung ist die Verstärkung 
zu berechnen. Der Rest ist Frequenzgang. Auch wenn negative 
Koeffizienten vorliegen, die auf die höheren Frequenzen vorliegen, ist 
der daraus resultierende maximale Aussteuerung zu berechnen - eben nach 
Massgabe des maximal eintreffenden Eingangssignals, theoretisch si, dass 
bei negativen Koeffizienten der Wert negativ ist, also die 
betragsmässige Addition derselben wirkt.

von derguteweka (Gast)


Lesenswert?

Moin,

Vielleicht schadet's nicht, wenn man sich ueberlegt, was eigentlich 
passiert, wenn man alle Koeffizienten eines FIR-Filters aufaddiert: Man 
berechnet ein Sample einer Faltung der Filterkoeffizienten mit einem 
Eingangssignal (das aus lauter Einsen besteht, also fuer das FIR-Filter 
so aussieht, als ware es "reine Gleichspannung" (zumindest fuer den 
Moment), also 0Hz).

Genauso kann man auch mit einem anderen Signal machen, dem Signal mit 
der hoechsten Frequenz, die in zeitdiskreten Systemen vorkommen kann, 
Fsample/2. Das Signal sieht so aus 1,-1,1,-1,1,-1,...

Das bedeutet: Wenn man gucken will, wie ein Filter auf hohe Frequenzen 
reagiert (also speziell die hoechste, die's da geben kann), dann kann 
man das so machen: bei jedem 2. Koeffizienten des Filters das Vorzeichen 
wechseln, und dann alle Koeffizienten aufaddieren.

Beispiel:
Ein ganz simples Filter mit diesen Koeffizienten: [1,0,-1]
Wie siehts bei den ganz tiefen Frequenzen aus: 1+0+(-1)=0 -> laesst also 
nix durch.
Bei ganz hohen Frequenzen: 1+(-0)+(-1)=0 -> laesst auch nix durch; 
testhalber mal den Vorzeichenwechsel bei jeweils "den anderen" 
Koeffizienten: -1+0+1=0 -> logischerweise, denn sonst waere es nicht 
linear.
Also muss dieses Filter mindestens ein Bandpass sein - was der fuer eine 
Verstaerkung bei seiner Mittenfrequenz hat, und wo die Mittenfrequenz 
sitzt, das ist dann fuer den allg. Fall nicht mehr so ganz simpel mit 
"Fingerzaehl-Mathematik" auszurechnen.

Gruss
WK

von Manfred M. (bittbeisser)


Angehängte Dateien:

Lesenswert?

Sorry für die Verspätung, aber die Telekom hatte mich ganze 26h komplett 
von der Außenwelt abgekoppelt und danach hatte ich noch anderen 
Nachholbedarf...

Die tiefere Bedeutung der letzten beiden Beiträge muss ich erst noch 
erarbeiten. Ich bin ja auf diesem Gebiet ja nur ein Hobbyforscher und 
mein mathematisches Hintergrundrauschen ist in den letzten 20 Jahren 
etwas verblasst (aber ich arbeite daran).

> Also muss dieses Filter mindestens ein Bandpass sein - was der fuer eine
> Verstaerkung bei seiner Mittenfrequenz hat, und wo die Mittenfrequenz
> sitzt, das ist dann fuer den allg. Fall nicht mehr so ganz simpel mit
> "Fingerzaehl-Mathematik" auszurechnen.

Ausrechnen kann ich das auch nicht, aber mein primitives Testprogramm 
kann das einfach ausprobieren. Dass die Mittenfrequenz dann bei Fs/4 
liegt überrascht mich auch nicht wirklich, hätte ich aber auch (leider) 
nicht vorhersagen können.

Mein Programm ist eindeutig der Meinung, das die Verstärkung bei der 
Mittenfrequenz bei +6dB liegt (siehe Anhang). Da ich noch keine manuelle 
Eingabe der Koeffizienten habe, hatte ich für diesen Test einfach einen 
anderen Menüpunkt "entführt", daher stimmt die Angabe "FIR_NOTCH" nicht.

In der analogen Skalierung, auf deren Umfang ich nicht vorbereitet war, 
sieht der Frequenzgang übrigens wie eine Sinus-Kurve aus.

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Dort sind nur 3 TAPs verwendet? Das müsste sich aber anhand der 
Koeffizienten direkt im Kopf machen lassen, welches Ansteuersignal die 
maximal auslastet und welcher Wert sich ergibt?

von C Programmierer (Gast)


Lesenswert?

Manfred M. schrieb:
> Dass die Mittenfrequenz dann bei Fs/4
> liegt überrascht mich auch nicht wirklich, hätte ich aber auch (leider)
> nicht vorhersagen können.
>
> Mein Programm ist eindeutig der Meinung, das die Verstärkung bei der
> Mittenfrequenz bei +6dB liegt (siehe Anhang).

Ich probiers mal auf dem analogen Weg.

Gegeben sind die Filterkoeffizienten 1 0 -1

Das Filter lässt sich durch die Funktion
 beschreiben.

Die Fourier-Transformierte davon ist

Die maximale Verstärkung ist also 2 (6,206 db) bei
Mit

Passt! :-)

von J. S. (engineer) Benutzerseite


Lesenswert?

Mensch, wenn ich gewusst hätte, dass man das so einfach über Fourier 
berechnen kann ...

C Programmierer schrieb:
> Gegeben sind die Filterkoeffizienten 1 0 -1
Ich hätte das jetzt ganz altertümlich mit Gain = Betrag (1) + Betrag (0) 
+ Betrag (-1) gemacht.

:D

von C Programmierer (Gast)


Lesenswert?

Jürgen Schuhmacher schrieb:
> Ich hätte das jetzt ganz altertümlich mit Gain = Betrag (1) + Betrag (0)
> + Betrag (-1) gemacht.

Das blöde an dieser Formel ist, dass sie falsch ist und in diesem Fall 
nur zufällig das Richtige rauskommt.

Ein Filter mit den Koeffizienten 1 1 -1 hat keine maximale Verstärkung 
von 3.

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.