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
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!
...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!
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.
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. ?
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.
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.
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.
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.
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.
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.
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?
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?
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!
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?