Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR Filter Anfangswert


von Christof (Gast)


Lesenswert?

Hallo leute,

Ich bin dabei einen digitalen FIR Filter in C++ zu programmieren. Mein 
Problem ist, dass ich nicht weiß welchen anfangswert ich nehmen soll bei 
meinem ersten filterkoeffizient, oder kann man den berechnen?

Wie soll man allgemein bei einem FIR Filter den Anfangswert nehmen von 
den variablen??

Vielen dank schon mal

von Alexxx (Gast)


Lesenswert?

Ich würde dir empfehlen, in EXCEl etc. mal die Gauß-Glocke für z.B. 16 
Werte symmetrisch um X= 0 zu berechnen.
Skaliere deine Funktion so, dass die berechneten Funktionswerte am 
Anfang & Ende etwa 1/100 sind.
Faustformel: Je näher die Anfangs- (und Endwerte) der Koeffizienten bei 
Null sind, um so höhere Sperrdämpfung erreichst du.

Natürlich kannst du dich auch an den windowed Sinc versuchen - z.B. 
Blackman-Harris...
Hat mich damals knapp ne Woche gekostet, bis ich's wirklich begriffen 
hab'

Gauß-Glocke...
Diese Funktionswerte kleiner 1 solltest du nun mit einem 
(konstanten)Faktor multiplizieren, damit sie in mindestens 8 Bit - 
besser 16 Bit Ganzzahl reinpassen. Wenn deine Daten auch 16 Bit sind, 
musst du also eine 16 X 16-Multiplikation = 32Bit Ergebnis machen. Wenn 
die Koeffizienten weniger wie 16 Bit ausnutzen, passt die Produktsumme 
auch in die 32 Bit.
Zum Schluss die Summe z.B. 16 mal rechts schieben  teilen  oder 
einfach das höchstwertige Wort verwenden und das niederwertigste Wort 
wegwerfen...
Die Verstärkung des Filters ist Koeffizientensumme / Ausgangsskalierung!

von Alexxx (Gast)


Lesenswert?

...Ich hab' dir mal als Beispiel einen 16-Pol-FIR-Tiefpass ausgerechnet.
-3dB bei 0,0576 Datenrate, Sperrdämpfung -70dB / 0,234 Datenrate und 
geht noch bis -90dB runter.
Die unskalierten Float-Koeffizienten sind dafür :

0,0006483
0,0113096
0,0551005
0,1621221
0,3485791
0,5931643
0,8313875
0,9798648
0,9798648
0,8313875
0,5931643
0,3485791
0,1621221
0,0551005
0,0113096
0,0006483

Die Verstärkung wäre mit diesen Koeffizienten 5,96435.
Für Verstärkung 1 also alle durch 5,9.. teilen...

Anfangskoeffizienten mit 0(!) soll man angeblich nicht weglassen - das 
kann aber nichts bringen und ist völlig unnötiger Quatsch!

von Christof (Gast)


Lesenswert?

Gibt es hier keine typischen werte für den anfangswert der 
filterkoeffizienten?

von Filterspezialist (Gast)


Lesenswert?

Was ist denn bei Dir der "Anfangswert der Filterkoeffizienten?"

Die Koeffizienten sind doch zunächst innerhalb eines Berechnungszyklisch 
statisch und werden bei vielen Berechnungen nie verändert.

Meinst Du die anfangs einzuspeisenden Werte, wenn erst weniger Daten 
bekannt sind, als es K's gibt?

Die wären Null, damit der Filter normal durchrechnet. Das Ergebnis ist 
bis dahin natürlich undefiniert, da falsch.

von Christof (Gast)


Lesenswert?

Ich meine bei mir zum beispiel beim programmstart, also der aller ersts 
filterkoeffizient.

Also kann ich einfach sagen, dass beim programmstart bo=0, b1=0,b2=0 
usw. ?

von Helmut S. (helmuts)


Lesenswert?

Alle Werte sind erst mal 0. Erst nach N Takten ist das Filter 
eingeschwungen.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Christof schrieb:
> Also kann ich einfach sagen, dass beim programmstart bo=0, b1=0,b2=0
> usw. ?

Für mich sind bo, b1 und b2 Buchstaben- bzw. 
Buchstab-Zahlenkombinationen. Vielleicht erklärst du mal, welche 
Funktion die bei deiner Rechnung haben und wieso du bei deiner 
Filterkoeffizienten irgendwelche Anfangswerte brauchst. Die 
Filterkoeffizienten sind normalerweise fest und charakterisieren dein 
Filter.

von Christof (Gast)


Lesenswert?

b0, b1, b2 usw. sind variablen die immer verändert werden, dies sind 
auch meine filterkoeffizienten die meinen ausgang vom fir filter 
bestimmen

Ich benutze den filter für eine echokompensation(accoustic echo 
canceller).

Während des programms werden die filterkoeffizienten neu berechnet und 
zwar mit dem NLMS algorithmus.

von Mike (Gast)


Lesenswert?

Christof schrieb:
> Während des programms werden die filterkoeffizienten neu berechnet und
> zwar mit dem NLMS algorithmus.

Dann starte doch mit einem Filter, dass das Signal erstmal nicht 
beeinflußt und lass den Algorithmus nach seinen kleinsten 
Fehlerquadraten den Filter zurechtbiegen.

von Christof (Gast)


Lesenswert?

Ich muss aber mit diesem filter starten, da die echo cancellung nur mit 
diesem filter funktioniert, denn der ausgang vom fir filter wird mit dem 
input signal subtrahiert und damit fällt das echo flach.

von Mike (Gast)


Lesenswert?

Christof schrieb:
> Ich muss aber mit diesem filter starten, da die echo cancellung nur mit
> diesem filter funktioniert

Natürlich musst du mit dem Filter starten. Wie soll dein Algorithmus 
sonst sinnvoll das Filter adaptieren können. Die Startwerte für die 
Filterkoeffizienten müssen so gewählt werden, dass dein 
Optimierungsalgorithmus von diesen Startwerten zu optimalen Werten 
hinlaufen kann, ohne in einem Nebenminimum hängen zu bleiben. Deinen 
Suchalgorithmus kennst aber nur du.

Ein Vorschlag wäre, mit Filterkoeffizienten zu starten, die das Signal 
unverändert passieren lassen. Das funktioniert natürlich nur, wenn dein 
Suchalgorithmus mit diesen Startwerten klar kommt.

von Rolf S. (audiorolf)


Lesenswert?

Vielleicht möchtest Du es mit einem Tiefpass probieren?
Normale Audiosignale laufen nach oben hin aus.

von Christof (Gast)


Lesenswert?

Und welche würden das signal unverändert lassen, hast du ein paar 
vorschläge?

Ich habe viel gelesen das man mit 0 beginnen soll

von Signalverarbeiter (Gast)


Lesenswert?

Mit 0 zu beginnen, ist sicher wenig zielführend, weil dann zunächst ein 
Null-Signal rauskommt. Dein Algorithmus wird dann erst gehörig springen 
und einschwingen. Bei solchen autoadaptiven Geschichten kommt es auch 
immer ein bischen darauf an intuivi den ersten Schritt richtig zu 
erraten.

von Christof (Gast)


Lesenswert?

Oke danke.

Ich habe auch noch eine weitere Frage und zwar geht es um den 
NLMS-Algorithmus den ich verwende. Dabei ist mir diese Formel 
aufgetreten (siehe Bild)

Dabei tritt im Nenner ein x^H (n) auf. Ich habe schon gelesen das es 
eine sogenannte hermetische ....... ist. Meine Frage ist wie man das 
berechnet sodass ich diese Formel programmieren kann?

Oder kann ich es einfach weglassen?

von Frank F. (frank_f49)


Lesenswert?

Nicht  mal  ein FIR  filter programmieren können  und dann
gleich echo  cancellation  probleme lösen wollen - ja mei,
das kann nur in die Hose gehen.

von Christof (Gast)


Lesenswert?

Weil ich es nicht weiß, frage ich ja in einem forum damit ich es weiß, 
ist auch der sinn von einem forum

von denial (Gast)


Lesenswert?

Es gibt Dinge die kann man nicht mal eben in 5 Sätzen erklären.
Sollen wir dir ein gutes Buch zu dem Thema empfehlen?
Von welchen Vorkenntnissen im Bereich Signalverarbeitung können wir bei 
dir ausgehen?

von Christof (Gast)


Lesenswert?

Nein danke, ich benötige nur das eine mehr und das ist mit dem hoch H. 
Dann habe ich soweit alles verstanden

von denial (Gast)


Lesenswert?

Hoch H ist komplex konjugieren und transponieren in einem.

von Michael A. (michiavelli)


Lesenswert?

Christof schrieb:
> Nein danke, ich benötige nur das eine mehr und das ist mit dem hoch H.
> Dann habe ich soweit alles verstanden

Sind deine Signale denn überhaupt komplex? Wahrscheinlich nicht. Dann 
ersetzte das H durch ein T und verzichte auf komplexe Rechnung. Ist 
sowieso nur verwirrend!

von Christof (Gast)


Lesenswert?

Oke, danke, hat mir sehr weitergeholfen!!!

Habt ihr eine Idee wie ich mein Programm simulieren kann sodass die 
Simulation so wäre als wäre eine Hardware da?

Also zurzeit habe ich noch keine Hardware, die bekomme ich erst im 
Dezember nur solange will ich nicht warten. Habt ihr ein 
Simulationsprogramm oder Simulationswerte die aufjedenfall richtig sind?

von Paul B. (Gast)


Lesenswert?

Üblicherweise verwendest du dazu eine Simulation Box, in der die Stimuli 
ebenfalls durch Software abgebildet wird.

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.