FIR Filter Anfangswert

Gast #3814391
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
Gast #3818183
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!
Gast #3818220
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!
Gast #3818797
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.
Gast #3819223
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.
Gast #3819373
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.
Gast #3819429
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.
Gast #3819501
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.
Gast #3819896
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.
Gast #3820932
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.
Gast #3821603
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?
Gast #3821897
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?
Gast #3823179
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren