In der ISR sollte auf rechenintensive Operationen verzichtet werden,
z.B. auch auf das sprintf.
Normalerweise wird eine Flag (die volatile sein muss) in der ISR gesetzt
und in der main loop überprüft. Sobald ein neues sample da ist, rechnest
du den nächsten Schritt deines Filters in der main und setzt dann
entweder eine neue flag oder benutzt eine state machine, um anzuzeigen,
dass du deinen gefilterten Wert über USB verschicken kannst.
Im Cube von ST in der DSP-Library gibt es FIR-Filter-Implementierungen.
Die sind ganz gut optimiert.
Hast Du schon einmal ein Multitasking-System ausprobiert? FreeRTOS gibt
es angepasst für die STM32F4-Familie. Dann kannst Du Dein Sampling,
FIR-Filter und Daten weiterleiten in eine Task packen, die nichts
anderes zu tun hat. Alle anderen Aufgaben arbeitest Du in anderen Tasks
ab.
Gruß, Stefan
Da der OP offensichtlich kein Profi ist und eine relativ simple Aufgabe
erledigen möchte (und vor allem nicht zig Sachen gleichzeitig, sonst
hätte er uns das möglicherweise verraten), ist ein realtime OS sowas von
überflüssig und erschlägt jemanden, der obiges nicht per Hand
programmieren kann. Ebenso braucht man für ein einziges FIR mit
Sicherheit nicht die DSP Lib, ein Cortex M4 lacht sich schlapp bei 3
kHz, sodass keine hochoptimierten Algos nötig sein sollten.
Sollen mehrere Filter implementiert werden stimme ich zu, dass man ein
Modul für das Filter verwenden, das man instanziieren kann. Das kann aus
der Lib kommen, ist aber auch sehr fix selbst geschrieben.
Ich glaube aber soweit sind wir hier noch gar nicht.
Schöne Grüße,
Jan
Michael Reinelt schrieb:> Vor allem möchte ich mal ernsthaft anzweifeln, dass wirklich ein FIR> 50ster (sic!) Ordnung benötigt wird... aber ich mag mich ja täuschen.
Kann ich mir auch kaum vorstellen. Was willste den der TO damit
erreichen?
Und der STM den junkt ein Filter in der ISR net. Sollte man aber
trotzdem mit einem Oszi überprüfen.
Schau dir auch mal den Code an, was für Assembler-Befehle der Compiler
raushaut. Ist die Floating-Point-unit an? Kannst ja auch mal im Debugger
dir die Werte anschauen.
Wenn du schon Matlab nutzt, hau das Filter in eine Embedded-Matlab-Fkt
in Simulink und teste am PC, ob das Filter mit double float richtig
arbeitet.
Gruß
Ert
Vielen Dank für die Antworten!
Das TP-Filter 50 Ordnung ist nur mal testweise.
Spaeter will ich ein Notchfilter für 50Hz realisieren, wo ich laut dem
generierten Bodediagramm eine hohe Ordnung brauche für ein gutes
Ergebnis.
Ich würde auch gerne mal das Filter einfach realisieren um es zu
verstehen. Die Vorschläge schau ich mir natürlich an wenn ich das mal am
laufen habe.
Der Test mit Simulink ist eine gute Idee und werd ich mir anschaun.
Ich hab jz mal das Tiefpass - Filter am Laufen =)
Jedoch möchte ich jetzt noch ein 50Hz Notch Filter zusätzlich einbauen.
Wenn ich aber ein FIR-Notch-Filter in Matlab berechnen lasse, komme ich
auf Ordnungen >500 für ein akzeptables Filter (Stopband -40dB,
Welligkeit <1dB,..)
Ist das normal oder gibts dafür bessere Lösungne? (IIR-Filter,..)
Vielen Dank!!
Moin moin,
anstatt 50. Ordnung FIR zu verwenden, solltest du in der Tat in Erwägung
ziehen, ein IIR Filter zu bauen. Die Ordnung wird sofort signifikant
sinken. Wichtig ist, dass du das IIR nicht einfach 'straight forward'
implementierst, sondern in eine SOS-Form überführst, denn aufgrund von
Rundungsfehlern der Koeffizienten kann IIR Instabil werden. Mit SOS
kannst du das einigermassen einfach noch überprüfen.
Zudem würde ich anstatt double nur einfache Genauigkeit benutzen, denn
die M4 FPU kann m.E. kein double.
Guck mal hier, ichhab hier was für matlab:
http://www.kooltek.net/mikrocontroller/realisierung-digitaler-filter
Ich hab mich jz entschieden die 50Hz-Filterung direkt in MatLab
durchzuführen.
Ich fülle immer ein Array mit variabler Länge mit den Samples von der
seriellen Schnittstelle und plotte diese dann.
Vor dem Plotten filtere ich dieses Array noch mit einem Matlab-IIR
Filter.
Habe 3 Bilder angehängt, welche meines "Problem" schön zeigen:
Ein 50Hz Sinussignal wird sehr gut gefiltert, aber hat leichte
Überschwinger die je nach Güte des Filters zunehmen.
Natürlich sieht man diese Überschwinger dann auch bei z.B 90Hz (siehe
Bild).
Mir ist klar dass sich das Filter erst einschwingen muss, was man hier
halt sehr schön sieht.
Da ich die Filterfunktion aber sehr oft Aufrufe (immer nach einer
einstellbaren Anzahl von Samples) sieht man dieses Einschwingen leider
bei je nachdem wie viele Frames ich darstelle immer sehr deutlich.
Habt ihr irgent einen Idee dieses Schwingen zu vermeiden bzw. nicht
darzustellen?
Würde es funktionieren wenn ich den Anfang meines Arrays mit
Dummy-Werten fülle. Bei welchen dann der Einschwingvorgang stattfindet
und ich aber nur die dahinterligenden "richtigen" Werte plotte??
Vielen Dank!!
Wie sollen wir die Qualität 'beurteilen', wenn du das Eingangssignal
nicht auch darstellst?
Wenn da jetzt +- 1000000000 reingeht sind alle Filter unbrauchbar -.-
Lade deine .mat Daten hoch, evtl kann hier ja einer helfen...
Das Eingangssignal ist das Bild "50Hz_ohneNotch".
Das Bild "50Hz_mitNotch" zeigt das selbe Eingangssignal nur mit aktivem
Filter.
Das Bild "90Hz_mitNotch" soll zeigen, dass auch bei Signalen außerhalb
der Notchfrequenz diese Welligkeit am Anfang auftritt,wenn das Filter
eingeschaltet ist =)