mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FIR mit TI DSP TMS320VC5505


Autor: Martin R. (garnix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Mein Einstieg in die DSP Welt mit dem TMS320VC5505 EVM hat geklappt und 
es läuft auch schon so maches...

Die fir Funktion aus der TI DSPLib macht schon das was ich will. Und 
auch mit Fließkomma Koeffizienten errechnet meine C Funktion die 
richtigen Werte
Nun bin ich gerade dabei meine C Funktion auf Festpunktformat 
umzustellen.

Dabei ergab sich nun folgendes Problem: Die Ausgangswerte haben einen 
Offsetanteil, der proportional zur Filterlänge ist, und zwar ist der 
Offset die halbe Filterlänge. Sieht nach einem Rundungs- oder Truncating 
Fehler aus. Ich finde ihn aber einfach nicht...

Vielleicht mag ein erfahrener Signalverarbeiter mal drüber schauen wo 
ich Bockmist gebaut habe:
void calculate2(Uint16 newsample){
  short resBuff;
  db[zeiger2]=newsample;
  //Inkrementiere counter2 Modulo NH
  zeiger2=(zeiger2+1) % NH;
  resBuff=0;
  
  for(counter1=0;counter1 < NH; counter1++){
    resBuff += (short)(((long)h[counter1] * (long)db[(zeiger2 + counter1) % NH])>>15);
  }//for counter1
  trxBuff.result[trxBuff.InPtr]=resBuff;
}

Nun zur Erklärung was ich da mache: Zunächst einmal halte ich mich an 
das Beispiel von 
http://www.fh-schmalkalden.de/schmalkaldenmedia/Re...
Meine Koeffizienten h sind validiert und ok. Das habe ich zum Beispiel 
mit der DSP Lib Funktion getestet. Sie befinden sich im Q15 Format. 
meine newsample Werte sind 10Bit breit und nur positiv.
zeiger2 ist natürlich ein globaler Wert und NH enthält die Filterlänge.
Die Struct trxBuff ist nur für die Ergebnisse da.
Es sieht ganz so aus als ob sich mit jedem Aufruf von calculate2 ein 
Fehler aufsummiert der sich dann in einem offset der halben Filterlänge 
bemerkbar macht.

Autor: Martin R. (garnix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wirklich keiner eine Idee?

Autor: Martin R. (garnix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst! Eigentlich ein Fehler in der Beschreibung des C FIR 
Filters im Link...
Ein Abschneiden erfolgt hier nämlich nach jeder Summation...
Somit ergibt sich statistisch ein Offset der halben Filterlänge unter 
dem idealen Filterergebnis.
Meine Zwischenergebnisse halte ich jetzt als long long (40 Bit).
Erst nach der Schleife mache ich den Bitshift

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.