Forum: Mikrocontroller und Digitale Elektronik FIR mit TI DSP TMS320VC5505


von Martin R. (garnix)


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:
1
void calculate2(Uint16 newsample){
2
  short resBuff;
3
  db[zeiger2]=newsample;
4
  //Inkrementiere counter2 Modulo NH
5
  zeiger2=(zeiger2+1) % NH;
6
  resBuff=0;
7
  
8
  for(counter1=0;counter1 < NH; counter1++){
9
    resBuff += (short)(((long)h[counter1] * (long)db[(zeiger2 + counter1) % NH])>>15);
10
  }//for counter1
11
  trxBuff.result[trxBuff.InPtr]=resBuff;
12
}

Nun zur Erklärung was ich da mache: Zunächst einmal halte ich mich an 
das Beispiel von 
http://www.fh-schmalkalden.de/schmalkaldenmedia/Realisierung_Digitaler_Filter_in_C.pdf
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.

von Martin R. (garnix)


Lesenswert?

wirklich keiner eine Idee?

von Martin R. (garnix)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.