Hallo Forengemeinde
ich möchte mit einer einfachen DDS auf einem CORTEX M4 eine
IQ-Modulation vornehmen. Dazu habe ich mir ein Perl-Skript gebaut,
welches mir eine Sinus-Tabelle beliebiger Länge und Auflösung erstellt
in C-Code. Es soll alles in Fixpoint gerechnet werden. Meine Tabelle
sieht so aus:
1 | static const int32_t sin_tab[] =
|
2 | {
|
3 | /* 0.000000° */ 0,
|
4 | /* 0.703125° */ 1,
|
5 | /* 1.406250° */ 2,
|
6 | /* 2.109375° */ 4,
|
7 | /* 2.812500° */ 5,
|
8 | /* 3.515625° */ 7,
|
9 | /* 4.218750° */ 8,
|
10 | /* 4.921875° */ 10,
|
11 | /* 5.625000° */ 12, ...
|
12 | };
|
Die Tabelle beinhaltet den Sinus in 8 Bit Auflösung (-128 .. +127).
Für die DDS verwende ich zwei 32 Bits breite Phasenakku, einen für SIN
(den initialisiere ich mit 0) und einen für COS (den initialisiere ich
mit 1/4 der Tabellenlänge):
1 | static uint32_t sin_acc = 0;
|
2 | static uint32_t cos_acc = (TAB_LEN / 4) << (32 - TAB_NBITS);
|
Da meine Tabelle eine Länge von 512 hat, ist TAB_NBITS = 9 (weil 2^9 =
512 ist).
Im Timer-Interrupt (bei dem muss ich noch berechnen wie hoch die
Frequenz sein soll) wird dann jeweils beide Phasenakkus mit dem
Frequency Tuning Wort erhöht. Das ist korrekt so oder?
Und den Sinus und Cosinus erzeuge ich, indem ich mit dem Phasenakku in
die Tabelle eingehe:
1 | cos = sintab[cos_accu >> (32 - TAB_NBITS)]));
|
2 | sin = sintab[sin_accu >> (32 - TAB_NBITS)]));
|
Und wenn ich den Momentanwert für den SINUS und den COSINUS habe, dann
wende ich da eine Festkommamultiplikation an um meine 4 Bits breiten
IQ-Daten aufzumodulieren:
1 | #define FIX_MULT(x, y) ((x * y) >> 7)
|
2 | #define TO_FIX(x) (x << 7)
|
3 | #define IP(x) (x >> 7)
|
4 |
|
5 | i = IP(FIX_MULT(TO_FIX(idata), cos));
|
6 | q = IP(FIX_MULT(TO_FIX(qdata), sin));
|
Das Macro FIX_MULT führt eine Fixpointmultiplikation aus zweier gleicher
Fixpunkt Zahlen. Und das Makro TO_FIX konvertiert eine normale
integerzahl in eine Fixpunktzahl. Und IP liefert den ganzzahligen Anteil
zurück.
Kann es so funktionieren? Was ist von meiner Festkommaarithmetik zu
halten?
Gruss.