FIR Filter

Hallo,

mich würde interessieren, ob man ein FIR-Filter in Echtzeit in C programmieren kann?
Wenn ja, wie gehe ich da am besten vor?

MfG,
Alex

Hallo,

mich würde interessieren, ob man ein FIR-Filter in Echtzeit in
C programmieren kann?

Was meinst Du mit „in Echtzeit programmieren“? Für die Filteroperation brauchst Du nur multiplizieren und addieren. Darum haben DSPs immer mindestens eine MAC-Einheit.

Wenn ja, wie gehe ich da am besten vor?

Filter designen/parametrieren (das ist meiner Meinung nach der interessantere Teil) und dann Falten, falten, falten … :smile:

Schau mal hier: http://www.dspguru.com/info/faqs/firfaq.htm

Gruß

Fritze

Hallo Alex,

ganz allgemein zu Filtern: das Problem dürfte sein, die Echtzeitfähigkeit zu garantieren. Dir stehen Libraries zur Verfügung für Integer- und Float-Arithmetik, aber die Ausführungszeiten sind i.a. nicht dokumentiert oder nur sehr allgemein. Wenn man einfach alles in Float programmiert, braucht man schon einen ordentlichen Leistungsüberschuss des Prozessors. Festkomma-Arithmetik ist nur mit Spezial-Bibliotheken verfügbar, oder man bastelt sie aus Schiebeoperationen und Integer zusammen.

Ich denke daher, es hat nur einen Sinn anzufangen, wenn du für deine Kombination von Compiler und Prozessor (nach Studium der Dokumentation) abschätzen kannst, dass genügend Operationen / Sekunde ausgeführt werden können.

Wenn wesentliche Teile in Hardware vorhanden sind, wie bei einem DSP, ist das natürlich wesentlich einfacher.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex,

mich würde interessieren, ob man ein FIR-Filter in Echtzeit in
C programmieren kann?

JA !!!
Das geht auch mit BASIC und einem Interpreter.

C ist ja nur eine Programmiersprache und sagt zuerst einmal gar nichts über die Hardware aus.

Echzeit sagt nur aus, dass der Rechner mindestens den Datendurchsatz haben muss, mit dem die Daten im Mittel anfallen, andernfalls geht es ja gar nicht.
Hinzu kommt bei Echtzeit noch die Bedingung, dass der Rechner innerhalb einer bestimmten Zeit reagieren muss.

WAS du aber ganz vergessen hast ist der benötigte Frequenzbereich. Es macht halt schon einen kleinen Unterschied ob die Perioden des Signals im Bereich von Tagen oder ns liegen.
Wenn das geklärt ist, kann man Überlegungen zur nötigen Hardware anstellen.

MfG Peter(TOO)

Hallo Peter,

ich will es mal versuchen den momentanen Zustand zu beschreiben:
Ich habe ein analoges Signal, welches sich kontinuierlich ändert. Dieses Signal wird mit einem A/D-Wandler (15Bit) gewandelt.
Das gewandelte digitale Signal, soll jetzt mit einem FIR-Filter gefiltert werden. (Fg=50Hz, Fa=4kHz).
Wenn die ungefilterten Werte in einer Datei währen, währe es ein einfaches Spiel. In meinem Fall, müssen die ungefilterten Werte so schnell wie möglich gefiltert werden und weiter an ein Regler (1msec Abtastzeit) geleitet werden.

Mein Programmablauf hat folgende Punkte:
Hauptprogramm => greift auf Funkt: Filterinitialisierung => greift auf Funkt: Filter vorbereiten => greift auf (Hammingfenster berechnen + Rohkoeffizienten berechnen + HammingKoef mit Rohkoef. multiplizieren).
Jetzt will mein Hauptprogramm ungefilterte Werte mit dem frisch initialisiertem Filter filtern.

Wie gehe ich jetzt am besten vor, muss ich eine Schleife machen?

Gruss,

Hallo Alexander,

es gibt (wie fast immer) zwei Möglichkeiten:

A das Hauptprogramm fragt den AD ab, ob ein Wert verfügbar ist, wenn ja wird die Filterfunktion durchgeführt, dann zurück zur Abfrage. Das Programm muss also mit der Berechnung fertig sein, bevor der nächste Wert verfügbar ist, das lässt sich ganz gut überschauen - es sei denn, es passiert was im Hintergrund (unter Windows würde es nicht funktionieren!). Der Nachteil ist in jedem Fall, dass so der Rechner zu 100% ausgelastet wird.

B Der AD-Wandler betätigt ein Interrupt-Signal, in der damit aufgerufenen Interupt-Routine wird die Filterberechnung für den verfügbaren Wert durchgeführt - egal was das Hauptprogramm gerade macht. Die zeitlichen Anforderungen sind die gleichen, es lässt sich aber leichter sicherstellen, dass bei der Berechnung nichts dazwischenkommt: die „echtzeitigste“ Aufgabe erhält die höchste Interrupt-Priorität.

B ist der übliche und korrekte Weg, allerdings muss man einiges lernen über Interrupts usw. z.B. kann man in vielen Fällen in einer Interrupt-Service-Routine keine Fliesskommaberechnungen durchführen, weil diese nicht reentrant programmiert sind. Ausserdem sind ISRs in höheren Betriebssystemen wie Linux oder Windows nur im Kernel-Mode möglich.

Du solltest dich also kundig machen über die Stichworte Interrupt, Interrupt-Service-Routine und Reentrant.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Fragewurm,

Das gewandelte digitale Signal, soll jetzt mit einem
FIR-Filter gefiltert werden. (Fg=50Hz, Fa=4kHz).
Wenn die ungefilterten Werte in einer Datei währen, währe es
ein einfaches Spiel. In meinem Fall, müssen die ungefilterten
Werte so schnell wie möglich gefiltert werden und weiter an
ein Regler (1msec Abtastzeit) geleitet werden.

Mein Programmablauf hat folgende Punkte:
Hauptprogramm => greift auf Funkt: Filterinitialisierung
=> greift auf Funkt: Filter vorbereiten => greift auf
(Hammingfenster berechnen + Rohkoeffizienten berechnen +
HammingKoef mit Rohkoef. multiplizieren).
Jetzt will mein Hauptprogramm ungefilterte Werte mit dem
frisch initialisiertem Filter filtern.

Wie gehe ich jetzt am besten vor, muss ich eine Schleife
machen?

Du schreibst immer noch nichts über die Hardware und das Betriebssystem.
Hast du noch genügend Rechenkapazität für die Filterfunktion.

MfG Peter(TOO)

Vielen Dank für die Vorschläge!