Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
UKW Modulator mit Lime SDR und GNU Radio
#1
Hallo Radiofreunde,

da ich nun zur dunklen Seite der Macht gewechselt bin Wink und mich mit digitalen Lösungen beschäftige möchte ich hier mein neuestes Spielzeug vorstellen. Es ist eine kleine Platine die einen komplettes "Software Defined Radio" (SDR) enthält, und zwar mit Empfangs- und Sendefunktion. Dieses über "Crowd Funding" realisierte Projekt hat zwei Produkte hervorgebracht den "Lime SDR" und den "Lime SDR Mini".

Ich habe den Lime SDR Mini bestellt und am Wochenende hat meine liebe Frau das Teil aus den USA nun mit nach "good old Germany" gebracht. Hier die Originalbox:

   

und hier  das kleine Board:

   

Dieses Board wird von GNU Radio unterstützt, also musste ich gleich die entsprechenden Module installieren was auf der verlinkten Seite unter den Punkten 5 und 6 verlinkt und dort auch sehr gut erklärt ist....Läuft.

Um etwas zu üben dachte ich ein UKW Sender wäre doch ein guter Einstieg. Die Blöcke für eine Monoversion waren schnell zusammen geklickt und funktionierten quasi auf Anhieb. Hier das Blockdiagramm in GNU Radio:

   

Dermaßen ermutigt wollte ich nun auch eine Stereoversion. Auch hier gilt wie bei AM Stereo, dass eine Lösung wie man sie in Hardware machen würde nicht immer die ideale Umsetzung in GNU Radio darstellt. Ein Beispiel:

In Hardware würde ich einen 38kHz Hilfsträger erzeugen und den 19kHz Pilotton dann mit einem Teiler /2 gewinnen. In GNU Radio habe ich nun keine Funktion gefunden die eine Frequenz durch zwei teilt, also habe ich den umgekehrten Weg beschritten und ein 19kHz Signal verdoppelt. Das wiederum geht in GNU Radio sehr einfach mit einem Multiplizierer dem man 2x das gleiche Signal zuführt.

Um keine Laufzeitprobleme zu bekommen habe ich auch die Erzeugung des Multiplexsignals etwas ungewöhnlich gemacht. Es handelt sich im Prinzip um einen Schaltencoder der aber weich mit Sinusschwingungen zwischen dem Linken und rechten Kanal hin und her blendet. Das gleiche Prinzip hatte ich schon mit meinem Röhrenencoder verwandt. Wie funktioniert das? Nun ich füge dem Hilfsträger einen Gleichanteil hinzu und multipliziere den rechten Kanal mit diesem Signal. Beim Linken Kanal wird das gleiche gemacht nur ist hier der Hilfsträger um 180° gedreht. Hier die Erzeugung von Hilfsträger und Pilotton:


.png   38kc_and_Pilot_gen.png (Größe: 17,95 KB / Downloads: 444)

Und dieser Teil stellt den eigentlichen Stereoencoder dar:


.png   Mux_and_Pilot_Adder.png (Größe: 5,25 KB / Downloads: 446)

In Formeln ausgedrückt ergibt das folgendes:

R*(1+Cos(2¶*38kHz)) + L*(1-Cos(2¶*38kHz)) Löst man die Klammern auf so ergibt sich:

(R+L) + (R-L)*Cos(2¶*38kHz)

Das ist aber genau die Formel eines FM Multiplexsignals, es fehlt nur noch der Pilotton. Diesen braucht man nur noch der Summe beizufügen und schon ist das FM Stereo Multiplexsignal fertig. Um die Phase des Pilottons einstellbar zu machen habe ich noch eine Verzögerungsblock (Delay) eingefügt. Damit kann die Kanaltrennung optimiert werden, und diese ist extrem gut in dieser Schaltung! Der Term in der ersten Klammer ist das Summensignal und der zweite Term ist das geträgerte Differenzsignal. Durch den symmetrischen Aufbau der Blöcke können Phasenverschiebungen vermieden werden was sich sonst negativ auf die Kanaltrennung auswirken würde.

Hier einige Bilder des Multiplexsignals mit einem 1kHz Signal:


.png   FMST_L=0_R=1_P=0.png (Größe: 23,03 KB / Downloads: 450)
Signal nur mit Rechts, Links ist aus


.png   FMST_L=R=1_P=0.png (Größe: 22,35 KB / Downloads: 443)
Signal bei dem Links und Rechts gleich sind (Monosignal)


.png   FMST_L=-R_P=0.png (Größe: 23,73 KB / Downloads: 448)
Sonderfall L=-R hier ist das Summensignal null und es entsteht nur das geträgerte Differenzsignal.

Natürlich darf eine Preemphase nicht fehlen und das Signal wird mit 10-fachem Oversampling verarbeitet:


.png   Preemphasis_and_Upsampling.png (Größe: 17,58 KB / Downloads: 442)

Die Ausgabe erfolgt über das Lime SDR Sink Modul in GNU Radio, vorher muss das Multiplexsignal natürlich noch frequenzmoduliert werden. Auch hier ist wie beim Phasenmodulator der FM Modulator nur mit zwei Ports ausgestattet. Er moduliert quasi mit der Trägerfrequenz von 0. In Realität erzeugt dieser Block die für die FM üblichen Besselfunktionen in der komplexen Zahlenebene. Das Lime SDR Modul spendiert dann den Träger hier 101MHz.

Hier die komplette Blockschaltung:

   

Das war mein erstes Projekt mit dem Lime SDR mini und ich muss sagen ich bin begeistert!  Ich habe noch viele Ideen was man damit alles anstellen kann: DAB+ Sender, DVB-T bzw. DVB-T2 und auch historische Verfahren wie "World  Space Radio" könnte man sicher damit simulieren. Bis ich das hinbekomme muss ich aber noch einiges lernen, da mein Wissen aus dem Studium dank 30 Jahren im Vertrieb und Marketing doch etwas verblasst ist...
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#2
Hallo Semir,

da habe ich Dir wohl zum richtigen Spielzeug geraten! Jetzt fehlt noch der RDS Encoder im Flowgraph! Ich weiß das gibt es im Netz alles schon fertig zusammengeklickt, aber irgendwie macht es dann doch Spaß Modulationsarten selbst nochmal mit Funktionsblöcken nachzubauen. In späteren Projekten kann man dann immer noch auf fertige Funktionsblöcke zurückgreifen. Den FM Sender gibt es ja fertig mit dem Funktionsblock NBFM Transmit und WBFM Transmit in der GNU Radio Bibliothek. Übrigens geht es auch hier wieder mehrere UKW- Radiosender live mit nur einem SDR auf mathematischen Weg zu erzeugen! Man braucht also nicht zigmal die gezeigte Platine kaufen, es genügt ein Exemplar. Da der LimeSDR(mini) auch gleich noch ein Empfänger ist, kann man mühelos auch Normenwandler in GNU Radio designen. Beispielsweise empfängt man UKW oder DAB+ und setzt diese direkt auf die Mittelwelle um.
Auch DVB nach PAL, NTSC,... wäre denkbar. Der genutzte PC sollte aber leistungsstark genug sein, alle Operationen im Basisband in Echtzeit zu berechnen! Viel Arbeitsspeicher und eine halbwegs aktuelle Mehrkern-CPU sind hier ausschlaggebend.

Gruß Bernhard.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#3
Hallo Bernhard,

Ja das Lime SDR Mini Teil ist genial. Mittlerweile habe ich die Platine in ein kleines Alugehäuse eingebaut. Mit dem RDS stehe ich im Moment noch auf dem Schlauch. Die RDS Pakete habe in in GNU Radio installiert aber ich konnte dazu keine für mich nützliche Beschreibung finden wie ich die konfigurieren und einsetzen muss. Da ich mich bisher mit RDS nicht groß beschäftigt habe muss ich hier erst mal etwas im Internet suchen und lernen. Auch kann ich im Moment mit den Blöcken rund um digitale Modulation nicht soviel anfangen. Wie z.B. mache ich eine 2- oder 4-PSK? Ich denke mal das geht mit den "Constellation" Blöcken die wohl auch eine QAM erzeugen können. Die nächste Frage ist wie bekomme ich die Bits in der richtigen Reihenfolge in den Modulator...Fragen über Fragen.

Dann habe ich noch etwas herausgefunden das mich verwundert. Offenbar ist es so, dass alle in Gnu Radio erzeugten Sinusschwingungen eine feste Phasenbeziehung zueinander haben. Das hätte ich so nicht erwartet, aber ich denke auch hier muss ich umdenken. Wie ich darauf gekommen bin? Nun ich hatte ja den 38kHz Hilfsträger durch Verdoppelung des Pilottons erzeugt um eben eine feste Phasenbeziehung zwischen dem 38kHZ und dem 19kHz Signale zu erhalten:

   

Nun habe ich im  Netz andere Lösungen studiert und gesehen, dass es auch viel einfacher geht:

   

Beide Lösungen funktionieren gleich gut. Auch die Phase mit dem "Delay" Block muss auf dem gleichen Wert stehen (8) für beste Kanaltrennung. Wieso ist das so? Da die Software ja die einzelnen Anforderungen sequentiell abarbeiten muss hätte ich erwartet, dass die Phasenbeziehung nicht fest ist und sich z.B ändert wenn ich einen Block irgendwo im Design einfüge oder ändere. Das ist ja kein FPGA der einen Code quasi parallel abarbeiten kann. Vielleicht hast Du ja dazu eine Erklärung.
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#4
Hallo Zusammen,

nun bin ich schon wieder einen Schritt weiter und habe die Beispiele im Ordner von LimeSDR gefunden. Damit sollte ich schon mal weiter kommen...Die Crux mit Linux ist halt manchmal, dass man geradezu hellseherische Fähigkeiten haben muss um gewisse Ordner zu finden. Wie hier z.B. den "examples" Ordner unter "usr/gnuradio/" normalerweise schaue ich nie unter "usr" das ist ja das Äquivalent von "Program Files" in Windows da muss man normalerweise nichts machen...
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#5
(12.12.2019, 22:10)Semir schrieb:  Das ist ja kein FPGA der einen Code quasi parallel abarbeiten kann. Vielleicht hast Du ja dazu eine Erklärung.

Hallo Semir,

Bausteine in GNU Radio sind doch nur Zahlenreihen (in C ausgedrückt Arrays). Alle diese werden über einen 
Index quasi zeitsynchronisiert. Ein neu eingeführter oder gelöschter Baustein verändert die Position eines Samples in dieser Zahlenreihe ja nicht. Das 10. oder 27. Sample bleibt immer das 10. oder 27. Sample. Nur die Rechenvorschrift für Sample 10 oder 27 verändert sich. Ein Delay verzögert für die Nachfolgebausteine des jeweiligen Graphen (und nur für diese) die Indizierung um seinen Zahlenwert.

Da muss auch nichts parallel abgearbeitet werden! Für einen Live-Sendebetrieb müssen halt pro Sekunde mindestens so viele Ausgangssamples berechnet werden , wie die Ausgangssamplerate vorschreibt, ansonsten hat das Rechenwerk alle Zeit der Welt. 

Und warum sollte ein zweiter oder dritter Signalgeneratorbaustein bei gleicher Parametrierung unterschiedliche Phasen aufweisen aufweisen? Wertetechnisch sind doch alle Samples gleich und der eine Generator fängt ja nicht mit Sample x und der andere mit Sample y an. Alle fangen mit dem 0. Sample an und wenn für das ganze GNURadio-Programm das 0. Ausgangssample berechnet ist, geht es mit dem 1. 2. 3. ... Sample weiter.

Gruß Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#6
Mal eine "dumme" Frage an die "Signaltheoretiker", diese mathematische Beschreibung des Stereo-Multiplex-Signals

(06.12.2019, 01:43)Semir schrieb: ...
In Formeln ausgedrückt ergibt das folgendes:

R*(1+Cos(2¶*38kHz)) + L*(1-Cos(2¶*38kHz)) Löst man die Klammern auf so ergibt sich:

(R+L) + (R-L)*Cos(2¶*38kHz)

Das ist aber genau die Formel eines FM Multiplexsignals, es fehlt nur noch der Pilotton. Diesen braucht man nur noch der Summe beizufügen und schon ist das FM Stereo Multiplexsignal fertig.
---

mit der Cosinus-Funktion für die 38kHz Trägerfrequenz des amplitudenmodulierten Differenz-Signals findet man fast überall, ergibt aber bei der Simulation (ja, damit fang ich an, mich anzufreunden) kein normgerechtes MPX-Signal

   

Nur wenn man für den Term die Sinus-Funktion verwendet, erhält man ein typisches MPX-Signal mit den 19kHz Pilotton-Spitzen oberhalb und unterhalb im 38kHz AM-Signals. Ohne dem bekommt sonst keine vernünftige Kanaltrennung, da es einen 90° Phasenversatz (Cosinus - Sinus) gibt.

Warum ist das so bzw. stimmt die Formel mit der Cosinus-Funktion nicht oder stimmt die Simulation nicht?

Gruß

(Reflex-)Kalle
Zitieren
#7
Hallo Kalle,

das ist eine interessante Simulation. So hatte ich mir das noch nicht angesehen. Der Unterschied zwischen Sin und Cos ist ja nur eine Phasenverschiebung von 90°. Ich habe ja in meinem Blockdiagramm einen Block "delay" für den Pilotton eingebaut. Damit kann ich die Phasenbeziehung zum 38kHz Träger beliebig einstellen. Ich mache das pragmatisch nach bester Kanaltrennung. Das dürfte dann die entsprechende korrekte Konstellation ergeben die Du oben in der Simulation auch als Ergebnis hast. Es ist im Prinzip egal ob man mit Sin oder Cos Moduliert es muss nur der PT in der richtigen Phasenlage zugesetzt werden.

Wenn ich den 38kHz Träger um 90° verschiebe muss ich um die Phasenbeziehung aufrecht zu erhalten den PT um 45° verschieben, da ja da die Periodendauer doppelt so lang ist.

Ich werde mal testen wie sich das Ganze verhält wenn ich den 38kHz Träger mit Sin anstelle von Cos ausgebe mal sehen bei welchem Delay dann die Kanaltrennung optimal ist.

Generell bitte ich alle die hier mitlesen das Ganze nicht zu ernst zu nehmen. Ich bin selber noch Anfänger mit GNU Radio und am experimentieren und so manches hier ist unausgereift. Die hier vorgestellten GNU Radio Projekte sind als Anregungen gedacht mehr nicht. Ich bin sicher vieles kann man noch optimieren...
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#8
Danke Semir

für deine Überlegungen und die Antwort.

Dann wäre die zutreffendste mathematische Beschreibung des MPX-Signals die Formel

V(MPX)=0,45*(L+R)+0,45*(L-R) *sin(2¶*38kHz)+0,1*sin(2¶*19kHz)

Und richtig, wenn man den Cosinus-Funktion für das amplitudenmodulierte Differenz-Signal verwendet, muss man den Pilotton um +/-45° phasenverschoben mit Bezug zur 38kHz Trägerfrequenz, die durch die Cosinus-Funktion selbst schon eine 90° Phasenlage hat, hinzufügen, um auch ein normkonformes MPX-Signal  zu erhalten. Das zeigt dann die Simulation auch so

   

Statt der 45° Phasenverschiebung (90° 38kHz Trägerfrequenzlage - 45° Phasenverschiebung) des Pilottones könnte man auch 135°, also 90°+45°, oder auch 45°+180°=225° bzw. 90°+180°-45°=225° verwenden. Je nach dem sind dann nur die Tonkanäle (nach der Demodulation) gegeneinander vertauscht.

Simulation und mathematisch gebildete Signale sind ja letztlich das Selbe.

Schöne Vorweihnachtszeit

(Reflex-)Kalle
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  AM Modulator mit Trägersteuerung und XCF8.. Semir 41 19.425 14.02.2024, 23:25
Letzter Beitrag: Semir
  DDS AM Modulator mit Arduino Semir 74 42.163 20.01.2021, 16:18
Letzter Beitrag: Merlin_681
  AM Stereo (CQUAM) Modulator mit TBA120 und TBA520 Semir 71 52.805 24.05.2019, 23:35
Letzter Beitrag: Semir
  Universell einsetzbarer TV Modulator Semir 17 8.283 21.05.2019, 16:36
Letzter Beitrag: Reflex-Kalle
  AM- Modulator mit integrierten Signalquellen scotty † 11 5.174 08.03.2019, 22:26
Letzter Beitrag: Semir

Gehe zu: