Forum: Mikrocontroller und Digitale Elektronik IQ-Modulation mit DDS


von Wiesel (Gast)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Im Grunde ist dei Problem nicht das, was du machen willst, sondern die 
Tatsache, dass du mit der Bitschieberei durcheinander kommst.
Da hilft ein Debugger, ein Taschenrechner und der Vergleich der Soll und 
Ist-Werte.
Was davon zu halten ist? Probier deinen Code doch einfach aus. Wirste 
schon sehen.
Du hast nicht wirklich ein Problem beschrieben, sondern nur deine 
Vorgehensweise...

Ob ausdrücke wie "cos_accu >> (32 - TAB_NBITS)" sinn ergeben, oder 
nicht... sagt dir doch auch die funktionstüchtigkeit deines codes.

von Wiesel (Gast)


Lesenswert?

Naja, die Frage ist auch ob man das den so machen kann oder ob man da 
sich irgendwelche Probleme einhandelt. Funktioniert denn ein solcher IQ 
Modulator.
Ich will es ja ausprobieren, aber mein Evalboard ist grade defekt. Muss 
erst warten bis das neue angekommen ist.

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.