mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Implementieren Filter in C von http://t-filter.appspot.com


Autor: Raph (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
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...
C-Code
void BABYBEFilter_init(BABYBEFilter* f) {
  int i;
  for(i = 0; i < BABYBEFILTER_TAP_NUM; ++i)
    f->history[i] = 0;
  f->last_index = 0;
}

void BABYBEFilter_put(BABYBEFilter* f, double input) {
  f->history[f->last_index++] = input;
  if(f->last_index == BABYBEFILTER_TAP_NUM)
    f->last_index = 0;
}

double BABYBEFilter_get(BABYBEFilter* f) {
  double acc = 0;
  int index = f->last_index, i;
  for(i = 0; i < BABYBEFILTER_TAP_NUM; ++i) {
    index = index != 0 ? index-1 : BABYBEFILTER_TAP_NUM-1;
    acc += f->history[index] * filter_taps[i];
  };
  return acc;
}    

      
double MM_FILTER ( double SENSOR) // Lowpass http://t-filter.engineerjs.com/
{

 //BABYBEFilter_put(&BABYBEFilter,SENSOR);  //Mein Versuch

//BABYBEFilter_get(&BABYBEFilter,SENSOR);//Mein Versuch

return SENSOR;

      };

Autor: Nop (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
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.

Autor: Nop (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: Reinhard M. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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);

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

#include "BABYBEFilter.h"
#include <stdio.h>

int main()
{
    BABYBEFilter filter1;
    
    BABYBEFilter_init(&filter1);
    
    BABYBEFilter_put(&filter1, 2.0);
    
    double filtered_value = BABYBEFilter_get(&filter1);
    printf("Filtered value: %f\n", filtered_value);
    
    return 0;
}

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Raph (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hey Bitte den Thread nicht Offtopic machen .

Ist keine DSP Problem sondern eine C Sache über Funktions Überageb und 
Structs.

Gruß

RL

Autor: Raph (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Leider meckert der Compiler bei BABYBEFilter_put(&f,SENSOR);

f ist nicht declariert.Das C Beispiel läßt sich super compilieren.

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Reinhard M. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Kennt er die Variable nicht ??

Wie meckert der Compiler ???

Poste halt mal alles und lass Dir nicht alles aus der Nase ziehn!

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: MaWin (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Raph (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
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


(


#ifndef BABYBEFILTER_H_
#define BABYBEFILTER_H_

/*

FIR filter designed with
 http://t-filter.appspot.com

sampling frequency: 2000 Hz

* 0 Hz - 400 Hz
  gain = 1
  desired ripple = 5 dB
  actual ripple = 4.1393894966071585 dB

* 500 Hz - 1000 Hz
  gain = 0
  desired attenuation = -40 dB
  actual attenuation = -40.07355419274887 dB

*/

#define BABYBEFILTER_TAP_NUM 21

typedef struct {
  double history[BABYBEFILTER_TAP_NUM];
  unsigned int last_index;
} BABYBEFilter;

void BABYBEFilter_init(BABYBEFilter* f);
void BABYBEFilter_put(BABYBEFilter* f, double input);
double BABYBEFilter_get(BABYBEFilter* f);

#endif

C-Code

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.