Hallo zusammen Ich bin nach wie vor mit der QAM-Thematik beschäftigt. Da der Titel des alten Threads "Modulation" war und ich nun hauptsächlich über die Demodulation schreibe dachte ich mir, dass ich am besten einen neuen Thread eröffne. Also. Ich möchte ein QAM-16 Signal mittels Mikrocontroller demodulieren. Dazu taste ich das analoge Signal mit der 10-Fachen Frequenz ab. Nun habe ich mein QAM-Signal also in Form von digitalen Samples. Gemäss diverser Literatur, müssen diese Samples nun mit einem cosinus und einem sinus signal gemischt werden (Multipliziert) um daraus wieder die I und Q Anteile zu erhalten. Soweit so gut. Ob ich im Controller genug Zeit habe, um die Samples zu multiplizieren ist eine andere Frage. Damit die Multiplikation auch korrekte I und Q Signale liefert, muss der sinus sowie der cosinus phasengleich und frequenzgleich zum ursprünglichen träger sein. Hier nun das Problem: Wie synchronisiere ich meine Demodulationsfrequenz mit der QAM-Trägerfrequenz? Mein Ansatz wäre gewesen, die Nulldurchgänge in den QAM-Samples zu suchen bzw. zu erkennen und daraus die Frequenz abzuleiten. Daraus bekomme ich jedoch noch nicht heraus, wann ein neues symbol beginnt. Denn ich muss ja auch noch synchron zu den symbolen sein. Deshalb dachte ich mir, dass ich warte, bis ich einen Phasensprung detektiere. Dies wäre dann entweder doppelte Frequenz oder halbe Frequenz. Dadurch würde ich aber unter Umständen die ersten Daten verlieren. Ausser ich speichere diese auch ab. (Habe jedoch nur 8kB RAM, könnte also etwas knapp werden). Ich habe dies mal versuchsweise mit Matlab gemacht. Die unterste Grafik symbolisiert dabei die Nulldurchgänge. Gerne würde ich von den Experten hier wissen, ob ich damit wohl auf dem richtigen Weg bin oder ob es eventuell einfachere/elegantere oder ganz einfach, andere Lösungen gibt? Eins vorweg: Der Mikrocontroller ist gegeben. Ein analoges mischen / demodulieren ist ebenfalls nicht möglich und externe oszillatoren sind auch nicht möglich. Also wirklich eine reine demodulation mittels mikrocontroller. Die QAM-Trägerfrequenz kann jedoch so eingestellt werden, dass der Mikrocontroller auch noch mitkommt mit demodulieren. Danke
>Hier nun das Problem: >Wie synchronisiere ich meine Demodulationsfrequenz mit der >QAM-Trägerfrequenz? Da bist Du direkt auf das schwierigste Problem gestoßen. Das Stichwort wäre "Costas-Loop2". Ansonsten kannst Du Dich mal durch diesen Thread lesen, da gibst gegen Ende eine ziemlich gute Lösung für PSK die das gleich Problem wie QAM hat. Beitrag "PSK 31 Modlulation im Mikrocontroller"
Beitrag #5745385 wurde vom Autor gelöscht.
Marc schrieb: > Da bist Du direkt auf das schwierigste Problem gestoßen. > Das Stichwort wäre "Costas-Loop2". Vielen Dank für deine Antwort. Wofür steht das 2 am Ende? Bei einer kurzen google-suche habe ich dazu nichts spezifisches gefunden. Marc schrieb: > Ansonsten kannst Du Dich mal durch diesen Thread lesen, da gibst gegen > Ende eine ziemlich gute Lösung für PSK die das gleich Problem wie QAM > hat. Danke, das werde ich sogleich tun.
Beitrag "PSK 31 Modlulation im Mikrocontroller" Wirklich ein hervorragender Thread! Ich glaube PSK31 ist sehr ähnlich zu QAM-4 Ich habe mir nun noch den Code von hier angeschaut: https://gist.github.com/prof7bit/ea9b272c80182eeaccba Grundsätzlich relativ gut verständlich. Ausser dem ADC Teil: Wie wird hier das Signal konkret mit dem Sinus und dem Cosinus gemischt? Falls mir hier jemand einen Hinweis geben kann wäre ich froh. Danke
1 | int16_t I = 0; |
2 | int16_t Q = 0; |
3 | //.....
|
4 | ISR(ADC_vect) { |
5 | int16_t sample = ADC; |
6 | |
7 | // Eingangssignal filtern und gleichzeitig mit
|
8 | // 1kHz Sinus und Cosinus mischen um
|
9 | // direkt I und Q im Basisband zu gewinnen.
|
10 | // Man kann das was hier passiert (unter anderem)
|
11 | // auch als DFT mit gleitendem Rechteckfenster
|
12 | // interpretieren, oder auch als Matched Filter
|
13 | // für einen 1kHz-Burst von mindestens 32 Perioden.
|
14 | int16_t old_sample = sample_buffer[sample_index]; |
15 | sample_buffer[sample_index] = sample; |
16 | if (++sample_index == BUFFER_SIZE) { |
17 | sample_index = 0; |
18 | }
|
19 | if (sample_phase == 0) { |
20 | I -= old_sample; |
21 | I += sample; |
22 | } else if (sample_phase == 1) { |
23 | Q -= old_sample; |
24 | Q += sample; |
25 | } else if (sample_phase == 2) { |
26 | I += old_sample; |
27 | I -= sample; |
28 | } else { |
29 | Q += old_sample; |
30 | Q -= sample; |
31 | SET_SAMPLE(); |
32 | }
|
33 | sample_phase = (sample_phase + 1) & 3; |
34 | |
35 | }
|
Damit Du demodulieren kannst, brauchst Du zu Beginn die korrekte Phasenlage. Daher werden bei solchen Paketen idR Trainingssequenzen an den Beginn gestellt, während derer sich der Empfänger aufsynchonisiert.
Jürgen W. schrieb: > Damit Du demodulieren kannst, brauchst Du zu Beginn die korrekte > Phasenlage. Daher werden bei solchen Paketen idR Trainingssequenzen an > den Beginn gestellt, während derer sich der Empfänger aufsynchonisiert. Danke für deine Antwort. Woher weiss ich denn im Empfänger, ob es sich um eine Trainingssequenz oder um Daten handelt? Denn die Trainingssequenz wäre ja idealerweise eine, bei der sich die Phase immer um 180° ändert. Das könne ja aber auch bei echten Daten geschehen. Kennt jemand eine gute Seite, auf welche ich mich zum Thema "mathed Filter" informieren kann? Gerne auch mit anschaulichen Beispielen.
>Wofür steht das 2 am Ende? Aus versehen habe ich mich vertippt. Ich meinte nur Costas-Loop. >Woher weiss ich denn im Empfänger, ob es sich um eine Trainingssequenz >oder um Daten handelt? Denn die Trainingssequenz wäre ja idealerweise >eine, bei der sich die Phase immer um 180° ändert. Das Synchronisationsproblem findet man bei allen asynchronen Signalübertragungssystemen. Beim seriellen Protokoll ist es einfach StartBit und StopBit als Pause. Die Trainingssequenz wird meistens "Präambel" genannt. Bei Ethernet ist es z.B. eine langen Folge von 1,0,1,0 .... Obwohl es ein nicht unerhebliches Problem bei der Signalübertragung ist, wird es in den meisten Büchern sehr stiefmütterlich behandelt und meistens nur als Blockdiagramm dargestellt, dessen Innenleben irgendwie funktioniert. Was die Eigenschaft der Präambel angeht: Sie muss von den eigentlichen Nutzdaten unterscheidbar sein. Bei der Betrachtung des RS232 Protokolls sieht man, dass die Synchronisation dort eventuell nicht unmittelbar möglich ist wenn man in einen laufenden Datenstrom schaut. Sie funktioniert erst nach einer Pause oder statistisch durch Fehlerausschluss mit Start- und Stopbit, wenn man den Datenstrom länger beobachtet.
Marc schrieb: > Aus versehen habe ich mich vertippt. Ich meinte nur Costas-Loop. Ok, kein Problem :) Marc schrieb: > Obwohl es ein nicht unerhebliches Problem bei der Signalübertragung ist, > wird es in den meisten Büchern sehr stiefmütterlich behandelt Ja, das habe ich auch feststellen müssen Marc schrieb: > Was die Eigenschaft der Präambel angeht: Sie muss von den eigentlichen > Nutzdaten unterscheidbar sein. Gut. dann könnte ich z.B. Symbole mit 2/3 der Frequenz senden, welche immer um 180° ändern solange nichts gesendet wird. Also quasi im idle immer die Synchronisation senden. Die Symbolrate muss ja dem Empfänger ohnehin bekannt sein. Dann erkennt dieser, dass offenbar mit "falscher" Frequenz gesendet wird und synchronisiert intern auf die richtige Frequenz und tastet dann auch immer entsprechend ab. Wenn nun plötzlich eine Änderung an der eigentlich richtigen Stelle stattfindet weiss der Empfänger, dass nun Daten kommen. Eigentlich wie beim Startbit mit 1.5 facher Länge. ---- Matched Filter: Ich finde viel Literatur jedoch alle mit mathematischen Herleitungen bzw. rein mathematisch. Ich suche jedoch eine Erklärung anhand eines praktischen C-Beispiels. Falls jemand etwas in seiner Linkliste hat, bitte posten. Danke
So... Ich habe mal diese Codestelle von hier Beitrag "Re: QAM-Demodulation. Feedback / Vorschläge gewünscht" In Matlab umgesetzt und auf mein QAM-4 Signal angewendet. Kommt leider etwas anderes als erwartet heraus. Den einen Anteil sieht man nun sehr klar und deutlich (letzter Plot) dafür den anderen überhaupt nicht. Ich frage mich weiterhin, wie man solche Signale am elegantesten digital analysiert.
Moin, Holger K. schrieb: > Ich frage mich weiterhin, wie man solche Signale am elegantesten digital > analysiert. Ich wuerd' sagen: Garnicht. Also nicht elegant. Ginge es elegant, wuerde in der Grundlagenliteratur da auch drauf eingegangen werden. Da ist aber immer Schweigen im Wald. Vor zig Jahren hatte ich mal mit den ersten Engineeringsamples von DVB-S2 Demodulatoren zu tun. Also QPSK, 8-PSK und auch noch irgendwelche "wilderen" Modulationsverfahren. Da gabs eine Steuersoftware dazu, da konnte man so ein bisschen was erkennen, was da so chipintern ablaeuft - und das war alles nicht "elegant": Es gab viele verschiedene Stufen hintereinander, die alle gelockt sein mussten, sonst ging garnix. Ich wuerd' die 16 QAM erstmal voellig vergessen. Die 4 QAM ist das Selbe wie QPSK, da koenntest du dann eben mal den guten Costas ausprobieren. Wenn du das dann im Griff hast... Gruss WK
https://en.wikipedia.org/wiki/Carrier_recovery Dadrin: Multiply-filter-divide ist relativ einfach zu implementieren.
Dergute W. schrieb: > Ich wuerd' die 16 QAM erstmal voellig vergessen. Die 4 QAM ist das Selbe > wie QPSK, da koenntest du dann eben mal den guten Costas ausprobieren. > Wenn du das dann im Griff hast... Danke für deine Antwort. Ich habe mich vorerst mal auf 4-QAM beschränkt. Ob ich Costas im Griff habe? Bis jetzt noch nicht... Martin O. schrieb: > https://en.wikipedia.org/wiki/Carrier_recovery > Dadrin: Multiply-filter-divide ist relativ einfach zu implementieren. Danke für den Link. Werde ich mir genauer anschauen. ---- Ich bin momentan soweit, dass ich weiss, dass ich eine Präambel zur synchronisation benötige. Dazu habe ich mir die zwei Symbole ausgesucht, welche um 180° Phasenverschoben sind. Dachte, das mache es einfacher. Am Ende der Präambel kommt ein anderes Symbol um den Beginn neuer Daten zu markieren. Leider habe ich keine Idee, wie ich den Phasensprung so genau detektieren kann, dass ich meinen mitlaufenden Zähler, welcher für eine Symbolperiode zuständig ist, entsprechend anpassen kann. Natürlich ist im Bild1 alles schön synchron. In der Realität sieht es jedoch eher aus wie in Bild2 in welchem I und Q zu einem beliebigen Zeitpunkt beginnen. Anbe ein Bild. Ich habe I und Q testweise mit einem IIR Filter gefiltert. Ich frage mich jedoch, ob dies überhaupt sinn macht. Die I und Q Signale lassen sich ja auch so interpretieren? Falls jemand die Costas Loop in eigenen Worten, bezogen auf die Umsetzung mit einem ADC und Mikrocontroller, beschreiben könnte, würde mir dies sicher viel helfen. Irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr. Danke schonmal.
:
Bearbeitet durch User
Es gibt 2 Probleme. Das Erste : Phasenlocken des Traegers. Dann erscheint die unreferenzierte Phaseninformation am Ausgang des Demodulators. Als Phasenfolge Das Zweite : Interpretation der Phasenfolge. Erkennen der Synch-info, erkennen der Daten. Aussen rum. Nachregeln des Oszillators, dass der Phasenlock bestehen bleibt.
Holger K. schrieb: > Ich habe mich vorerst mal auf 4-QAM beschränkt. Der Vorschlag kam schon etliche Posts vorher. Vor etwa 30 Jahren gab es QPSK Modems, die mit 1800Hz Hilfsträger eine Symbolrate von 2400Bd hatten.
Holger K. schrieb: > Ich habe I und Q testweise mit einem IIR Filter gefiltert. Ich frage > mich jedoch, ob dies überhaupt sinn macht. Die I und Q Signale lassen > sich ja auch so interpretieren? Ohne Tiefpassfilter hat man halt nicht wirklich wieder I und Q und sondern noch Komponenten von beiden mit der doppelten Frequenz drin. Üblicherweise legt man das Filter so aus, dass es zur gewählten Symbolformung passt (als FIR) Dann kann man daraus auch leicht die Phase berechnen.
Holger K. schrieb: > Leider habe ich keine Idee, wie ich den Phasensprung so genau > detektieren kann, dass ich meinen mitlaufenden Zähler, welcher für eine > Symbolperiode zuständig ist, entsprechend anpassen kann. Costas macht nur Carrier Recovery. Das was du noch brauchst, nennt sich Timing Recovery, also das Finden der "Mitte" des Symbols. Da gibts zB. Mueller-Müller: https://www.nutaq.com/blog/symbol-timing-recovery-methods-digital-iq-demodulator Das ist eine recht obskure Methode festzustellen, ob man seinen Sample-Zeitpunkt etwas vor oder zurückschieben muss. Das funktioniert auch nur, wenn man das über viele Samples hinweg mittelt, insb. bei verrauschten Symbolen.
Georg A. schrieb: > Costas macht nur Carrier Recovery. Das was du noch brauchst, nennt sich > Timing Recovery, also das Finden der "Mitte" des Symbols. Da gibts zB. > Mueller-Müller: Ok und ich dachte schon ich wäre mit Costas am "Ziel"... Georg A. schrieb: > Das ist eine recht obskure Methode festzustellen, ob man seinen > Sample-Zeitpunkt etwas vor oder zurückschieben muss. Das macht Hoffnung ^^ Lukas schrieb: > Ohne Tiefpassfilter hat man halt nicht wirklich wieder I und Q und > sondern noch Komponenten von beiden mit der doppelten Frequenz drin. > Üblicherweise legt man das Filter so aus, dass es zur gewählten > Symbolformung passt (als FIR) Ok dann schaue ich mir das auch nochmals an. Für mich sieht es so aus, als würde ich mich an etwas versuchen, das zuvor noch keiner wirklich mit Mikrocontrollern gemacht hat. Zumindest finde ich kaum bis keine Informationen, bzw. finde ich diese nur "Tropfenweise". Ich bin sehr froh, dass es hier überhaupt leute gibt, welche sich an den Antworten beteiligen. Danke an dieser Stelle an alle, die sich hier einbringen.
Holger K. schrieb: > mit Mikrocontrollern gemacht Üblicherweise nimmt man einen DSP für diese Aufgabe. Ein AT(x)Mega scheint mir recht schwachbrüstig für diese Aufgabe.
Georg G. schrieb: > Holger K. schrieb: >> mit Mikrocontrollern gemacht > > Üblicherweise nimmt man einen DSP für diese Aufgabe. Ein AT(x)Mega > scheint mir recht schwachbrüstig für diese Aufgabe. Ja, erscheint mir auch recht schwach. Ich hätte auch lieber ein DSP oder ein FPGA genommen. Aber um das Prinzip zu verstehen genügt wohl auch ein ATXmega. Die Carrierfrequenz kann ja auch bei 1kHz liegen z.B. So ich habe mal das Bild im Anhang zum Vorbild genommen. Dort wird I und Q zusammen multipliziert und als Signal für den VCO verwendet. Wenn ich dies (ohne Filterung nach I und Q und ohne schleifenfilter) auch mache, sieht es aus wie in Bild2. Dort sind I und Q in Phase mit der Abtastung. Wenn ich das ganze nun verschiebe, sieht es aus wie in Bild3. Ich denke, sowas sollte sich erkennen lassen können. Nun muss ich nur noch herausfinden wie man ein FIR Filter in matlab bzw. C umsetzt und was ein schleifenfilter ist bzw. wofür ich es in meinem, digitalen, Fall benötige und wie es Implementiert wird. Dann noch die Symbolerkennung...
So, ich habe nun versucht, das FIR-Filter umzusetzen. Gemäss diesem PDF: https://www.hs-schmalkalden.de/fileadmin/portal/Dokumente/Fakult%C3%A4t_ET/Personal/Roppel/Buch/Realisierung_Digitaler_Filter_in_C.pdf Seite 5 Die Koeffizienten aus dem PDF:
1 | [0.0637,0,-0.1061,0,0.3183,0.5,0.3183,0,-0.1061,0,0.0637] |
Sind offensichtlich für fSample/4 gedacht. Laut Lukas Beitrag "Re: QAM-Demodulation. Feedback / Vorschläge gewünscht" soll die Frequenzs des FIRs auf jene der Symbolfrequenz gelegt werden. Ich sample mit 100 Samples pro Sinusperiode. Und 400 Samples pro Symbol. Sollte also passen oder? Wenn ich nun den code wie folgt umsetze:
1 | b=[0.0637,0,-0.1061,0,0.3183,0.5,0.3183,0,-0.1061,0,0.0637]; |
2 | circBuffer = [0,0,0,0,0,0,0,0,0,0,0]; |
3 | |
4 | for i=1:1:length(samples) |
5 | //Schieben des Buffers |
6 | circBuffer = circshift(circBuffer,1); |
7 | circBuffer(1) = I; //Speichern des I-Sample |
8 | |
9 | //Berechnen des Wertes |
10 | tmp = 0; |
11 | for i=1:1:length(circBuffer) |
12 | tmp = tmp + circBuffer(i) * b(i); |
13 | end |
14 | |
15 | //Abspeichern des gefilterten Wertes im Array |
16 | filtered = [filtered tmp]; |
17 | |
18 | end |
Und mir nun die gefilterten Werte ausgebe, sieht das Signal noch genau gleich aus wie ohne Filterung. Sieht man im Bild. Oben ungefiltert, unten "gefiltert" Kann sich dies jemand erklären?
Holger K. schrieb: > Sollte also passen oder? Nein, deine Koeffizienten passen noch nicht Holger K. schrieb: > Kann sich dies jemand erklären? Es werden Frequenzen gefiltert die nicht vorkommen
Lukas schrieb: > Nein, deine Koeffizienten passen noch nicht Ok danke für deine Antwort. Im anhang das Bode-Diagramm für die Koeffizienten. Zusätzlich ein Plot des Signals. Das Signal hat eine Periode von 25 Samples. Das Symbol eine Periode von 100 Samples. Daher dachte ich, dass eine Grenzfrequenz von 1/4 eigentlich passen würde.
:
Bearbeitet durch User
Holger K. schrieb: > Das Signal hat eine Periode von 25 Samples. > Das Symbol eine Periode von 100 Samples. > Daher dachte ich, dass eine Grenzfrequenz von 1/4 eigentlich passen > würde. Beispiel: Abtastrate 100kHz Damit ist die Grenzfrequenz dieses Filters (f/fs=0.25) ist hier dann 25 KHz (mit bescheidener Sperrdämpfung). Das wäre dann 4 samples pro Periode Ein Signal mit 25 samples pro periode (f/fs = 0,04) wäre hier dann 4 KHz und wird offensichtlich noch durchgelassen.
Lukas schrieb: > Beispiel: > Abtastrate 100kHz > > Damit ist die Grenzfrequenz dieses Filters (f/fs=0.25) ist hier dann 25 > KHz (mit bescheidener Sperrdämpfung). Das wäre dann 4 samples pro > Periode > > Ein Signal mit 25 samples pro periode (f/fs = 0,04) wäre hier dann 4 KHz > und wird offensichtlich noch durchgelassen. Danke für die Antwort. Wie würdest du denn die Abtastrate in einem "virtuellen" Umfeld wie jenem von Matlab "herleiten"? Ich habe pro Sinusperiode des zu dämpfenden Signals 25 Datenpunkte. Beim Mikrocontroller kommt ja dann die Zeit ins Spiel. Also x Samples pro Zeit. da ist es dann einfacher. Denn da hab ich ja dann auch x. Schwingungen pro Zeit und somit die Frequenz des zu dämpfenden Signals. Aber wie verhält es sich in Matlab? Da kann man ja nur mit Verhältnissen arbeiten oder? Also eben z.B. zu dämpfendes Signal = 25 Samples, zu erhaltendes = 100 Samples. Oder wie macht man das? Für mich sieht es so aus, als of fSample = 25 Sample sind und fFilter = 100 somit Verhältnis 1/4 bzw 0.25 wie in deinem Beispiel. Daher würde ich eine gewisse Filterwirkung erwarten.
:
Bearbeitet durch User
Du hast eine Abtastrate fs und kannst damit Frequenzen bis fs/2 abbilden (Abtasttheorem) Wenn du ein 25 samples pro Periode hast was du unterdrücken möchtest, hast du ein Verhältnis von der Signalfrequenz zur Abtastrate von 1/25 = 0,04 Also müsste dein Filter bei diesem gewählten Verhältnis 0,04 sperren, wenn du diese Frequenz unterdrücken willst. Eine hohe Abtastrate hat nicht nur Vorteile, da die Filter aufwändiger werden. Das Beispielfilter aus dem PDF sperrt bei f/fs = 0,25. Holger K. schrieb: > Aber wie verhält es sich in Matlab? > Da kann man ja nur mit Verhältnissen arbeiten oder? Du kannst dir ja für eine von dir bestimmte Abtastrate und Signalfrequenz ausrechnen welche Verhältnisse du hast, bzw. Von Matlab rechnen lassen. Am besten ja so wie du sie in deiner realen Anwendung dann auch hast
Lukas schrieb: > Wenn du ein 25 samples pro Periode hast was du unterdrücken möchtest, > hast du ein Verhältnis von der Signalfrequenz zur Abtastrate von 1/25 = > 0,04 Hallo Lukas Danke für deine Erklärung. Ja, jetzt wo du es schreibst, macht es plötzlich sinn. Ist ja klar, mein sample ist die Grundeinheit und 25mal langsamer ist die zu unterdrückende Frequenz und 100mal langsamer jene die zu behalten ist. Ich habe diese Werte nun in ein Filtertool eingegeben und bekomme damit die Werte im rechten Bildrand. Denkst du, oder andere, dass die Parameter im Tool richtig eingegeben wurden? Ich habe die Koeffizienten übrigens ausprobiert, es gibt keinerlei Veränderungen am Signal :(
Ich denke bei diesen Verhältnissen braucht man Filter höherer Ordnung, also viel mehr Filterkoeffizienten. Das meinte ich damit, dass die Filter aufwendiger werden bei hoher Abtastrate bezogen auf die Grenzfrequenz. Du kannst dir ja die Übertragungsfunktion des Filters anschauen. Wie stark wird die Frequenz die unterdrückt werden soll gedämpft? Als Matched Filter hätte das Filter hier 100 Koeffizienten..
Moin, Auch hier mal ein Verweis auf die gute, alte NICAM-Spezifikation: EN 300 163 als ein Beispiel fuer ein tatsaechlich verwendetes System, was aber trotzdem im Vergleich zu DAB, DVB usw. noch simpel und oeffentlich genug ist, um's in endlicher Zeit komplett verstehen zu koennen. Da wird eher die Sendeseite beschrieben, die ist fuer den Anfang auch leichter zu durchblicken, als der Empfang. Auf der Sendeseite muss eben nix synchronisiert werden, es muss kein Traeger oder Symboltakt zurueckgewonnen werden, etc. Gruss WK
Lukas schrieb: > Du kannst dir ja die Übertragungsfunktion des Filters anschauen. Wie > stark wird die Frequenz die unterdrückt werden soll gedämpft? Du hast recht! Ich habe mir das ganze angeschaut. Die Symbolfrequenz hat ja 1/100 Sample = 0.01 Rad/s Die zu dämpfende Frequenz 1/25 = 0.04 Rad/s Die Bilder im Anhang zeigen die entsprechenden Dämpfungen. Offenbar gibt es kaum Dämpfung. Nun verstehe ich aber auch weshalb und weiss, das ich mit dem Tool entsprechend "Spielen" kann. Fragt sich nur noch was ich da wohl anders machen sollte... Eine Frage zum zweiten Bild. Offenbar gibt es Extremstellen mit sehr hohen Dämpfungen. Leider liegen diese momentan nicht bei den gewünschten 0.04 Rad/s sondern bei 0.3 Rad/s Spricht man von einem "Matched Filter" wenn diese Stellen an der gewünschten Frequenz liegen? Oder ist das was anderes?
Dergute W. schrieb: > Moin, > > Auch hier mal ein Verweis auf die gute, alte NICAM-Spezifikation: > > EN 300 163 Moin Danke für den Hinweis. Werde ich mir anschauen!
Moin, Holger K. schrieb: > Spricht man von einem "Matched Filter" wenn diese Stellen an der > gewünschten Frequenz liegen? Oder ist das was anderes? Ein matched filter ist einfach ein (FIR-)Filter, dessen Koeffizienten genau "andersrum" sind, wie die Koeffizienten des Filters zu dem es "matchen" soll. In der Praxis nimmt man oft Filter mit (achsen)symmetrischen Koeffizienten, dann sind beide Filter gleich. Mit einem matched Filter kriegst du dein Signal am besten wieder aus dem Rauschen rausgefiltert. Daher der ganze Zauber. Gruss WK
Dergute W. schrieb: > Ein matched filter ist einfach ein (FIR-)Filter, dessen Koeffizienten > genau "andersrum" sind, wie die Koeffizienten des Filters zu dem es > "matchen" soll. Du meinst es filter einfach alles andere als das, was ich eigentlich suche. Lässt sozusagen "lücken" offen für mein Signal? Ok, dann ist es eigentlich schon eine art "matched filter" wenn man es so betrachtet. Habe nun ein bisschen mit den Parametern gespielt und siehe da, mit 61 Koeffizienten habe ich es geschafft! Es filtert endlich :) Vielen Dank schonmal an dieser Stelle an euch! Wäre nicht möglich gewesen ohne euch! Nun tun sich jedoch gleich wieder neue Baustellen auf. - 61 Multiplikationen pro ADC-Wandlung... Phuhh das sind ne Menge... - Phasenschiebung im Signal. Solange es statisch ist sollte es ja kein Problem sein. - Eigentlich wollte ich dieses Signal für die Costas-Loop filtern. Fragt sich, ob ich nun dieses Signal so weiterverwenden soll...
Moin, Holger K. schrieb: > Lässt sozusagen "lücken" offen für mein Signal? Nein. guggst du hier: https://en.wikipedia.org/wiki/Matched_filter kannst die Mathematik vorspulen bis "matched filter in digital communications". Holger K. schrieb: > - 61 Multiplikationen pro ADC-Wandlung... Phuhh das sind ne Menge... Ist nicht zielfuehrend, wenn du gleich anfangen willst mit allen moeglichen Tricks zur Rechenvermeidung. Es gibt die natuerlich, aber das muss dir erstmal wurscht sein. Nimm einen schnelleren Prozessor oder niedrigeren Traeger/Symbolrate. Gruss WK
Dergute W. schrieb: > Da wird eher die Sendeseite beschrieben, die ist fuer den Anfang auch > leichter zu durchblicken, als der Empfang. Das ist aber bei eigentlich allen Übertragungs-Specs so, egal ob DVB-* oder DAB oder WLAN. Wichtig ist, dass das Sendesignal normiert ist. Wie der Empfänger dann die Bits rausbekommt, ist egal. Deswegen gibt es ja auch verschieden gute Empfänger, das hängt nicht nur am HF-Teil. Allerdings sind natürlich im Sendesignal schon die passenden Vorkehrungen drinnen, damit man die Synchronisation hinbekommt. Es gibt eigentlich schon diverse Doku, allerdings ist die halt meistens sehr generisch und hängt jetzt nicht an einem konkreten Standard. Ist auch kein Wunder, diese Grundlagen (Costas und Co) sind auch schon gute 50-60 Jahre alt. Erst so ab OFDM und QAM>4 wirds dann 1980++. Die meisten aktuellen Papers in dem Bereich drehen sich eher um trickreiche Performanceverbesserungen bzw. HW-Optimierungen. Mit den Stichworten "Timing carrier recovery" bzw. synchronization finden sich aber schon viele Zusammenfassungen (oft Seminararbeiten).
Holger K. schrieb: > Nun tun sich jedoch gleich wieder neue Baustellen auf. > - 61 Multiplikationen pro ADC-Wandlung... Phuhh das sind ne Menge... Du kannst ja auch die Abtastrate reduzieren
Moin zusammen Ich habe mich nun nochmals etwas mit den Filtern beschäftigt. Also... Ich versuche nach wie vor die Costas-Loop umzusetzen, um eine Trägersynchronisation zu erreichen. Zudem brauche ich auch noch eine Symbolsynchronisation. Dazu habe ich auf dieser Webseite eine interessante Methode gefunden: http://jontio.zapto.org/hda1/paradise/QAMtiming/QAMtiming.htm Man schaue sich dieses Bild an: http://jontio.zapto.org/hda1/paradise/QAMtiming/QAMtim4.jpg Dort wird mit doppelter Frequenz abgetastet und so versucht, Nulldurchgang und die beiden Peaks zu erwischen. Der Fehler berechnet sich wie folgt: Die Summe aus den beiden Peakpunkten dividiert durch zwei muss möglichst dem mittleren Punktewert entsprechen. Ansonsten ist man daneben. Dann kann man korrigieren. Damit ich nun aber ein I oder Q-Signal habe dass wie ein Sinus aussieht, muss ich immer 180° Phasendrehungen haben. Damit kann ich diese Methode ja nur in einer Preambel anwenden. Danach gehts ja dann nicht mehr. Nun zur aktuellen Baustelle Ich versuche Costas gemäss Bild1 zu implementieren. Dazu multipliziere ich mein QAM-Signal mit einem Sinus und einem Cosinus welcher "lokal" schwingen. Aktuell ja nur in der simulation. Daraus erhalte ich I und Q. Diese filtere ich tiefpass mit meinem FIR-Filter. Nun muss ich, laut dem Blockschaltbild, diese beiden Signale mischen. Also multipliziere ich diese beiden miteinander. Dies nun wieder durch ein Schleifenfilter, laut Wiki ist ein FIR ein Schleifenfilter. Also nochmals durch das selbe FIR filter. Daraus soll die Stellgrösse des VCO oder NCO resultieren. All diese Signale sind in den Bildern 2-5 enthalten. Dabei habe ich bei 3-5 jeweils die Phase des lokalen Oszillators für Sin und Cos verschoben um so einen Fehler zu erzeugen. Leider erschliesst sich mir nicht wirklich, wie ich den "idealfall" im letzten Plot bei "FIR-Filtered I and Q multiplied" finden soll. Ich dachte da wird eine "Grösse" gegen 0 tendieren. Was meinen die Experten dazu?
holger k. schrieb: > Daraus erhalte ich I und Q. Diese filtere ich tiefpass mit meinem > FIR-Filter. Von den Begriffen her: I und Q erhälst du erst nach der Filterung. Vorher hast du ein Mischsignal mit mehreren Komponenten holger k. schrieb: > Dies nun wieder durch ein Schleifenfilter, laut Wiki ist ein FIR ein > Schleifenfilter. Also nochmals durch das selbe FIR filter. Das Filter muss auch entsprechend ausgelegt sein. Am besten erstmal mit Papier und Bleistift die Rechnungen durchgehen und überlegen, was wo passiert und was unterdrückt werden muss und an welcher Stelle welche Größe interessiert. Bzw. wann dieser Costas Loop geeignet ist ( z.b. bpsk und wann nicht..) Literaturhinweis: http://diru-beze.de/funksysteme/skripte/DiFuSy_S06/DiFuSy_Slync_SS2006.pdf
Lukas schrieb: > Bzw. wann dieser Costas Loop geeignet ist ( z.b. bpsk und wann nicht..) > > Literaturhinweis: > http://diru-beze.de/funksysteme/skripte/DiFuSy_S06/DiFuSy_Slync_SS2006.pdf Vielen Dank für deinen Hinweis. Hier ist noch der richtige Link: http://diru-beze.de/funksysteme/skripte/DiFuSy_S06/DiFuSy_Sync_SS2006.pdf Wirklich eine ganz ausgezeichnete Webseite die du mir da empfohlen hast! Auch die Literatur ist hervorragend! Werde ich gleich mal einarbeiten. Danke!
Moin, holger k. schrieb: > Dies nun > wieder durch ein Schleifenfilter, laut Wiki ist ein FIR ein > Schleifenfilter. Also nochmals durch das selbe FIR filter. Daraus soll > die Stellgrösse des VCO oder NCO resultieren. Du musst dir so ein bisschen auch im Klaren sein, warum und wozu die jeweiligen Filter gut sein sollen. Nicht so sehr in Baukloetzen denken. Nicht jedes Filter muss ein FIR sein, und nicht jedes FIR Filter ist identisch. Die Filter im I und Q Zweig haben 2 Aufgaben: 1. Durchlassen der Nutzsignale und Sperren der unerwuenschten Mischprodukte. 2. Konzentration der Energie eines Symbols auf einen moeglichst kurzen Zeitpunkt. Zu diesem Zeitpunkt sollte dann das Symbol abgetastet werden. Daher sollten diese Filter matched Filter zu den Sendefiltern sein. Wie diese Filter ausgefuehrt werden: Ob FIR, IIR, 1x4 Melitta ist eigentlich voellig wurscht. Es gibt halt oft bestimmte Anhaltspunkte im Design dieser Filter, die fuer eine bestimmte Ausfuehrung sprechen, aber letztendlich sind die Filter nur durch ihre Impulsantwort bzw. ihr Durchlass/Sperrverhalten definiert. Nicht durch ihre Realisation. Das Schleifenfilter vor dem V/NCO ist eine voellig andere Baustelle. Das ist reine Regelungstechnik. Da brauchst du einen Regler, der den V/NCO regelt. Moeglicht ohne Regelschwingungen und moeglichst hurtig. Das kann mit einem FIR gemacht werden, aber wenn du z.b. fuer deine Regelung eine Integralkomponente brauchst, geht das nicht mit reinen FIR Strukturen. Dann muss eine Rueckkopplung rein. Gruss WK
Hallo WK Vielen Dank für deine ausführliche Antwort. Langsam kommt das Verständnis für das "Gesamtbild". So ein Demodulator ist doch deutlich komplexer als ich je gedacht habe. Aber das ist schon Gut so! Habe in den letzten Tagen extrem viel neues dazugelernt. Werde mich nun mal in die Unterlagen von obigem Link einlesen und hoffe, dadurch noch mehr Klarheit zu erlangen. Ich werde wieder von den Ergebnissen berichten. Vielleicht gibt es ja auch noch andere, welche sich für dieses Thema interessieren. Ob heute oder morgen... Gruss Krähe
So, ich habe nun fast alle 300 Seiten der Skripte mehrheitlich durchgelesen. Dadurch ist mir einiges klarer geworden. Matched-Filter: Im Skript wird an verschiedenen Stellen etwas dazu geschrieben. Leider bin ich mir der Funktionsweise noch immer nicht ganz sicher. Was ich jedoch verstanden habe ist, dass ich im Modulator auch ein LP-Filter für die digitalen Signale benötige. Diese "Verrundung" soll dazu dienen, die Bandbreite zu reduzieren. Wenn ich nun im Sender für den LP die Filterkoeffizienten b verwende und im Empfänger im LP filter ebenfalls die gleichen Koeffizienten b wie im Sender, ist dies dann ein "matched filter"? Gemäss dem Skript wird für die Costas-Loop bei QPSK oder QAM eine erweiterte Costas-Loop benötigt, welche mit den quadrierten I und Q anteilen arbeitet und somit auf die doppelte Frequenz regelt. Dies offenbar deshalb, da bei der eigentlichen Trägerfrequenz die Spektrallinie im Frequenzbereich nicht ausgeprägt genug ist. Synchronisation: Im Skript wird für die Symbolsynchronisation eine Testsequenz verwendet (S. 160) Diese wird jedoch mit einer anderen Modulation (2PSK) gesendet. Dann gibt es ein FIC-Symbol mit 8PSK und dann die Daten mit z.B. QAM. Also deutlich aufwändiger als ich es bisher vorhatte. Natürlich ist das ja auch nur ein Vorschlag aus dem Skript und keine Vorgabe. Inputs von eurer Seite nach wie vor jederzeit willkommen. Bisher konnte ich noch nichts demodulieren. Das Studium des Skripts wird daran glaube ich auch noch nicht so schnell etwas ändern... Aber ich komme dem Ziel näher. Eure Krähe.
Holger K. schrieb: > Beitrag "PSK 31 Modlulation im Mikrocontroller" > Wie wird hier das Signal konkret mit dem Sinus und dem Cosinus gemischt? > Falls mir hier jemand einen Hinweis geben kann wäre ich froh. Der Trick daran ist die Abrastrate. Stell Dir einen Sinus vor von 1kHz. Und der ADC-Interrupt kommt mit genau 4kHz. Beim nullten und zweiten Zeitpunkt nehm ich je ein Sample, multiplizier sie mit 1 und -1 und nenn das "mischen mit cosinus", beim ersten und dritten nehm ich auch je ein Sample, multiplizier sie mit 1 und -1 und nenn das "mischen mit sinus". Denn der 1kHz Sinus hätte 1 und -1 an bei Zeitpunkten 1 und 3 und der 1kHz Cosinus hätte 1 und -1 an den Zeitpunkten 0 und 2. Ich sample und multipliziere (dankbarer weise mit schön glatten Zahlen 1 oder -1) und hab also abgetastet und gemischt in einem Abwasch ohne auch nur einmal die Multiplikation (teuer auf dem AVR) benutzen zu müssen, ich muss nur addieren und subtrahieren. Und das Mischergebnis wird auch gleich noch durch einen 32 Perioden langen moving average Tiefpass gejagt, das hat einen ähnlichen Effekt auf die Bandbreite als hätte ich es vor dem Mischen durch einen 32 Perioden langen Bandpass geschickt (nur wenn auch ein Aliasing-Filter vor dem ADC ist sonst kommen vielfache von 1kHz auch noch durch und wir tun mal so als hätten wir die auf analogem Wege schon rausgefiltert). -- Wenn ich solche PLLs implementiere dann immer so daß das Abtasten bereits das I/Q-Mischen IST und die PLL führt einfach ihre eigene Abtastrate nach ("non-uniform sampling DPLL"), Für meine(!) Zwecke sample ich 4 mal pro Periode, das reicht für 0° und 90°. Phasenfehler zur Nachführung der PLL bestimme ich gerne mit ner groben Näherung des Arkustangens (etwas wellig aber extrem schnell zu rechnen) die ich auf alle 4 Quadranten aufgebohrt habe. Das wäre dann also sowas wie ne TanLock-Loop mit großem Fangbereich die niemals 180° versetzt einrasten kann. Und auf sowas kleinem wie nem AVR oder ähnlichem implementiert im Kilohertzbereich bläst das jeden NE567 komplett aus dem Wasser (um ne Größenordnung mindestens, ich war selbst erstaunt). Damit hab ich zum Spaß mal ne Lichtschranke gebaut die ging mit nackter LED und Photodiode (keine Linsen!) und 2Meg TIA ungefähr 70 Meter weit! Sogar voll gegen die Abendsonne (für den Fremdlicht-PID-Regler war nämlich auch noch Zeit im Interrupt)!
:
Bearbeitet durch User
Hallo Bernd Danke für deine Antwort. Ok, nun ist mir das ganze deutlich klarer mit der Abtastung. Eigentlich sehr elegant. Was tun, wenn da nun deutlich Rauschen drauf ist? Dafür ist dann wohl das average filter oder? -- Zwischen welchen Werten berechnest du denn den Arcustangens?
Holger K. schrieb: > Was ich jedoch verstanden habe ist, dass ich im Modulator auch ein > LP-Filter für die digitalen Signale benötige. Diese "Verrundung" soll > dazu dienen, die Bandbreite zu reduzieren. und das Filter sollte die Nyquist Bedingungen erfüllen um Intersymbolinterferenz zu verhindern. Holger K. schrieb: > Wenn ich nun im Sender für den LP die Filterkoeffizienten b verwende und > im Empfänger im LP filter ebenfalls die gleichen Koeffizienten b wie im > Sender, ist dies dann ein "matched filter"? Ja. Überlichweise nimmt man z.B. Cos-Roll-off-Filter und teilt diesen auf Sender und Empfänger auf. D.h. beiden haben dann einen Root-raised-Cosine-Filter (RCC) um so Bandbreiteneffizient zu sein und Intersymbolinterferenz zu verhindern. Für den Anfang kannst du sonst ja auch erstmal Differentielle Übertragungsverfahren wählen (z.B. DBPSK). Dann brauchst du keine Phasensynchronisation am Empfänger, da nur der Unterschied zum vorherigen Symbol interessiert. So einen Empfänger hab ich auch schon in einem kleinen Mikrocontroller implementiert. Hier habe ich dann auch die Abtastrate vier mal so hoch gewählt wie die Trägerfrequenz, weil dann die Mischung einfach wird (Multiplikation mit 1, 0, -1, 0, ... usw.)
Holger K. schrieb: > Diese "Verrundung" soll > dazu dienen, die Bandbreite zu reduzieren. Ja, wenn du da nichts filterst (also Rechtecke fuer die einzelnen Bits nimmst,) wird dein Spektrum sin(x)/x foermig, nicht das, was gut in einen Kanal mit vorgegebener Bandbreite passt... Holger K. schrieb: > Wenn ich nun im Sender für den LP die Filterkoeffizienten b verwende und > im Empfänger im LP filter ebenfalls die gleichen Koeffizienten b wie im > Sender, ist dies dann ein "matched filter"? Wenn deine Filterkoeffizienten achsensymmetrisch sind, dann ja. Sonst halt gedreht. Also b[0] im Sendefilter ist dann b[N] im Empfangsfilter, b[1]=b[N-1], usw. Beispiel: Haettest du also als Sendefilter sowas exotisches: [16,8,4,2,1], dann waere das "matched" Empfangsfilter [1,2,4,8,16]. Bei so einem achsensymmetrischen Filter: [-1,0,5,8,5,0,-1] waere das Empfangsfilter identisch. Weils "von hinten wie von vorn ist" :-) Da Gute: Egal, wie bekloppt diese Filterkoeffizienten aussehen, nach dem Durchlaufen von Filter und matched Filter sind alle Phasenverzerrungen, die evtl. ein einzelnes Filter gemacht haette, auf jeden Fall wieder weg. Holger K. schrieb: > Bisher konnte ich noch nichts demodulieren. Das Studium des Skripts wird > daran glaube ich auch noch nicht so schnell etwas ändern... Aber ich > komme dem Ziel näher. Ja, normal. Die Frau Werwolf sagt, des g'hoert so :-) Gruss WK
Danke für eure Antworten. Lukas schrieb: > und das Filter sollte die Nyquist Bedingungen erfüllen um > Intersymbolinterferenz zu verhindern. Stimmt, das habe ich gesehen. Diese besagt ja, dass die Filterkurve genau bei der Abtastzeit T seine Nulldurchgänge hat und somit das nächste Symbol nicht benachteiligt. Dazu gibt es im Skript ein sehr anschauliches Bild. Dieses habe ich mal angehängt. Dabei stellt die gestrichelte Fläche die Fehlerwahrscheinlichkeit dar. Zudem noch ein Bild des Impulses nach der Roll-Off FIlterung mit Nulldurchgängen. Lukas schrieb: > Ja. Überlichweise nimmt man z.B. Cos-Roll-off-Filter und teilt diesen > auf Sender und Empfänger auf. D.h. beiden haben dann einen > Root-raised-Cosine-Filter (RCC) um so Bandbreiteneffizient zu sein und > Intersymbolinterferenz zu verhindern. Endlich habe ich verstanden, wass ein matched-filter ist :) Dazu habe ich jedoch noch eine Frage. Anscheinend sollte man ja seinen Impuls im Sender auch verrunden. Nun hätte ich den Sender jedoch wie folgt ausgeführt: Sinustabelle mit z.B. 360 Werten. Wenn ich nun z.B. Symbol 00 sende, dann weiss ich ja, dass dies z.B. einem Sinus der Amplitude x entspricht mit einer Phasenschiebung y. Nun würde ich also meinem DAC die Werte der Sinustabelle übergeben. Und zwar ab position 0 + y phasenverschiebung. Da ich 360 Werte habe, entspricht dies direkt den Grad. Zusätzlich könnte ich den Wert noch mit Faktor x für die Amplitude multiplizieren. Daher frage ich mich nun, wo ich in diesem Prozess noch etwas filtern könnte? Oder gehe ich die Modulation falsch an?$
Das Schleifenfilter hat oft eine sehr niedrige Grenzfrequenz. Es muss ja über viele Input-Bits mitteln um den Phasen/Frequenzfehler zu erhalten. Um die Costas Loop in Betrieb zu nehmen würde ich erstmal den offenen Regelkreis beobachten, und zwar mit einem geringen Frquenzfehler (z.B. 1Hz) am Eingang. Dann muss die Regelgröße näheringsweise ein Sinus 1Hz sein. Wenn man das gut sieht kann man versuchen den Regelkreis zu schliessen. Dann muss die Regelgröße es schaffen den VCO nachzuregeln. Die Regelgröße ist dann eine gedämpfte Schwingung bis der Fehler komplett ausgeregelt ist.
Holger K. schrieb: > Nun würde ich also meinem DAC die Werte der Sinustabelle übergeben. Und > zwar ab position 0 + y phasenverschiebung. Da ich 360 Werte habe, > entspricht dies direkt den Grad. In Matlab kannst du so vorgehen. Im realen Leben geht das voll in die Beinkleider. Du musst dafür sorgen, dass es keine Amplituden- und Phasensprünge gibt. Sonst wird dein Signal zu breit und wertvolle Energie verpufft in Seitenbändern.
Martin O. schrieb: > Das Schleifenfilter hat oft eine sehr niedrige Grenzfrequenz. Es muss ja > über viele Input-Bits mitteln um den Phasen/Frequenzfehler zu erhalten. > Um die Costas Loop in Betrieb zu nehmen würde ich erstmal den offenen > Regelkreis beobachten, und zwar mit einem geringen Frquenzfehler (z.B. > 1Hz) am Eingang. Danke das werde ich versuchen. Bernd K. schrieb: > Der Trick daran ist die Abrastrate. Stell Dir einen Sinus vor von 1kHz. > Und der ADC-Interrupt kommt mit genau 4kHz. Beim nullten und zweiten > Zeitpunkt nehm ich je ein Sample, multiplizier sie mit 1 und -1 und nenn > das "mischen mit cosinus", beim ersten und dritten nehm ich auch je ein > Sample, multiplizier sie mit 1 und -1 und nenn das "mischen mit sinus". > > Denn der 1kHz Sinus hätte 1 und -1 an bei Zeitpunkten 1 und 3 > und der 1kHz Cosinus hätte 1 und -1 an den Zeitpunkten 0 und 2. So, ich habe dies mal umgesetzt. Einmal ohne Filterung und einmal mit. Der Unterschied ist folgender: Ohne Filter:
1 | I_direct = [I_direct qam_sig(i)]; |
Mit Filter:
1 | I_direct = [I_direct qam_sig(i)-old_sample]; |
Erstes Bild ist ohne Filter. Zweites ist mit. Der letzte Plot ist dabei das Abtasten des ersten. Die magentafarbenen Linien representieren den Abtastzeitpunkt. Local Sin und Cos (zweiter plot) simulieren die lokalen Oszillatoren wie sie in einer Costas-Loop z.b. vorkommen um das QAM-Signal herunterzumischen. der dritte Plot (perfect I_mix...) stellt die ideale multiplizierung jedes einzelnen samples aus dem QAM-Signal mit dem perfekten Sinus und Cosinus aus Plot2 dar. Für interesierte habe ich noch den aufgeräumten Matlab Code angehängt.
Georg G. schrieb: > In Matlab kannst du so vorgehen. Im realen Leben geht das voll in die > Beinkleider. Du musst dafür sorgen, dass es keine Amplituden- und > Phasensprünge gibt. Sonst wird dein Signal zu breit und wertvolle > Energie verpufft in Seitenbändern. Eigentlich wollte ich so auch im Mikrocontroller vorgehen. Aber ja, du hast ja absolut völlig recht. Warum habe ich das nicht schon früher eingesehen. Ein Phasensprung im QAM-Signal ist ja eine schier unendlich hohe Bandbreite. Mann mann mann... Also eigentlich arbeite isch nun schon seit Tagen mit einem völlig realitätsfremden QAM Signal? haha... QAM-Signal ist im Anhang. voll mit Phasensprüngen... Das bedeutet, dass ich den Phasensprung bei I und Q mittels Raised Cosinus Filter abfangen muss, so, dass es auch zu keinen bzw. kaum ISI kommt? Somit Niquist Bedingung 1 erfüllt wird. Hmmm... Das heisst ich muss die DAC-Werte vor dem addieren durch ein FIR-Filter jagen. Oder?
Holger K. schrieb: > realitätsfremden QAM Signal Es gibt noch einen anderen Punkt, den du bisher konsequent ignoriert hast. Im realen Leben liegt die Symbolrate nicht bei Bruchteilen der Hilfsträger Frequenz sondern teilweise sogar darüber.
Georg G. schrieb: > Holger K. schrieb: >> realitätsfremden QAM Signal > > Es gibt noch einen anderen Punkt, den du bisher konsequent ignoriert > hast. Im realen Leben liegt die Symbolrate nicht bei Bruchteilen der > Hilfsträger Frequenz sondern teilweise sogar darüber. Ok, gut, oder auch nicht. Das heisst, bevor ich nun weiterhin versuche in Matlab mein QAM-Signal zu demodulieren, sollte ich zuerst ein korrektes, realistisches QAM-Signal haben. Also nochmals alles zurück an den Anfang und ein neues File namens modulator.m in Matlab anlegen :)
Holger K. schrieb: > sollte ich zuerst ein korrektes, realistisches QAM-Signal haben. Schau noch einmal in den ersten Thread zu diesem Thema. Bei einem der ersten Beiträge wurde dir nahegelegt, einen echten Modulator zu besorgen, damit du einen bekannten Ausgangspunkt hast. Eine Uni mit gutem Labor für Nachrichtentechnik sollte so etwas haben und kann dir vielleicht ein Signal aufzeichnen. Matlab ist ein wunderbares Programm. Ich staune immer wieder darüber, was man damit alles simulieren kann. Leider fehlt das Modul "wie das Leben so spielt".
Georg G. schrieb: > Schau noch einmal in den ersten Thread zu diesem Thema. Bei einem der > ersten Beiträge wurde dir nahegelegt, einen echten Modulator zu > besorgen, damit du einen bekannten Ausgangspunkt hast. Eine Uni mit > gutem Labor für Nachrichtentechnik sollte so etwas haben und kann dir > vielleicht ein Signal aufzeichnen. Das ist eine gute Idee! Wie wäre es, wenn ich parallel dazu versuche, ein QAM Signal mit gnuradio zu erzeugen? Georg G. schrieb: > Matlab ist ein wunderbares Programm. Ich staune immer wieder darüber, > was man damit alles simulieren kann. Leider fehlt das Modul "wie das > Leben so spielt". Ja das stimmt! Allerding sollte der Anwender auch wissen was er tut. Das ist bei der Krähe nicht immer der Fall ;)
Beitrag #5749590 wurde vom Autor gelöscht.
So, ich habe das mal mit gnuradio versucht. Leider scheint es da Probleme zu geben mit dem RCC oder mit dem Scope. Jedenfalls bekomme ich keinen Outpu meht nach dem RCC weil das GUI irgendwie hängenbleibt... Ich versuche nun also an ein korrektes QAM oder QPSK sample zu kommen, bevor ich weiter versuche irgendwas zu demodulieren.
Das Filter zur Impulsformung kommt nach dem Konstellationsdiagramn-mapping und vor der Mischung mit der Trägerfrequenz. Mit Gnuradio kenn ich mich nicht so gut aus, aber ich kann Mal schauen ob ich meine Matlab oder pythonscripte dazu noch finde
Lukas schrieb: > Das Filter zur Impulsformung kommt nach dem > Konstellationsdiagramn-mapping und vor der Mischung mit der > Trägerfrequenz. Danke, das werde ich heute mal testen. Lukas schrieb: > Mit Gnuradio kenn ich mich nicht so gut aus, aber ich kann Mal schauen > ob ich meine Matlab oder pythonscripte dazu noch finde Vielen Dank für dine Bemühungen. Es würde mich sehr freuen, wenn du diese mit mir teilen würdest, falls du sie denn findest. --- Bevor ich mich nun weiter mit der Thematik beschäftige habe ich doch noch eine grundlegende Frage. Wie im angehängten Bild ersichtlich, besteht bei mir ein Symbol derzeit aus zwei Sinus bzw. Cosinus Schwingungen. Ich gehe mal davon aus, dass wenigstens dies so stimmt oder? :) Eigentlich hatte ich bisher keine Zweifel daran, aber ich frage nun lieber einmal zuviel als zu wenig. Danke an alle, welche sich hier beteiligen.
Moin, Holger K. schrieb: > Wie im angehängten Bild ersichtlich, > besteht bei mir ein Symbol derzeit aus zwei Sinus bzw. Cosinus > Schwingungen. > Ich gehe mal davon aus, dass wenigstens dies so stimmt oder? :) Naja, es koennte ein Fall denkbar sein, wo das so sein koennte. Es ist aber sicherlich ein Sonderfall, wenn dein Symboltakt und der Traeger phasenstarr miteinander verkoppelt sind. "in Echt" ist das eher selten. Und die Verhaeltnisse sind auch etwas anders: Beispiel DVB-S; So'n Allerweltstransponder hat z.b. 27.5MSymbols/sec bei einer QPSK. Im Downlink ist die Transponderfrequenz irgendwo groessenordnungsmaessig bei 12GHz; d.h. ein Symbol dauert da dann 12E9/27.5M = 436.36 Traegerschwingungen. Hinter dem LNB ists aber schon runtergemischt auf z.B. 1.4GHz; dann sinds nur noch 50.91 Traegerschwingungen... Und wenn die Sonne auf dem LNB steht, oder der Schneesturm kalt pfeift, dann faengt der LO an in der Frequenz zu wandern, damit auch die 1.4 GHz, und das muss die AFC im Tuner (d.h. QPSK-Demodulator) dann auffangen... Beispiel NICAM: Da waeren es 352 KSymbols/sec und im Videobasisband eine Traegerfrequenz je nach Norm um die 5.x...6.x MHz - also ca. 17 Schwingungen/Symbol. Videomodulatoren kommen aber ueblicherweise mit dem analogen Bildtraeger irgendwo bei 38.9MHz raus, also ist der NICAM Traeger dann irgendwo bei 33MHz, also sinds dann schon ca. 94 Schwingungen. Und wenn das dann irgendwo ins UHF gemischt wurde, dann warens schnell mal so groessenordnungsmaessig 2000 Schwingungen/Symbol... usw. Gruss WK
Moin, Dein Signal im Basisband sind derzeit Rechtecke die du überträgst. Dein Basisbandsignal wird zur Übertragung hochgemischt mit cos und sin der Trägerfrequenz
Dergute W. schrieb: > Naja, es koennte ein Fall denkbar sein, wo das so sein koennte. Es ist > aber sicherlich ein Sonderfall, wenn dein Symboltakt und der Traeger > phasenstarr miteinander verkoppelt sind. Zum Glück habe ich da nochmals nachgefragt :) Also.... Mein Verständnis ändert sich dauern. Aktuell verstehe ich das so. Die Trägerfrequenz ist jene Frequenz von Sin und Cos mit welcher meine I und Q Signale nach dem Shaping gemischt werden. Das heisst in meinem Beispiel die Frequenz welche ich im Bild markiert habe richtig? Dergute W. schrieb: > DVB-S; So'n Allerweltstransponder hat z.b. 27.5MSymbols/sec bei > einer QPSK. Also daraus schliesse ich, dass ich einerseits Trägerfrequenz habe, und Symbolfrequenz. Eigentlich war mir dies bereits bewusst aber jetzt nochmals etwas klarer. Dergute W. schrieb: > sicherlich ein Sonderfall, wenn dein Symboltakt und der Traeger > phasenstarr miteinander verkoppelt sind. Das bedeutet, diese müssen nicht synchron sein? Das würde das ganze ja etwas vereinfachen, wobei ich denke dass es bei einer digitalen Umsetzung durchaus auf synchronität hinauslaufen wird, wenn auch die Träger digital erzeugt werden. Lukas schrieb: > Moin, > > Dein Signal im Basisband sind derzeit Rechtecke die du überträgst. Dein > Basisbandsignal wird zur Übertragung hochgemischt mit cos und sin der > Trägerfrequenz Vielen Dank für deine Bilder und deine Klarstellung. Diese haben mir sehr geholfen. Ich verstehe nun deutlich besser, wo das Raised Cosine Filter hingehört. Im ersten Bild (Modulator) sieht es so aus, als würden nur einzelne Peaks ins Filter gegeben. Ich hätte ja die möglichkeit ein "echter" Rechteck zu filtern oder auch nur peaks in der Mitte... Fragt sich, was mehr sinn macht. Das Bandpassfilter beim Eingang des ADCs habe ich so noch nirgends gesehen. Macht aber ja durchaus sinn... Ich werde nun auf jedenfall mal den Demodulator zur Seite legen und mich, dem ursprünglich als "simpel" angenommenen Modulator zuwenden. Jedenfalls sehe ich dass es langsam weiter geht dank euch!
Holger K. schrieb: > Die Trägerfrequenz ist jene Frequenz von Sin und Cos mit welcher meine > I und Q Signale nach dem Shaping gemischt werden. Ja. Da Sinus und Cosinus orthogonal zueinander sind, lassen sich diese beiden Datenpfade am Empfänger wieder trennen obwohl die auf der selben Frequenz übertragen werden. Das ist eigentlich der ganze Trick bei der Sache Holger K. schrieb: > Also daraus schliesse ich, dass ich einerseits Trägerfrequenz habe, und > Symbolfrequenz. Genau. Wenn man z.B. mehrere Funksysteme nebeneinander hat kann der Symboltakt durchaus gleich sein bei allen. Es sollte jedoch jeder auf einer anderen Trägerfrequenz arbeiten. Je nach Bandbreite dann mit entsprechenden Abstand zueinander. Holger K. schrieb: > Im ersten Bild (Modulator) sieht es so aus, als würden nur einzelne > Peaks ins Filter gegeben Dann bestimmt auch die Form direkt aus der Impulsantwort des Filters ( beim FIR entsprechen die Koeffizienten der Impulsantwort) Holger K. schrieb: > Das Bandpassfilter beim Eingang des ADCs habe ich so noch nirgends > gesehen. Macht aber ja durchaus sinn... Antialiasfilter vorm abtasten macht immer Sinn
Dergute W. schrieb: > Naja, es koennte ein Fall denkbar sein, wo das so sein koennte. Es ist > aber sicherlich ein Sonderfall, wenn dein Symboltakt und der Traeger > phasenstarr miteinander verkoppelt sind. "in Echt" ist das eher selten. Oh, sowas schwirrt einem dauernd durch den Kopf... Bei OFDM-WLAN (ok, kein Einzelträger, aber egal) ist es gefordert, dass Träger und Symboltakt phasenstarr sind (d.h. aus der selben Taktquelle erzeugt werden). Das beschleunigt die Synchronisation, damit kann man die Präambel verkürzen. Liegt da aber natürlich auch daran, dass die IQ-Erzeugung und die Trägermodulation bei WLAN örtlich nicht getrennt sind. Bei DVB-S sind da unzählige Mischerstufen im Pfad (Sat-Uplink, Umsetzung im Sat, LNB-Mischer, Receiver-Mischer). Da ist es eh ein Wunder, dass überhaupt was zu demodulieren ist ;) Holger K. schrieb: > Also.... Mein Verständnis ändert sich dauern. Dann solltest du evtl. auch noch verstehen, was eigentlich die Auswirkungen von Nicht-Synchronität bei Symbolrate bzw. Trägerdemodulation sind. Gerade bei QPSK ist das sehr schön sichtbar. Ich habe das gerne mit gnuplot in 3D (geht sicher auch mit Matlab) gemacht. Einfach die gefundenen Konstellationspunkte (x/y) eines Zufallsstroms über die Zeitachse (z) anschauen und dann "schräg" draufgucken. Wenn alles 100.000% passt, sind das einfach 4 Punktlinien in z-Richtung. Wenn die Trägerdemodulation nicht passt, kreisen die Konstellationspunkte um den 0-Punkt, das gibt in der 3D-Darstellung also Spiralen ("Fusilli"-Nudeln :) . Wenn die Trägerfrequenz vs. gefundene Demodulationsfrequenz nur um 1Hz falsch ist, dreht sich in einer Sekunde alles um 360 Grad herum. Ist die Symbolrate bzw. das Timing falsch, werden die IQ-Werte nicht an der höchsten Auslenkung abgetastet. Bei "nur" falschem Timing, aber richtiger Symbolrate versaut das das SNR. Insbesondere gibt es stärkere Intersymbolinterferrenz, weil man ja in die "Überblendungsbereiche" des Nachbarsymbols kommt. Da splittet sich dann ein QPSK-Konstellationspunkt noch stärker in vier kleine auf (noch stärker weil das mit dem normalen Rolloff-Filter eh schon passiert). Ist aber auch noch die Abtastrate leicht falsch, wandert der Abtastpunkt periodisch durch die Symbole. Das erzeugt zu- und abnehmende IQ-Amplituden, also eine Schwebung. Gibt dann eher so dreidimensionale Farfalle-Nudeln... Das schöne an der 3D-Darstellung ist, dass man den Synchronisationsmechanismen sehr schön bei der Arbeit zusehen kann :)
Georg A. schrieb: > Oh, sowas schwirrt einem dauernd durch den Kopf... Bei OFDM-WLAN (ok, > kein Einzelträger, aber egal) ist es gefordert, dass Träger und > Symboltakt phasenstarr sind (d.h. aus der selben Taktquelle erzeugt > werden). Das beschleunigt die Synchronisation, damit kann man die > Präambel verkürzen. Liegt da aber natürlich auch daran, dass die > IQ-Erzeugung und die Trägermodulation bei WLAN örtlich nicht getrennt > sind. Gut zu wissen. Bei mir wird IQ Erzeugung ja auch nicht getrennt sein. Ohne einen externen Oszillator zu haben, müsste ich mir also mühe geben, um Träger und Symbolfrequenz asynchron zu bekommen. Georg A. schrieb: > Wenn die Trägerdemodulation nicht passt, kreisen die > Konstellationspunkte um den 0-Punkt, das gibt in der 3D-Darstellung also > Spiralen ("Fusilli"-Nudeln :) Super Vergleich! Ich kann es mir sehr gut vorstellen. ---- So heute wieder mal ein Update von mir. Ich habe mich nun nochmals intensiv mit der Thematik beschäftigt. Das ich ein Raised Cosine Filter brauche ist mir inzwischen klar, da die Nulldurchgänge der Ausläufer genau bei den Abtastzeitpunkten liegen und ich somit "keine" Inter Symbol Interferenzen habe. Ich verstehe nun auch, weshalb es noch das Root Raised Cosine Filter gibt. Im Anhang befindet sich mein aktueller Stand des Modulators. Hier sieht man bei Plot2 und 3 sehr schön die blauen nadeln. Diese representieren die logischen Zustände des abgetasteten Digitalsignals. Und genau zu diesem Zeitpunkt geht der Ausläufer des gefilterten vorherigen Pulses bei Null hindurch! Sehr gut! Ziel erreicht! Die beiden I und Q Komponenten werden im letzten Plot mittels addition vereint. Ganz nach dem Blockschaltbild. Mit meinem ursprünglichen QAM-Signal hat dieses hier nicht mehr viel gemeinsam... haha Nun aber wieder mal eine Frage :) Für die Berechnung der Filterkoeffizienten wende ich aktuell folgende Methode an:
1 | total_data_points ist 2000 |
2 | sym_count ist aktuell 5 |
3 | |
4 | FIR_Coeff = rcosine(1,(total_data_points/sym_count)/4,'normal',0.35); |
Die Zahl 4 wurde von mir empirisch gewählt. Wähle ich die grösser (8), wird das Spektrum breiter, da der Impuls schmäler wird. Siehe dazu bild zwei. Wähle ich die Zahl kleiner (2) wird der Impuls breiter und das Spektrum bzw. die Bandbreite nimmt ab. Ich bin mir hierbei noch nicht ganz sicher, was zu wählen ist. Hat diese Breite einen Einfluss auf das SN-Verhältnis? (SNR) Wenn es nach Matlab geht, sollte ich neu die rcosdesign Funktion anwenden: https://ch.mathworks.com/help/signal/ref/rcosdesign.html Leider verstehe ich dort die zu übergebenden Parameter nicht ganz. Zitat:
1 | Truncate the filter to 6 symbols and represent each symbol with 4samples |
Welche Samples sind hier wohl gemeint? Ich habe bei mir zwei verschiedene Abtastzeiten. 1) Zeitpunkte an denen ich mein digitales Signal "Abtaste" (blaue Nadeln) 2) Zeitpunkte mit denen ich meinen Sinus und Cosinus Träger generiere (hier 400 Datenpunkte pro Symbol) Ich weiss, wieder ein Berg voll Fragen. Aber ich denke die Qualität des "Outputs" steigt von Tag zu Tag :) Danke für eure Beteiligung.
:
Bearbeitet durch User
Holger K. schrieb: > Ich bin mir hierbei noch nicht ganz sicher, was zu wählen ist. > Hat diese Breite einen Einfluss auf das SN-Verhältnis? (SNR) schmale Pulse kannst du enger zusammen packen und eine höhere Datenrate erzielen. Holger K. schrieb: > Im Anhang befindet sich mein aktueller Stand des Modulators. > Hier sieht man bei Plot2 und 3 sehr schön die blauen nadeln. Diese > representieren die logischen Zustände des abgetasteten Digitalsignals. > Und genau zu diesem Zeitpunkt geht der Ausläufer des gefilterten > vorherigen Pulses bei Null hindurch! Sehr gut! Ziel erreicht! Du kannst hier deine Datenrate sogar um den Faktor 4 erhöhen
Lukas schrieb: > schmale Pulse kannst du enger zusammen packen und eine höhere Datenrate > erzielen. Das schon, aber dadurch steigt ja auch die benötigte Bandbreite oder? Lukas schrieb: > Du kannst hier deine Datenrate sogar um den Faktor 4 erhöhen Wie kommst du auf den Faktor 4? Was für einen Einfluss hat eigentlich das Verhältnis von Trägerfrequenz zu Symbolfrequenz?
:
Bearbeitet durch User
Holger K. schrieb: > Wie kommst du auf den Faktor 4? Momentan hast du deine Datenimpulse ja alle 400 Punkte. Wenn alle 100 Punkte neue Daten erzeugst bist du trotzdem noch ISI-Frei bei gleicher Bandbreite. Aber eben mit 4fach höherer Datenrate Holger K. schrieb: > Das schon, aber dadurch steigt ja auch die benötigte Bandbreite oder? Deine Pulsform bestimmt die Bandbreite*. Wenn der Puls eh schon kurz ist, kann man die Pulse auch näher zusammen packen. (* wenn deine Daten statistisch unabhängig sind, bestimmt sich das Leistungsdichtespektrum nur durch die Pulsform)
Moin, Holger K. schrieb: > Das schon, aber dadurch steigt ja auch die benötigte Bandbreite oder? Die Bandbreite deines Signals wird unmittelbar durch die Bandbreite der (hier root raised cosine) Filter festgelegt. Holger K. schrieb: > Was für einen Einfluss hat eigentlich das Verhältnis von Trägerfrequenz > zu Symbolfrequenz? Ich wuerd' sagen: Keinen. An meinen Beispielen DVB-S und NICAM siehst du ja, dass die Traegerfrequenz lustig in der Weltgeschichte hoch und runter gemischt werden kann, ohne dass sich irgendwas anderes am Signal aendert. Ich wuerd' sagen: in dem 26.02.2019_003.PNG passen die Grenzfrequenzen der RRC-Filter zu deiner Symbolrate. Bei den anderen Nicht. Gruss WK
Lukas schrieb: > Wie kommst du auf den Faktor 4? sorry hab mir nur das erste Bild angeschaut. Bei 26.02.2019_003.PNG passen die Verhältnisse
Lukas schrieb: > sorry hab mir nur das erste Bild angeschaut. Bei 26.02.2019_003.PNG > passen die Verhältnisse Ok Danke. Das bedeutet, dass ich bei Bild 003 die idealen Filterwerte habe? Somit also optimale Bandbreitennutzung? Dergute W. schrieb: > Ich wuerd' sagen: Keinen. An meinen Beispielen DVB-S und NICAM siehst du > ja, dass die Traegerfrequenz lustig in der Weltgeschichte hoch und > runter gemischt werden kann, ohne dass sich irgendwas anderes am Signal > aendert. Das schon, aber ich kann ja kaum eine Trägerfrequenz wählen, welche identisch zur Symbolfrequenz ist. Oder noch schlimmer, Symbolfrequenz doppelt wie Trägerfrequenz. Siehe bild im Anhang :) Daher dachte ich, da gäbe es eine Grösenordnung wie min. 10 Mal höher wegen besserer Filterung bzw. niedrigerer Bandpasssteilheit (niedrigerer Filterordnung) beim Eingangsfilter des Empfängers etc.
Deine Trägerfrequenz muss so hoch sein, dass du keine spektrale Überlappung des Nutzsignals hast
Lukas schrieb: > Deine Trägerfrequenz muss so hoch sein, dass du keine spektrale > Überlappung des Nutzsignals hast Perfekt! Danke. Genau nach sowas habe ich gesucht. Wenn man sich das Bild anschaut ist es eigentlich logisch. Aber ist ja oft so im leben. Es ist einfach nachdem man es verstanden hat ^^ Wo hast du all die guten Bilder her? Gibts da ein Skript dazu?
:
Bearbeitet durch User
Holger K. schrieb: > Wo hast du all die guten Bilder her? Das Internet steckt voller Informationen: https://wirelesspi.com/quadrature-amplitude-modulation-qam/ Holger K. schrieb: > Das bedeutet, dass ich bei Bild 003 die idealen Filterwerte habe? > Somit also optimale Bandbreitennutzung? Nach nochmaligen drüberschauen, bin ich der Meinung, dass du auch in Bild 3 deine Datenrate verdoppeln könntest.
Lukas schrieb: > Nach nochmaligen drüberschauen, bin ich der Meinung, dass du auch in > Bild 3 deine Datenrate verdoppeln könntest. Das wäre ja dann einfach eine verdoppelung der Symbolfrequenz oder? Das sieht dann auf den ersten Blick (Bild 005) nicht viel anders aus als beim Bild 003. Ausser dass das Verhältnis von Trägerfrequenz zu Symbolrate geändert hat. Ich habe nun versuchsweise noch eine FFT über gefilterte I-Komponente und den Träger gemacht. In diesem Bild sieht man den Unterschied zwischen Trägerfrequenz zu Symbolfrequenz im Verhältnis 20:1 (Bild 007) und Verhältnis 20:2 bzw. 10:1 (Bild 006). Oder hast du eine andere Methode zur Erhöhung des Datenrate gemeint? ##EDIT Bild 003 zum Vergleich hinzugefügt
:
Bearbeitet durch User
Holger K. schrieb: > Oder hast du eine andere Methode zur Erhöhung des Datenrate gemeint? Ich meinte, dass du hier auch alle 200 Punkte einen neuen Datenimpuls haben kannst. (Die Nullstellen sind ja alle 200 Punkte, deine Daten kommen alle 400 Punkte) Oder eben den Symbolpuls doppelt so lang machen.
Lukas schrieb: > Oder eben den Symbolpuls doppelt so lang machen. Ich glaube du meinst die Pulsdauer halbieren? Bzw. die Symbolfrequenz verdoppeln? Wenn ja, dann bin ich gleicher Meinung und habe dich verstanden :) Damit wäre dann geklärt, dass die Filterform welche zu den obigen Kurven führt, wohl die optimalste ist!
Holger K. schrieb: > Ich glaube du meinst die Pulsdauer halbieren? > Bzw. die Symbolfrequenz verdoppeln? Ich meine entweder, dass deine blauen Pulse doppelt so häufig kommen, bei gleichbleibender roter Pulsform oder die rote Pulsform (also das raised cosine filter) mit doppelter Länge, bei gleichbleibenden blauen Pulsen Damit Symbolrate und Impulsform zusammenpassen für die max. Datenrate bei der Bandbreite
Lukas schrieb: > die rote Pulsform (also das raised cosine filter) mit doppelter Länge, > bei gleichbleibenden blauen Pulsen Ok ich glaube ich habs verstanden. Siehe Bild 1 da ist das Filter doppelt so lange: Bei Bild2 ist es wieder halb so lange wie ein Symbol. Bei Bild3 habe ich bei der Filtererzeugung von normal auf 'sqrt' gewechselt. Eigentlich ist es erst in Bild3 ein root raised cosine filter. Aber leider bricht die Amplitude komplett ein. Irgendwas scheine ich noch falsch überlegt bzw. nicht beachtet zu haben. Habe nun auch noch die Datenbits eingeblendet sowie ein "Rollout" für den Filter hinzugefügt. Aktuell 4 Symbole länger als Daten (Bits) eingehen. Damit man auch das gesamte Signal sieht. Zudem habe ich noch die "Abtastpunkte" für das Digitalsignal mit eingeblendet.
Genau, in Bild 26.02.2019_008.PNG siehts gut aus. Zu den jeweiligen Abtastzeitpunkten hast du genau die Amplitude 1 oder -1, je nach Bit. z.B. bei 1200 hast du die -1 vom Zeitpunkt 0, bei 1600 hast du die -1 vom Zeitpunkt 400, bei 2000 die 1 vom Zeitpunk 800 usw. Ich denke in dem dritten Bild passt die Skalierung / Normierung noch nicht
Hinweis: was man auch noch machen kann, um die Trägereinbrüche in dem QPSK-Signal loszuwerden, ist einen Offset von einer halben Symboldauer zwischen I und Q einzubauen. Siehe Bilder
Hey Lukas Vielen Dank für deine Antwort. Sieht gut aus. Werde ich mir auf jedenfall merken. Sieht so aus, als würdest du auch ein mathematisches simulationswerkzeug anwenden. Wahrscheinlich hast du das ganze in 10 Minuten umgesetzt gehab wofür ich 5 Tage brauchte :) So, offensichtlich habe ich ja den Modulator korrekt umgesetzt und kann mich nun wieder dem eigentlichen Thread-Thema widmen ^^ Bis auf die sache mit dem sqrt (Square Root Raised Cosine) filter, klappt ja alles. Ich begebe mich nun also wieder auf die "dunkle Seite" der Demodulation, wo noch keine Sonne scheint und viele offene Fragen und Baustellen brachliegen ^^ Ich melde mich wieder, sobald ich auf Grund gelaufen bin. Wird vermutlich schon relativ bald wieder der Fall sein... jedenfalls macht mir die Umsetzung der Regelschleife in Matlab weiterhin kopfschmerzen. Mal sehen ob es diesesmal besser klappt.
Hallo zusammen Nach ein paar Tagen Pause gehts es nun wieder weiter :) Ich habe heute die Demodulation vervollständigt. Dabei arbeite ich aktuell jedoch immer noch synchron. Das heisst es ist weiterhin noch keine Costas-Loop oder Symbolerkennung implementiert. Jedoch habe ich jetzt das zuvor generierte QAM-Signal gefiltert und analysiert bzw. demapped. Wie in diesem Beitrag geschrieben: Beitrag "Re: QAM-Demodulation. Feedback / Vorschläge gewünscht" Bricht die Amplitude bei einem Root Raised Cosine Filter komplett ein (auf demodulator Seite). Wenn ich jedoch die selben Coeffizienten auf der Demodulatorseite anwende, erhalte ich absolut brauchbare werte. Dies verwundert mich schon ein wenig. Denn wenn man sich im angehängten Bild Plot3 ansieht, dann sieht man das ungefilterte I-Signal (nach multiplikation mit dem lokalen Cosinus) und dann das mit den koeffizienten gefilterte Signal in blau. Ist ja wirklich extrem beeindrucken was solch ein Matched-Filter ausrichten kann. Ich bin wirklich sehr beeindruckt! Oder denkt ihr, da scheint was nicht zu stimmen? Hier noch die Matlab zeilen:
1 | b = FIR_Coeff; |
2 | I_component_unfiltered = I_component; |
3 | I_component = filter(b,0.5,I_component); |
Orange: I_component_unfiltered Blau: I_component Zusätzlich habe ich noch einen lokalen VCO implementiert. Diesen nach diesem Video: https://www.youtube.com/watch?v=tUot62jjlKA&list=PLvUvEbh7a8u-_YCPNEIrjdnD1jxPW7dVk&index=3 Dabei wird der CORDIC Algorithmus verwendet. Ein Bild ist ebenfalls angehängt. Dabei schreibt einer im Kommentar:
1 | So much faster not to have to calculate sin and cos every time you want to output a sample. |
Was meint der damit? Ich muss ja trozdem die sin und cos Funktion aufrufen. Ich kann hier nichtmal mehr eine Tabelle verwenden.
1 | w0 = 2*pi*(1/(local_osc_freq * start_error_freq)); |
2 | |
3 | for i=1:total_data_points |
4 | c_delay = c; |
5 | s_delay = s; |
6 | c = c_delay * cos(w0) - s_delay * sin(w0); |
7 | s = s_delay * cos(w0) + c_delay * sin(w0); |
8 | sine = [sine s]; |
9 | cosine = [cosine c]; |
10 | end |
Soviel mal zu Beginn. Nun soll die letzte Hürde genommen werden. - Die Implementation der Costas-Loop - Die Symbolerkennung - Die Erhöhung auf 16-QAM. Ich freue mich, wenn sich wieder einige von euch daran beteiligen :) Danke!
:
Bearbeitet durch User
Holger K. schrieb: > Nun soll die letzte Hürde genommen werden. Du schuldest mir einen neuen Monitor. Der aktuelle ist mit Kaffee gesprenkelt. Die ultimative Hürde kommt beim Übergang von Matlab auf den realen Prozessor. Aber du machst das schon...
Georg G. schrieb: > Du schuldest mir einen neuen Monitor. Der aktuelle ist mit Kaffee > gesprenkelt. Lieber Georg, kein Problem! Habe noch viele nicht mehr benötigte Monitore :) Wenn du mir deine Adresse per PN sendest, sende ich dir eine Tafel Schokolade zu :) Georg G. schrieb: > Die ultimative Hürde kommt beim Übergang von Matlab auf den realen > Prozessor. Aber du machst das schon... Ja, das denke ich mir auch. Hoffe ich werde es bis dahin schaffen.
Ich habe mal versuchsweise noch additives weisses gaussches rauschen (AWGN) hinzugefügt. Dies mit einem SNR von 10dB. Ich kann es kaum glauben, dass man davon so gut wie nichts sieht nach der Filterung mit den RCC Koeffizienten. Kann das jemand bestätigen, dass dies plausibel ist?
Matched Filter dient ja genau dazu bestmöglich zu detektieren und die Fehlerwahrscheinlichkeit zu minimieren. Deine Koeffizienten des Filters sind halt so skaliert, dass in der Reihenschaltung von 2 RCC Filtern, die Amplitude 1 zu den Abtastpunkten vorliegt.
Lukas schrieb: > Matched Filter dient ja genau dazu bestmöglich zu detektieren und die > Fehlerwahrscheinlichkeit zu minimieren. Ja, das schon, aber dass die Wirkung dermassen ausgeprägt ist, hätte ich nie gedacht!
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.