Hallo Zusammen
grad dabei den Filter von http://t-filter.appspot.com
in mein uC Programm zu implementieren.
Ich habe Probleme die Funktionen in double MM_FILTER ordentlich
aufzurufen und die Funktions Parameter zu übertragen bzw zu lesen.
Jedenfalls meine Compiler will das nicht compilieren
daweilst lese ich meine C Bücher...
Magst Du vielleicht auch noch die Fehlermeldungen des C-Compilers
reinkopieren?
Und btw., ist double wirklich nötig? Selbst wenn Dein Controller eine
FPU hat (wie Cortex-M4 etwa), dann kann die auch nur float, und double
in Software ist schon arg langsam.
Was mir auch so schon auffällt, worüber ich als Compiler meckern würde:
Einerseits hast Du:
void BABYBEFilter_init(BABYBEFilter* f)
Dann versuchst Du:
BABYBEFilter_put(&BABYBEFilter,SENSOR);
Das Problem ist, daß BABYBEFilter oben ein Datentyp ist, während Du das
unten als Variable gebrauchen willst. Das kann nicht gehen.
Zweitens benutzt Du in MM_FILTER die Eingabe SENSOR zwar als Paramater
für die beiden Filter-Aufrufe, Dein return-Wert ist aber einfach SENSOR.
MM_FILTER wird also einfach den Wert zurückgeben, den sie erhalten hat,
also eine Identitätsfunktion.
Nop schrieb:> Zweitens benutzt Du in MM_FILTER die Eingabe SENSOR zwar als Paramater> für die beiden Filter-Aufrufe, Dein return-Wert ist aber einfach SENSOR.> MM_FILTER wird also einfach den Wert zurückgeben, den sie erhalten hat,> also eine Identitätsfunktion.
Naja die zwei auskommentierten Zeilen werden nicht kompiliert haben.
Deswegen sind sie wohl auskommentiert ;-)
Der Original C++ Code lässt sich problemlos compileren.
Vermutlich gibt es bei der C- Implementierung eine
struct BABYBEFilter o.ähnlich.
Ohne Kenntnis darüber, bleibt nur die Glaskugel.
Aber einfach mal geraten:
BABYBEFilter_put(&f,SENSOR);
Reinhard M. schrieb:> Der Original C++ Code lässt sich problemlos compileren.>> Vermutlich gibt es bei der C- Implementierung eine> struct BABYBEFilter o.ähnlich.
Nicht nur vermutlich. Diese Struktur ist in der automatisch generierten
Datei BABYBEFilter.h definiert. Die Header- und die C-Datei bekommt man
von der oben genannten Website erstellt.
So klappt es besser:
1.) Im eigenen Code die autogenerierte Header-Datei einbinden.
2.) Im eigenen Code Speicher für das Filter anlegen.
3.) Danach die verschiedenen Funktionen aufrufen. Siehe Beispiel.
Raph schrieb:> daweilst lese ich meine C Bücher...
Naja, lies lieber dort: "http://www.dspguide.com/"
Das Ganze gibt's auch als PDF zum Herunterladen.
Ich hab vergeblich versucht, in deinem Geposteten irgend einen Sinn zu
erkennen. Gleiches gilt für die genannte Internet-Seite. Hab dort mal
versucht, einen Bandpaß für 100 Hz .. 2.7 kHz bei 44.1 kHz Samplerate
einzugeben - geht nicht.
Was für ein Filter soll das eigentlich werden?
Mein Vorschlag wäre ein FIR Filter und den Filterkernel als sin(x)/x mit
anschließendem Blackman-Fenster. Das geht leicht, auch in C - und es
liefert ne ordentlich glatte Durchlaßkurve.
Rezept für Bandpaß:
- ersten Tiefpaß für untere Eckfrequenz berechnen, Blackman applizieren
- zweiten Tiefpaß für obere Eckfrequenz berechnen, Blackman applizieren
- beide Tiefpässe normieren
- Spektralinversion auf zweiten Tiefpaß
- beide Tiefpässe addieren, ergibt Bandsperre
- Spektralinversion auf resultierende Bandsperre, ergibt Bandpaß.
- fertig.
W.S.
Moin,
W.S. schrieb:> Mein Vorschlag wäre ein FIR Filter und den Filterkernel als sin(x)/x mit> anschließendem Blackman-Fenster. Das geht leicht, auch in C - und es> liefert ne ordentlich glatte Durchlaßkurve.
Wenn man nur einen Hammer hat, sehen alle Probleme aus wie Naegel :-)
Raph schrieb:> Ist keine DSP Problem sondern eine C Sache über Funktions Überageb und> Structs.
Warum postest du dann im DSP-Unterforum und nicht unter:
"PC-Programmierung
Programmierung auf PCs, Algorithmen, allgemeine Programmierfragen ohne
direkten Mikrocontroller-Bezug."?
Unn? Watissnu? Geht jetzt dein lustiges C-Programm? Woran hings?
Gruss
WK
Raph schrieb:> Leider meckert der Compiler bei BABYBEFilter_put(&f,SENSOR);>> f ist nicht declariert.Das C Beispiel läßt sich super compilieren.
Na dann deklariere es eben. Wie das geht, habe ich im Beispiel oben doch
gezeigt. Wenn Du damit nicht klarkommst, musst Du erstmal die Grundlagen
lernen.
Dergute W. schrieb:> Wenn man nur einen Hammer hat, sehen alle Probleme aus wie Naegel :-)
Nö.
Der TO will ein Filter selber programmieren und hat sich dazu auf eine
Inet-Seite eingelassen, die mir ausgesprochen seltsam und nicht
zielführend zu sein scheint.
Anstatt hier über C-Probleme mit einer Breitseite irgendwelcher
"Baby"-Filter-Funktionen zu diskutieren, halte ich es für eher
angebracht, mal den tieferen Sinn und Zweck der Übung kundzutun. Auf
diesem Wege käme man der Lösung des Problems möglicherweise eher näher -
oder?
W.S.
W.S. schrieb:> Der TO will ein Filter selber programmieren und hat sich dazu auf eine> Inet-Seite eingelassen, die mir ausgesprochen seltsam und nicht> zielführend zu sein scheint.
Wieso? Auf der Seite brauch man nur die Eckdaten eines Filters angeben.
Danach kann der komplette C-Code kann heruntergeladen werden. Dann nur
noch kompilieren. Fertig.
Ich werde Troll sachen erst gar nicht durchlesen.
F ist wohl Zeiger auf die Structur BABYBEFilter
der richtige Syntax ist mir noch nicht ganz klar beim Aufruf
(
Raph schrieb:> Ich werde Troll sachen erst gar nicht durchlesen.>> F ist wohl Zeiger auf die Structur BABYBEFilter>> der richtige Syntax ist mir noch nicht ganz klar beim Aufruf
Eine Möglichkeit für Deklaration und Aufrufe habe ich doch in diesem
Thread gepostet. Was daran hast Du nicht verstanden?
Wenn Du hier keine "Troll sachen" lesen willst, dann solltest Du
vielleicht mal damit anfangen, selbst nicht wie ein Troll zu schreiben.