Forum: Mikrocontroller und Digitale Elektronik Digitalen Filter aus Matlab in µC umsetzen


von Fabian F. (fabian_f55)


Lesenswert?

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ß

von JB (Gast)


Lesenswert?

>Gibts vielleicht ganz andere Ansätze Digitalfilter in C umzusetzen?

Ja gibt es:

http://www.iowahills.com/A7ExampleCodePage.html

Gruß J

von Patrick (Gast)


Lesenswert?

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.

von THOR (Gast)


Lesenswert?

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.

von JB (Gast)


Lesenswert?

>- 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

von Patrick (Gast)


Lesenswert?

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.

von THOR (Gast)


Lesenswert?

Unser Vorlesungsskript ist nicht öffentlich, Atmel hat da aber ne 
Application Note zu.

von W.S. (Gast)


Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.