Forum: Digitale Signalverarbeitung / DSP / Machine Learning Erzeugen von GMSK IQ Kanälen auf einem Mikrocontroller


von Rooney B. (rooney)


Angehängte Dateien:

Lesenswert?

Hallo!

Weiß jemand von euch, wie ich die IQ Kanäle für eine GMSK Modulation 
mittels Mikrocontroller/DSP erzeuge?

GMSK mittels Gauß Filter und VCO habe ich bereits in einem STM32F4 
implementiert. Im Prinzip ist das recht einfach, indem man ein FIR 
Filter realisiert. Der VCO wird dann einfach mit der Impulsantwort des 
Gauß Filters angesteuert und fertig.

Nachdem die Lösung mit VCO jedoch etwas instabil ist was Temperatur und 
Bauteiltoleranzen betrifft, möchte ich mein Basisbandsignal mit einem IQ 
Modulator von RFMD in den HF Bereich modulieren. Der IQ Modulator 
benötigt als Input jedoch die IQ Signale (I=cos(phase), Q=sin(phase)). 
Genau hier fängt nun mein Problem an... Mir ist nicht ganz klar wie ich 
effizient die Phase aus meinem Gauß gefilterten NRZI Signal berechne.
Da der Mikrocontroller nicht unbedingt schnell ist, sollte die Lösung 
natürlich sehr effizient sein, eventuell mit Lookup Tables.

Irgendwelche Ideen?

lg
Rooney

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Soweit ich weiß, muss man die Daten in zwei Datenströme halber Bitrate 
aufteilen, dann kommt erst die Tiefpassfilterung mit Gauß-Tiefpass. 
Irgendwo in Kammeyers Lehrbüchern zur Nachrichtenübertragung müßte sowas 
genauer beschrieben sein.
such mal bei Google Books nach Autor "Karl Dirk Kammeyer" z.B.
ISBN 9783835101791 oder ISBN 9783834806109 , ISBN 9783834896193

von trulla (Gast)


Lesenswert?

Ich denke die Phase purzelt doch als erstes aus der Rechnung raus. Bei 
'1' geht die Phase um pi/2 hoch, bei '0' um pi/2 runter (oder 
umgekehrt). Das wird dann ein bischen gefiltert um die Ecken schön rund 
zu bekommen und ergibt den GMSK Phasenverlauf. Ich würde sagen, damit 
gehst du dann in eine LUT und machst den Sinus und den Cosinus davon und 
schon hast du I und Q.

von Rooney B. (rooney)


Angehängte Dateien:

Lesenswert?

@ Christoph: Vielen Dank für die Buchvorschläge, werde mal probieren in 
der Buchhandlung einen Blick reinzuwerfen bevor ich sie kaufe.
Das Problem das ich habe ist, dass in solchen Büchern meist nur ein 
theoretisches Blockschaltbild gezeigt wird, aber auf die tatsächliche 
Umsetzung kaum eingegangen wird.

@ trulla: Das klingt jetzt alles sehr einfach, aber man findet 
unterschiedliche Lösungen für den IQ GMSK Modulator, siehe Abbildungen 
im Anhang. Ich denke das was du beschreibst, ist die Lösung mit 
Integrator.
Derzeit habe ich die GMSK Filterung als Impulsantwort digital gelöst. 
Laut IQ_Modulator_3.jpg bräuchte ich eigentlich ja nur einen Integrator 
an den Ausgang meines Filters hinzufügen und wie du schon sagtest den 
Cosinus und Sinus anhand einer LUT bestimmen.
Wenn ich mich recht entsinne, dann hat ein Integrator die 
Übertragungsfunktion 1/(1-z^-1). Wird also als IIR implementiert. Wie 
stabil das ist und ob diese Formel auch zur praktischen Umsetzung 
verwendbar ist, weiß ich noch nicht genau.


lg
Rooney

von chris (Gast)


Lesenswert?

>Mir ist nicht ganz klar wie ich
>effizient die Phase aus meinem Gauß gefilterten NRZI Signal berechne.

Du könntest den Filter auch komplex auslegen.

von trulla (Gast)


Lesenswert?

Gebe dir recht, ein bischen verwirrend ist das schon. Ich habe vor 
langer Zeit mal einen GMSK Modulator programmiert, allerdings zu 
Simulationszwecken. Wenn ich mich recht erinnere, ging das ganze 
ungefähr so:

- Aus dem Bitstrom (0 und 1) wird eine -1/2, +1/2 Folge gemacht
- Das Ganze wir dann hochgesampled (so um einen Faktor 8 müsste 
brauchbar sein). Konkret wir aus einem -1/2 eine Folge von acht mal -1/2 
und für 1/2 genauso.
- Im Prinzip hat man dann ein Signal was bis auf eine Skalierung den 
Frequenzen eines Frequenzumgetasteten Signals entspricht. In der 
Skalierung muss man das Oversampling und den Phasenhub berücksichtigen
- Dieses Signal könnte man dann einfach aufintegrieren (y_n+1 = y_n + 
x_n, dein vorgeschlagener Integrator als IIR) und bekäme eine stetige 
Phase, allerdings keine GMSK da noch ohne Gaussfilterung.
-Deshalb muss man auf die "Frequenzfolge" noch einen Filter anwenden um 
die "Abrundung" an den Umtaststellen hinzubekommen. Der Filter den man 
für GMSK dazu nimmt ist, wenn ich mich recht erinnere, die Differenz 
zweier Gaussscher Fehlerfunktionen. Den muss man samplen (dem 
verwendeten oversampling entsprechend) und irgendwo abschneiden wos 
nicht mehr weh tut. Damit hat man dann einen FIR Filter.
- Nach dem FIR Filtern kann man dann wie oben beschrieben integrieren 
und die Phase ist fertig. Das Integrieren kann man übrigens mit dem FIR 
Filter zusammenfassen und einen IIR Filter nehmen, dessen Nenner dann 
nur der reine Integrator ist.
- Als Paramter mit denen man evtl spielen muss, hat man das Oversampling 
und den Abschneidepunkt des Filters. Ist aber beides nicht wahnsinnig 
kritsch, ein bischen Fehler darf GMSK ja haben ...

Ich hoffe ich konnte das grob verständlich skizzieren

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

http://www.emc.york.ac.uk/reports/linkpcp/appD.pdf
Der Gauss-Tiefpass muss tatsächlich vor dem Aufsplitten eingebaut sein. 
(Seite 6 "GMSK implemented by a quadrature baseband method")

von Rooney B. (rooney)


Angehängte Dateien:

Lesenswert?

Also ich habe mich jetzt etwas mit Octave herumgespielt, um den 
Algorithmus zu implementieren.
Im Anhang das Ergebnis. Schaut zumindest schon mal nicht so schlecht 
aus... Ob das tatsächlich 100% richtig ist, wird man wohl nur dann genau 
sagen können, wenn ich einen kommerziellen IQ Demodulator verwende um 
die Bitfolge wiederherzustellen.

Was habe ich gemacht:
1.) Impulsantwort g(t) eines Gauß-Filters erzeugt (Formel gemäß 
http://onlinelibrary.wiley.com/doi/10.1002/9780470041956.app2/pdf)
2.) Phase p(t) von g(t) mittels Integrieren ermittelt
3.) Phase p(t) normiert, so dass der maximal Wert der Phase pi / 2 
entspricht. Die Phase gebe ich hierbei jedoch in Grad an, so dass ich 
später Grad als Index meiner LUT des Sinus verwenden kann. Durch diese 
Normierung erhalte ich einen Skalierungsfaktor.
4.) Mit dem Skalierungsfaktor, der sich aus der Phasenormierung ergibt, 
multipliziere ich die Impulsantwort g(t), um eine Normierung von g(t) zu 
erreichen. Damit wird sichergestellt, dass die Phase der gefilterten 
NRZI Sequenz korrekt ist, also die Filterantwort in Korrelation mit der 
Phasenverschiebung ist.
5.) Nun kann ich die NRZI Sequenz durch das normierte Gauß-Filter 
schicken und den Output des Filters integrieren, um die Phase p_nrzi(t) 
der binären Daten zu bekommen.
6.) p_nrzi(t) kann man noch normieren, da sich die Phase ohnehin alle 
360 Grad wiederholt. Dazu verwende ich den Modulooperator auf die Phase 
p_nrzi(t) mit 360.
7.) Die LUT errechne ich mit sin(0...360). Da die Phase in Grad 
angegeben ist, kann ich somit also direkt den Gradwert als Index der LUT 
verwenden.
8.) I entspricht folglich sin(p_nrzi(t)+90) und Q cos(p_nrzi(t))

Vielleicht noch ein paar Worte zur Skalierung des Plots. Da ich kleinere 
Schrittgrößen als Grad haben möchte, verwende ich Vielfache davon. Damit 
wird natürlich auch die LUT entsprechend größer. In meinem Fall 
entspricht diese einer Größe von 11520 Einträgen (also 32 Einträge pro 
Grad). Die Einträge selbst sind außerdem bereits für einen 12 Bit DAC 
normiert.

von Rooney B. (rooney)


Lesenswert?

Irgendwie funktioniert das mit IQ doch nicht zu 100 %.
Sollte man nicht durch Summieren von I und Q wieder das ursprüngliche 
GMSK Signal bekommen (die rote Kurve im Bild meines letzten Eintrags)? 
Der externe IQ Modulator macht ja eigentlich nix anderes als I und Q mit 
der Trägerfrequenz zu multiplizieren und anschließen I - Q berechnen.

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.