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.