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!
Gibt es hier keine typischen werte für den anfangswert der filterkoeffizienten?
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. ?
Alle Werte sind erst mal 0. Erst nach N Takten ist das Filter eingeschwungen.
:
Bearbeitet durch User
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.
Vielleicht möchtest Du es mit einem Tiefpass probieren? Normale Audiosignale laufen nach oben hin aus.
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
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?
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.
Weil ich es nicht weiß, frage ich ja in einem forum damit ich es weiß, ist auch der sinn von einem forum
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?
Nein danke, ich benötige nur das eine mehr und das ist mit dem hoch H. Dann habe ich soweit alles verstanden
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?
Ü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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.