Forum: Mikrocontroller und Digitale Elektronik QAM(4 und 16)-Modulator in C


von Holger (Gast)


Lesenswert?

Hallo zusammen

Ich suche zu Lernzwecken ein QAM-Modulator welcher rein in C 
implementiert wurde.

Kennt jemand eine Quelle bzw. Sourcen dafür?
Ich habe bereits intensiv auf Github gesucht aber leider nichts 
brauchbares gefunden.

Vielleich hat ja auch jemand sowas schon selbst umgesetzt und wäre 
bereit, seine Daten zu teilen?

Vielen Dank
Holger

von Holger K. (holgerkraehe)


Lesenswert?

Hmmm... Scheint ja wirklich nicht viel Informationen zu geben.

von QAMTAM (Gast)


Lesenswert?

Ja wie sieht denn deine Eingangsformat aus? In welchen komponenten soll 
der Modulator das Ergebnis ausspucken?

Im einfachsten Fall brauchst du nur eine Tabelle mit Amplituden- und 
Phasenzuordnung. Wenn der Modulator selber schwingen soll, brauchst du 
eine Taktquelle und berechnest dann eine (co-)sinus funktionen mit den 
entsprechenden Parametern aus deiner Tabelle.

von Georg G. (df2au)


Lesenswert?

Holger K. schrieb:
> Scheint ja wirklich nicht viel Informationen zu geben

Ja, richtig, deine Informationen sind mehr als dürftig.

von Holger K. (holgerkraehe)


Lesenswert?

Georg G. schrieb:
> Ja, richtig, deine Informationen sind mehr als dürftig.

Liegt daran, dass ich mich erst mässig mit dem Thema auskenne.

QAMTAM schrieb:
> Ja wie sieht denn deine Eingangsformat aus? In welchen komponenten
> soll
> der Modulator das Ergebnis ausspucken?
>
> Im einfachsten Fall brauchst du nur eine Tabelle mit Amplituden- und
> Phasenzuordnung. Wenn der Modulator selber schwingen soll, brauchst du
> eine Taktquelle und berechnest dann eine (co-)sinus funktionen mit den
> entsprechenden Parametern aus deiner Tabelle.

Es sollen einzelne Bytes über eine zweidraht Leitung mittels QAM-16 
übertragen werden. Die Trägerfrequenz liegt bei ca. 5kHz.

Der Empfänger muss laut Wikipedia eine identische Phasenlage haben, um 
die Daten zu reproduzieren. Wie kann man sowas denn erreichen, ohne eine 
Taktleitung zu haben?

Filtert man dazu die Trägerfrequenz heraus und synchronisiert darauf?

: Bearbeitet durch User
von Markus W. (dl8mby)


Lesenswert?

Thema Taktrückgewinnung,
z.b. mittels eines Schwinkreises
und einer PLL aus dem empfangenen
Signal.

Markus

von Holger K. (holgerkraehe)


Lesenswert?

Markus W. schrieb:
> Thema Taktrückgewinnung,
> z.b. mittels eines Schwinkreises
> und einer PLL aus dem empfangenen
> Signal.
>
> Markus

Anscheinend soll das ganze rein Digital mittels eines ATxmega128 
funktionieren.
Ohne externe Schwingkreise....

von Elias K. (elik)


Lesenswert?

Beispiel für Taktrückgewinnung (PLL) in C: 
http://liquidsdr.org/blog/pll-howto/
Viel Spaß bei 5 kHz auf einem Atxmega...

von Georg G. (df2au)


Lesenswert?

Holger K. schrieb:
> Ohne externe Schwingkreise....

Eine PLL kann man auch in Software bauen.

Ist der Demodulator schon fertig musst du den auch erstellen?

von Holger K. (holgerkraehe)


Lesenswert?

Georg G. schrieb:
> Ist der Demodulator schon fertig musst du den auch erstellen?

Nei den gibt es auch noch nicht. Den muss man auch erstellen.

von Holger K. (holgerkraehe)


Lesenswert?

Elias K. schrieb:
> Beispiel für Taktrückgewinnung (PLL) in C:
> http://liquidsdr.org/blog/pll-howto/
> Viel Spaß bei 5 kHz auf einem Atxmega...

Danke für den Link. Sieht sehr ausführlich aus.

von Georg G. (df2au)


Lesenswert?

Holger K. schrieb:
> Nei den gibt es auch noch nicht. Den muss man auch erstellen.

Glückwunsch. Hast du wenigstens einen funktionierenden Modulator und 
Demodulator, damit du testen kannst?

Welche Symbolrate soll es werden? Wie breit darf das Signal werden? 
Welcher Störabstand muss noch ertragen werden? Wie lange darf die 
Synchronisation zwischen den Partnern dauern?

Da du scheinbar noch nicht mit Software Modems gearbeitet hast, solltest 
du nicht gleich das 6 Gänge Menu ordern sondern klein anfangen. Bau 
zuerst ein FSK Modem. Die dafür notwendigen Software Bausteine kannst du 
später weiter verwenden. Dann bohre es auf auf QPSK. Dabei ändert sich 
dann schon deine Haarfarbe. Und zum Schluss dann QAM16 - sofern du so 
lange durchhälst.

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Georg G. schrieb:
> Glückwunsch. Hast du wenigstens einen funktionierenden Modulator und
> Demodulator, damit du testen kannst?

Nein, nichts.

Georg G. schrieb:
> Welche Symbolrate soll es werden? Wie breit darf das Signal werden?
> Welcher Störabstand muss noch ertragen werden? Wie lange darf die
> Synchronisation zwischen den Partnern dauern?

In der Aufgabe gibt es diesbezüglich keine Vorgaben.
Nach Rücksprache wurde mitgeteilt, dass die Symbolrate nicht definiert 
bzw. vorgeben wird sondern aufgrund des Mikrocontrollers (1MBit/s 
ADC/DAC Rate) limitiert ist.

Bezüglich Synchronisationszeit gibt es auch keine Angaben.
Was meinst du mit der Breite des Signals? Die Bandbreite?

Georg G. schrieb:
> Da du scheinbar noch nicht mit Software Modems gearbeitet hast, solltest
> du nicht gleich das 6 Gänge Menu ordern sondern klein anfangen.

Würde ich gerne, nur habe ich keine Wahl, da dies die Aufgabenstelllung 
vorgibt.

Mir ist jedoch die Funktionsweise von QAM-16 durchaus bekannt.
Dabei wird mittels Phasenverschiebung und Amplitudenmodulation der 
"Zeiger" innerhalb der vier Quadranten verschoben. Pro Quadrant gibt es 
vier Symbole. Dadurch ergeben sich 4x4 = 16 mögliche Symbole pro.... Und 
hier bin ich mir nich genau sicher. Pro was denn? Genügt eine Zeitspanne 
von einer Periodendauer der Trägerfrequenz für die Übermittlung eines 
Symbols?

Jedenfalls ergeben sich 16 mögliche Symbole pro Übermittlung uns somit 4 
Bit, da 2^4 = 16

Wenn ich dies richtig verstanden habe, und vorausgesetzt pro 
Periodendauer der Trägerfrequenz kann ein Symbol übertragen werden, 
ergebe dies 4Bit * Trägerfrequenz = Datenrate in Bit/s. Richtig?

Bin über jeden Input sehr dankbar.

Spiele momentan mit diesem Matlab script herum:
https://www.mathworks.com/matlabcentral/fileexchange/44831-matlab-code-for-m-array-qam-modulation

Scheint auf den ersten Blick sehr gut zu sein.
Ein Screenshot ist im Anhang.

: Bearbeitet durch User
von Detlef _. (detlef_a)


Lesenswert?

Ja, ne sehr schöne Aufgabe. Qam from scratch. Überblick hier:

http://www.wirelesscommunication.nl/pdfandps/qam.pdf

Wenn es nur um das Ergebnis geht kauf lieber was Fertiges z.B.
https://www.cmlmicro.com/products/qam-modem/

Ihr Studierenden könnt Spaß haben!
Cheers
Detlef

von Holger K. (holgerkraehe)


Lesenswert?

Detlef _. schrieb:
> Ja, ne sehr schöne Aufgabe. Qam from scratch. Überblick hier:
>
> http://www.wirelesscommunication.nl/pdfandps/qam.pdf
>
> Wenn es nur um das Ergebnis geht kauf lieber was Fertiges z.B.
> https://www.cmlmicro.com/products/qam-modem/
>
> Ihr Studierenden könnt Spaß haben!
> Cheers
> Detlef

Hallo Detlef

Vielen Dank für deine Inputs.
Das PDF sieht sehr vielversprechend aus.
Dort wird auch die mir bisher unbekannte Grösse Ts angegeben auf Seite 
3.
Wobei leider nicht steht, wie diese genennt wird.

Ja, macht eigentlich schon spass, wenn man es dann einmal verstanden hat 
:)

von Detlef _. (detlef_a)


Lesenswert?

Ts ist die Symboldauer, der Kehrwert der Symbolrate. Die sagt, wie lange 
die bestimmte Amplitude/Phase 'ansteht'. Symbol ist nen zentraler 
Begriff, der hängt mit der benutzten Bandbreite zusammen.

https://en.wikipedia.org/wiki/Symbol_rate

Cheers
Detlef

von Bernd K. (prof7bit)


Lesenswert?

Elias K. schrieb:
> Beispiel für Taktrückgewinnung (PLL) in C:
> http://liquidsdr.org/blog/pll-howto/

So kann das nichts werden.

> Viel Spaß bei 5 kHz auf einem Atxmega...

Ich hab hier 70kHz PLL am Laufen auf einem Silabs 8051 (EFMB8BB1).

Man muß sich halt von float verabschieden und auch von der absurden Idee 
in seinem Code irgendwelche Winkelfunktionen aufzurufen (das kommt wohl 
wenn der Vollzeitakademiker zuviel Matlab geraucht hat) und stattdessen 
ein bisschen Kreativität an den Tag legen.

von Holger K. (holgerkraehe)


Lesenswert?

Bernd K. schrieb:
> Elias K. schrieb:
>> Beispiel für Taktrückgewinnung (PLL) in C:
>> http://liquidsdr.org/blog/pll-howto/
>
> So kann das nichts werden.
>
>> Viel Spaß bei 5 kHz auf einem Atxmega...
>
> Ich hab hier 70kHz PLL am Laufen auf einem Silabs 8051 (EFMB8BB1).
>
> Man muß sich halt von float verabschieden und auch von der absurden Idee
> in seinem Code irgendwelche Winkelfunktionen aufzurufen (das kommt wohl
> wenn der Vollzeitakademiker zuviel Matlab geraucht hat) und stattdessen
> ein bisschen Kreativität an den Tag legen.

Hallo Bernd

Danke für deine Antwort.
Eigentlich bin ich alles andere als ein Vollzeitakademiker. Wobei ich 
vermute, dass nicht ich gemeint war.

Gerne würde ich das ganze sehr pragmatisch angehen.
Nach einigem Studium von Unterlagen, habe ich nun herausgefunden, dass 
ich das Empfangene Signal bzw. die Abtastpunkte des empfangenen Signals 
mit einem Sinus und einem Cosinus multiplizieren muss, um daraus dann 
den I und Q Anteil zu erhalten.

Dabei weiss ich jedoch noch nicht genau, wie ich die Trägerfrequenz 
zurückerhalte bzw. wie ich den Empfänger synchronisieren kann.

Allgemein noch einige Fragezeichen, aber es wird langsam etwas klarer.

Das Matlab Script ist schön um zu basteln.
Leider verwendet es eine trapezintegration zur berechnung von I und Q.
Wie das genau läuft habe ich noch nicht ganz verstanden.
1
% Intervall in sekunden. dabei wird eine Symbolperiode in 100 Teile
2
% zerteilt. Eine Symbolperiode ist dabei das zweifache einer Bitperiode. 
3
% Somit gleich (2*(1/f))/100 entspricht dem Intervallabstand von t
4
t=sp/100:sp/100:sp;
5
6
y1=cos(2*pi*f*t);                                  % inphase component
7
y2=sin(2*pi*f*t);                                  % quadrature component
8
9
for n=ss:ss:length(m)
10
  mm1=y1.*m((n-(ss-1)):n);                                    
11
  mm2=y2.*m((n-(ss-1)):n);  
12
  
13
  plot(t,mm1,t,mm2);
14
  
15
  z1=trapz(t,mm1)                                             % integration
16
  z2=trapz(t,mm2)                                             % integration
17
  
18
  zz1=round(2*z1/sp)
19
  zz2=round(2*z2/sp)
20
  m1=[m1 zz1]
21
  m2=[m2 zz2]
22
end

m enthält dabei die abgetasteten Werte des QAM Signals.
Diese werden dann mit y1 und y2 multipliziert. y1 und y2 sind die werte 
von cosinus und sinus. aus dieser Multiplikation resulitiert dann mm1 
und mm2.

Diese beiden arrays werden dann mit dem intervall t in die trapz 
funktion gegeben.

Herauskommt dann bei zz1 und zz2 die position I und Q und somit ein 
eindeutiges symbol.

trapz kann ich wohl nicht im uC anwenden. Da muss es eine praktischere 
Lösung geben. Und solange ich noch nicht ganz verstanden habe, warum bzw 
was da genau berechnet wird, kann ich es nicht versuchen anders zu 
implementieren. Wenn also jemand da ein Tipp hat freue ich mich darüber.

Zudem hat das Script natürlich keine asynchronität...

von Elias K. (elik)


Lesenswert?

Bernd K. schrieb:
> Elias K. schrieb:
>> Beispiel für Taktrückgewinnung (PLL) in C:
>> http://liquidsdr.org/blog/pll-howto/
> So kann das nichts werden.

Da hast du natürlich recht. Deswegen der leicht sarkastische Hinweis:

>> Viel Spaß bei 5 kHz auf einem Atxmega...
>
> Ich hab hier 70kHz PLL am Laufen auf einem Silabs 8051 (EFMB8BB1).
>
> Man muß sich halt von float verabschieden und auch von der absurden Idee
> in seinem Code irgendwelche Winkelfunktionen aufzurufen (das kommt wohl
> wenn der Vollzeitakademiker zuviel Matlab geraucht hat) und stattdessen
> ein bisschen Kreativität an den Tag legen.

Ins Detail wollte ich nicht gehen, da ich selbiges noch nicht gemacht 
habe und mich damit nicht sinnlos in die Nesseln setzen wollte. Danke 
für deinen Praxiseinblick. So ähnlich habe ich es vermutet. Sicher nicht 
unmöglich, aber nicht 1:1 wie im Link beschrieben.

von Georg G. (df2au)


Lesenswert?

Matlab und ein ATxMega sind zwei völlig verschiedene Welten. Im realen 
Leben ist die Rechenleistung begrenzt und es gibt so unangenehme Dinge 
wie Rauschen und Jitter. Wenn es in Matlab funktioniert, sei froh. Sei 
mir nicht böse für die Bemerkung, aber für eine Realisierung auf einem 
uC fehlen dir Grundlagen. Das wird Frust ohne Ende. Du wirst einige 
Monate forschen und dann aufgeben.
Ich bin dann hier raus.

von M.K. B. (mkbit)


Lesenswert?

Ich glaube das kleinste Problem ist die SW. Im Prinzip gibt jedes Symbol 
eine Amplitude und Phase an. Die kann man dann einem Schwingkreis 
mitgeben, über DA-Wandler erzeugen oder an ein Modem übergeben.

Schwierig wird die Empfängerseite:

Synchronisierung machen die beim Mobilfunk soweit ich gehört habe über 
spezielle Symbole. Der Empfänger erkennt so ein Symbol eindeutig und 
kann damit die Phase des Senders zu seiner internen Referenz bestimmen. 
Damit das eine Zeit lang hält, darf natürlich der Takt nur wenig Jittern 
und Driften.

Amplitudenmessung bei variierendem Empfangspegel. Woher weiß mein 
Empfänger die Amplitudenstufe beim Sender?

Jitter der Amplitude und Phase. Die Punkte werden nicht exakt getroffen. 
Damit muss man aus dem IQ Signal den nächsten passenden Punkt finden.

Wenn man tatsächlich auch was übertragen will braucht man noch eine 
Fehlererkennung bzw. Korrektur oder einen Viterbi Empfänger.

von Holger K. (holgerkraehe)


Lesenswert?

Georg G. schrieb:
> Sei
> mir nicht böse für die Bemerkung, aber für eine Realisierung auf einem
> uC fehlen dir Grundlagen. Das wird Frust ohne Ende. Du wirst einige
> Monate forschen und dann aufgeben.
> Ich bin dann hier raus.

Bin dir nicht böse.
Aber aufgeben ist keine Option.

M.K. B. schrieb:
> Schwierig wird die Empfängerseite:

Das dachte ich mir.

M.K. B. schrieb:
> Synchronisierung machen die beim Mobilfunk soweit ich gehört habe über
> spezielle Symbole. Der Empfänger erkennt so ein Symbol eindeutig und
> kann damit die Phase des Senders zu seiner internen Referenz bestimmen.
> Damit das eine Zeit lang hält, darf natürlich der Takt nur wenig Jittern
> und Driften.

Das ist etwas, was ich bisher noch nicht gefunden habe.

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen.

Ich habe das matlab script nun etwas angepasst.
Nun erhalte ich nach der Multiplikation der einzelnen Abstastwerte mit 
einem Sinus und einem Cosinus die einzelnen I und Q signale zurück 
(unterster plot im Bild)

Dort sehe ich nun sehr gut, dass es vier verschiedene Zustände bzw. 
Symbole gibt. (Beispiel ist mit QAM-4).

Meine Idee:

Ich muss ja erkennen (beim 4-QAM) ob I -1 oder +1 ist und ob Q -1 oder 
+1 ist. Nun könnte ich ja einfach nach einem eingelesenen Symbol (wie 
ich dabei die Grenze der Symbole erkenne ist ein anderes Thema...) bei 
den Samples von I auf max bzw min prüfen und bei den Q-Samples auf max 
bzw. min prüfen.

So müsste ich doch eigentlich prüfen können ob ich nun -1 oder +1 habe 
oder?

##EDIT

Für die Nachwelt:
Ja, bei 4-QAM funktioniert dies so!
1
  mm1=y1.*m((n-(ss-1)):n);                                    
2
  mm2=y2.*m((n-(ss-1)):n);  
3
  
4
  
5
  mm1a = [mm1a mm1];
6
  mm2a = [mm2a mm2];
7
  
8
  %z1=trapz(t,mm1)                                             % integration
9
  %z2=trapz(t,mm2)                                             % integration
10
  
11
  z1 = max(mm1)+min(mm1);
12
  z2 = max(mm2)+min(mm2);
13
  
14
  
15
  zz1=round(z1); %round(2*z1/sp)
16
  zz2=round(z2); %round(2*z2/sp)

Bleibt noch das Problem der Synchronisation

: Bearbeitet durch User
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.