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
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
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.
@ 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
>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.
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
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")
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.