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
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.
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?
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....
Holger K. schrieb:> Ohne externe Schwingkreise....
Eine PLL kann man auch in Software bauen.
Ist der Demodulator schon fertig musst du den auch erstellen?
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.
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.
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
:)
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
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.
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...
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.
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.
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.
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.
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!