Moin moin, ich habe an meinem µC-Eingang ein paar Störsignale anliegen die ich rausfiltern möchte, ohne alles mit einem Tiefpass platt zu bügeln. Ich hab die Signalform in Matlab mal durch einen 180Hz Kammfilter laufen lassen (Störungen bei 180Hz, 550Hz, und 3,6kHz) und das Signal sah danach gut aus. Jetzt stellt sich mir die Frage ob und wie man das auf dem µC umsetzen kann? Gibts vielleicht eine fertige Lib die man nur noch mit den Koeffizienten, der Sample-Rate und dem Signal füttern muss? Ansonsten hat jemand Erfahrung wie viel Rechenpower ein Filter 10-20 Ordnung auf einer 32-Bit Platform braucht? Gibts vielleicht ganz andere Ansätze Digitalfilter in C umzusetzen? Schönen Gruß
>Gibts vielleicht ganz andere Ansätze Digitalfilter in C umzusetzen? Ja gibt es: http://www.iowahills.com/A7ExampleCodePage.html Gruß J
Bezüglich Rechenleistung sei gesagt, dass du bei jedem Abtastwert (FIR-Filter) 30 mal den entsprechenden Abtastwert mit seinem Koeffizienten multiplizieren und die Ergebnisse dieser Multiplikationen addieren musst, um den gefilterten Wert zu erhalten, macht 30x Multiplikation und 30x Addition. Hinzu kommen noch die Befehle, um die Werte aus dem Arbeitsspeicher in die Arbeitsregister zu holen und die Ergebnisse wieder zu speichern. (Macht der Compiler für dich) Für einen Iterationsschritt des Ausgangswertes muss der Prozessor das folgende machen: -Koeffizienten laden in Register (1) -Abtastwert laden in Register (2) -Multiplizieren von Register(1) und Register (2) -Aufsummieren Addieren des Multiplikationsergebnisses zur laufenden Summe in Register (4) --> Ergibt am Ende der Iterationen den gefilterten Wert) Wenn sich die Summe z.B. in einem Arbeitsregister (hier: R4) bewegt und während der Iteration nicht zurück in den RAM geschrieben wird, kann man hier schon Zeit einsparen. Die Summation muss deswegen schonmal mit in die Berechnungsschleife und darf nicht separat durchgeführt werden. Je nach Plattform würde ich sagen, dass du hier so was um die 200 CPU-Takte brauchst (Wenn ein Hardwaremultiplizierer vorhanden ist). In C ist dann wieder die Frage, was der Compiler draus macht, aber den kann man ja auf Geschwindigkeit trimmen. Ich denke aber, dass das leistungsmäßig keine Probleme geben sollte.
Patrick schrieb: > Bezüglich Rechenleistung sei gesagt, dass du bei jedem Abtastwert > (FIR-Filter) 30 mal den entsprechenden Abtastwert mit seinem > Koeffizienten multiplizieren und die Ergebnisse dieser Multiplikationen > addieren musst, um den gefilterten Wert zu erhalten, macht 30x > Multiplikation und 30x Addition. Oder wenn man in DSV und IT aufgepasst hat, macht man folgendes: - FIR Filter berechnen lassen, mit symmetrischen Koeffizienten - FIR in der Mitte zusammenklappen und Koeffizienten verdoppeln - Koeffizienten auf die am nächsten liegende Zweierpotenz runden, ebenso den Divisionsfaktor zur Dezimierung am Ende - Das ganze nochmal zur Überprüfung durch Matlab schicken - In C Implementieren, Compiler setzt Multiplikationen und Divisionen in Shift-Operationen um. Auf die Weise hab ich nen 10-Tap FIR Tiefpass mit 18kHz Grenzfrequenz auf nem mit 12MHz getakteten Atmega32 gebaut. Und für Buttons und Statemachine war noch CPU über.
>- In C Implementieren, Compiler setzt Multiplikationen und Divisionen in >Shift-Operationen um. Wenn 2er Potenzen. Man kann auch skalieren und nur mit integer werten rechnen, find das paper allerdings nciht mehr. Gruß J
THOR schrieb: > Oder wenn man in DSV und IT aufgepasst hat, macht man folgendes: Das war eine meiner schlechtesten Prüfungen, nur in BWL und Arbeitssicherheit war ich schlechter... :> Ich gehe aber mal davon aus, dass sich der TO da nicht so tiefgründig mit befassen wird. Außer 32 Bit wissen wir man am Ende auch nichts über seine Plattform, wenn es ein ARM oder etwas vergleichbares mit entsprechend hoher Taktfrequenz ist, dann stören die paar Befehle und Koeffizienten am Ende auch nicht. Und für den Rest ist auch noch "CPU über" :> Soll er austesten, wenn es nicht schnell genug ist, kann er sich ja immernoch in die Tiefen der digitalen Filterei vertiefen und Deinen Ansatz weiter verfolgen. Bei einem kleinen 8-Bit-AVR und seinen beschränkten Ressourcen ist das natürlich ganz anders gelagert, da ist solches Wissen Gold Wert. Gibts dazu eigentlich irgendwo online ein Skript, das man vernünftig nachvollziehen kann? Ich habe da bisher keins finden können und unsere die Vorlesung, die ich hören durfte, war leider in dieser Richtung wenig ausgeprägt.
Unser Vorlesungsskript ist nicht öffentlich, Atmel hat da aber ne Application Note zu.
Fabian F. schrieb: > Ansonsten hat jemand Erfahrung wie viel Rechenpower ein Filter 10-20 > Ordnung auf einer 32-Bit Platform braucht? Das ist viel zu allgemein gefragt. Wenn du nen Cortex M4F (das F ist wichtig) hast, dann kan der ne MAC in Float in einem Wutsch durchziehen, sogar mit Weiterstellen der Pointer. Ich würde dir deshalb gar sehr zu einem M4F raten. Für ein Filter mit 21 Taps brauchst du dann eben 21 Float-MAC Befehle, wenn du die Schleife ausrollst - kann man ja bei nur 21 Taps durchaus so machen. Ansonsten eben noch etwas mehr für den Schleifenoverhead. Zum Algo: Mich hat das schon immer gestört, daß Matlab-Leute immer bloß drauf hinweisen, daß es ja dort was fertiges gibt, das man bloß aufzurufen braucht. Ein bissel ähnlich geht es mit den fertigen Programmen von IOWA Hills. Was jedoch ganz gut geht, ist ein auf sin(x)/x basierendes Filter selber zu berechnen (solange man keine gezielten Phasendrehungen braucht). Was suchst du eigentlich? ein Filter, das Notches bei 180Hz, 550Hz und 3600Hz hat? Also ein umgedrehtes Kammfilter sozusagen? Also mach dir 3 Bandpässe für 180, 550 und 3600 Hz, addiere selbige und invertiere sie dann. Das sollte es dann gewesen sein, denk ich mal. W.S.
THOR schrieb: > Unser Vorlesungsskript ist nicht öffentlich, Atmel hat da aber ne > Application Note zu. Danke für den Hinweis, wenns mich mal in die Richtung verschlägt, werd ich da mal recherchieren.
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.