Ich habe über http://websdr.org/ ein EFR-Signal mitgeschnitten https://de.wikipedia.org/wiki/Funkrundsteuertechnik Das möchte ich nun dekodieren. Zum Anhang: Ganz oben ist das Originalsignal, Samplerate 7119 Hz. Zu sehen sind die zwei Frequenzen (925 Hz und 584 Hz). Im ersten Versuch habe ich das Signal nach einem Blockschaltbild aus der Vorlesung dekodiert. Zur Taktrückgewinnung wird das Signal quadriert und durch einen Bandpass geschickt. Das Ergebnis wird mit dem Originalsignal gemischt und tiefpassgefiltert. Das Resultat ist das zweite Signal von oben. Man sieht was, aber so richtig interpretieren kann ich es nicht. Dann habe ich mich an einer IQ-Demodulation versucht. Also das Eingangssignal einmal mit einem Sinus und einmal mit einem Cosinus multipliziert. Anschließend den Betrag gebildet( sqrt(I^2+Q^2)) und durch einen Tiefpass geschickt. Das Ergebniss (drittes Signal von oben) sieht super aus. Die kleinen Einbrüche in der Amplitude beim Frequenzwechsel sind sehr gut zu erkennen. Nun ja, die eigentliche Information steckt in der Phase. Die Phase habe ich mit numpy.arctan( Q / I) ermittelt. Aber außer einem stetig steigenden Phasenwinkel sehe ich nix verwertbares. Da hilft auch der anschließende Tiefpass nicht. Hat jemand einen Tipp, wie ich an die Information, die in der Phase steckt komme? Was hab ich falsch gemacht?
Moin, Bernd schrieb: > Im ersten Versuch habe ich das Signal nach einem Blockschaltbild aus der > Vorlesung dekodiert. Zur Taktrückgewinnung wird das Signal quadriert und > durch einen Bandpass geschickt. Hm, jetzt kenn ich halt nicht dein Blockschaltbild aus der Vorlesung. Aber koennt' das sein, dass das fuer eine QAM-Demodulation ist und du da ein FSK Signal hast? Gruss WK
Bei deinem Originalsignal sieht man ja sogar die FM mit bloßem Auge. Da sollte die Demodulation kein Problem sein. Mit welcher Frequenz mischt Du das EFR Signal bevor es digitaklisiert wird? Welcho LO Frequenz nimmst Du zu IQ Erzeugung? Bei der IQ Demodulation musst Du die LO-Frequenz im SDR so einstellen, dass danach dass Signal +170Hz bzw -170 Hz hat. Die Phase ermittelt man dann am besten mit der atan2 Funktion. Der Phasenverlauf ist dann immer pro Bit linear Steigend oder Fallend. Man brauch dann quasi nur feststellen ob die Phasenänderung positiv oder negativ ist.
Bernd schrieb: > Zur Taktrückgewinnung wird das Signal quadriert und > durch einen Bandpass geschickt Welche GF?
Ich habe mal für das EFR-Signal dieses Demodulationsverfahren https://de.wikipedia.org/wiki/Frequenzumtastung#Nicht_koh%C3%A4renter_FSK-Demodulator und die Dekodierung des demodulierten Signals in eine Bytesequenz gemäß https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter#Asynchronbetrieb_(Start-Stop-Betrieb) in ein Python-Progrämmchen zusammengeklopft (efr.py). Aufruf:
1 | efr.py <WAV-Datei> <Trägerfrequenz/Hz> <Mischerfrequenz/Hz> |
Im Bernds Beispiel liegt die Mischerfrequenz bei etwa 755 Hz oberhalb der Trägerfrequenz, wodurch die beobachteten Frequenzen von 925 Hz und 585 Hz (755 Hz ± 170 Hz) entstehen. Die Datei efr129855.wav enthält ein Signal vom DCF49 in Mainflingen (129,1 kHz) mit 129100 kHz + 755 Hz = 129855 Hz heruntergemischt. Wie man in efr129855.png sieht, gleicht das Signal dem in Bernds Beispiel. Mit
1 | efr.py efr129855.wav 129100 129855 |
erhält man folgende Ausgabe:
1 | f_mix: 129855.0 Hz |
2 | f_demod0: 585.0 Hz |
3 | f_demod1: 925.0 Hz |
4 | f_sample: 7119.0 Hz |
5 | samples: 50176 |
6 | data: |
7 | 68 0a 0a 68 b7 00 00 00 80 0a 8e e9 06 13 d1 16 |
8 | 68 09 09 68 17 e2 e8 99 8a 21 c0 e7 80 4c 16 68 |
9 | 08 08 68 b7 b0 b1 50 07 bb b0 87 61 16 |
Im Hexdump sind drei Telegramme erkennbar
1 | 68 0a 0a 68 b7 00 00 00 80 0a 8e e9 06 13 d1 16 |
2 | 68 09 09 68 17 e2 e8 99 8a 21 c0 e7 80 4c 16 |
3 | 68 08 08 68 b7 b0 b1 50 07 bb b0 87 61 16 |
deren Format und Prüfsumme tatsächlich dem EFR-Protokoll entsprechen: https://de.wikipedia.org/wiki/Funkrundsteuertechnik#Protokoll Zu beachten ist, dass das angewandte Verfahren nur dann funktioniert, wenn die Mischerfrequenz weit genug oberhalb oder unterhalb der Trägerfrequenz liegt. Ist die Mischerfrequenz gleich der Trägerfrequenz, sind Frequenzen nach der Demodulation betragsmäßig gleich (±170 Hz), so dass sie – wie von Martin beschrieben – nur über den Phasenverlauf voneinander unterschieden werden können. Edit: Ich habe versehentlich die falsche WAV-Datei angehängt (efr128345.wav). Die richtige (auf die sich obiger Text bezieht ist efr129855.wav. Natürlich kann auch die andere verarbeitet werden, dann muss aber als Mischerfrequenz 128345 angegeben werden.
:
Bearbeitet durch Moderator
Erstmal Danke an Alle für die sachdienlichen Hinweise! Ich versuche mal einzeln zu antworten, der Übersicht wegen. [Synchrondemodulator] Dergute W. schrieb: > Hm, jetzt kenn ich halt nicht dein Blockschaltbild aus der Vorlesung. Ich hatte versucht es mit Worten zu beschreiben. Nun habe ich es nochmal gezeichnet und dabei ist mir aufgefallen, das ich den Frequenzteiler vergessen hatte. Den habe ich noch realisiert und an diversen Parametern (Bandpassfilter, Delay vorm Mischer, Komparatorschwelle) gespielt. Jetzt kommt ein lesbares Signal raus.
[IQ-Demodulator] Martin O. schrieb: > Mit welcher Frequenz mischt Du das EFR Signal bevor es digitaklisiert > wird? Wenn ich das richtig sehe, war der websdr-Empfänger auf 139,8 kHz eingestellt. DCF39 sendet auf 139,0 kHz. Da empfange ich in Kehrlage, oder? > Welcho LO Frequenz nimmst Du zu IQ Erzeugung? Ich verwende 754.5 Hz. Damit sollte der Anstieg bzw. Abfall der Phase gleichgroß sein. > Bei der IQ Demodulation musst Du die LO-Frequenz im SDR so einstellen, > dass danach dass Signal +170Hz bzw -170 Hz hat. Die Phase ermittelt man > dann am besten mit der atan2 Funktion numpy.arctan2! Damit und mit der richtigen LO-Frequenz ist im Phasenanstieg tatsächlich sowas wie Information zu erkennen. Ich bekomme die nur noch nicht extrahiert :-(
[Synchrondemodulator] Ge. B. schrieb: > Bernd schrieb: >> Zur Taktrückgewinnung wird das Signal quadriert und >> durch einen Bandpass geschickt > > Welche GF? Jetzt relativ breitbandig (siehe Bild signalkette.png, das dritte Bildchen von links), Hauptsache DC wird zu null, damit der Frequenzteiler richtig arbeitet. Vorher hatte ich nur das Doppelte der hohen Frequenz durchgelassen. Damit wird das Ganze eher ein schmalbandiger Pegeldetektor. Welche Grenzfrequenz(en) empfiehlst Du?
[Nicht kohärenter FSK-Demodulator] Yalu X. schrieb: > Ich habe mal für das EFR-Signal dieses Demodulationsverfahren Da steht was von 'reduziertem Schaltungsaufwand'. Das kann ich noch nicht nachvollziehen. Man braucht doch doppelt soviele Mischer und Tiefpässe im Vergleich zur IQ-Demodulation?!? Vom Prinzip ist ähnlich dem hier beschriebenem: Beitrag "Re: FSK demodulation" > efr.py <WAV-Datei> <Trägerfrequenz/Hz> <Mischerfrequenz/Hz> > Funktioniert out-of-the-box:
1 | ./efr.py websdr_recording_start_2019-05-30T20_54_18Z_139.8kHz.wav 139000 139800 |
2 | f_mix: 139800.0 Hz |
3 | f_demod0: 630.0 Hz |
4 | f_demod1: 970.0 Hz |
5 | f_sample: 7119.0 Hz |
6 | samples: 27776 |
7 | data: |
8 | 68 0a 0a 68 77 00 00 00 58 36 96 9e 05 13 51 16 |
Die Mischerfrequenz scheint bei diesem Verfahren recht unproblematisch zu sein. Das Telegramm wird richtig dekodiert, selbst wenn die Mischerfrequenz 100 Hz daneben liegt.
Bernd schrieb: >> Bei der IQ Demodulation musst Du die LO-Frequenz im SDR so einstellen, >> dass danach dass Signal +170Hz bzw -170 Hz hat. Die Phase ermittelt man >> dann am besten mit der atan2 Funktion > numpy.arctan2! > Damit und mit der richtigen LO-Frequenz ist im Phasenanstieg tatsächlich > sowas wie Information zu erkennen. Ich bekomme die nur noch nicht > extrahiert :-( Man könnte die noch etwas Filtern und dann die 1. Ableitung bilden und das Vorzeichen betrachten. Ich hab mal ein FSK-RFID (125/134 kHz) Demodulator auf einem kleinen Mikrocontroller gebaut. Da hab ich für die Demodulation mir das Vorzeichen von I[n]*Q[n-1] - I[n-1]*Q[n] angeschaut. Klappte ganz gut
Lukas schrieb: > Man könnte die noch etwas Filtern und dann die 1. Ableitung bilden und > das Vorzeichen betrachten. In welcher Weise? Ich habe das verfolgt, blicke aber nicht mehr so durch. Hätte mal jemand einen Tipp für ein Script oder ein gutes Buch zu dem Thema?
Herman schrieb: > Was macht den der 2:1 Block genau? Die Frequenz halbieren. Im Prinzip habe ich ein Toggle-Flip-Flop nachgebildet, welches im Nulldurchgang bei steigender Flanke schaltet:
1 | for sample in bandpassed: |
2 | if sample > 0 and sample_old < 1: |
3 | tick = not tick |
4 | sample_old = sample |
[IQ-Demodulator] Lukas schrieb: > Man könnte die noch etwas Filtern und dann die 1. Ableitung bilden und > das Vorzeichen betrachten. Mir ist gerade aufgefallen, das alle Welt erst die Tiefpassfilterung macht und danach Betrag und Phase aus I und Q bestimmt. Hier, z.B. erstes Bild: https://www.allaboutcircuits.com/textbook/radio-frequency-analysis-design/radio-frequency-demodulation/understanding-quadrature-demodulation/ Ich habe das die ganze Zeit andersherum gemacht. Beim Betrag fällt das auch nicht weiter auf, aber die Phase ist unbrauchbar. Nun habe ich auf I und Q erst einen Tiefpass drübergeschickt und dann die Phase bestimmt. Und was soll ich sagen: Kaum macht man es richtig funktioniert es! Vielen Dank an alle!
Bernd schrieb: > Yalu X. schrieb: >> Ich habe mal für das EFR-Signal dieses Demodulationsverfahren > Da steht was von 'reduziertem Schaltungsaufwand'. > Das kann ich noch nicht nachvollziehen. Man braucht doch doppelt soviele > Mischer und Tiefpässe im Vergleich zur IQ-Demodulation?!? Der reduzierte Schaltungsaufwand bezieht sich auf den kohärenten Demodulator (im darüberliegenden Abschnitt beschrieben), bei dem die beiden cos-Mischer entfallen, dafür aber ein phasengeregelter Oszillator erforderlich ist. Will man die Amplituden der beiden Frequenzanteile ohne Beachtung der Phase bestimmen, benötigt man für beide Frequenzen ein sin- und cos-Signal, mit dem das Eingangssignal gemischt wird. Prinzipiell kann man die Demodulation auch mit nur einer der beiden Frequenzen durchführen und das Ergebnis mittels eines Schwellwerts binarisieren. Das Problem dabei ist aber, dass bei einer ungenauen Demodulationsfrequenz, das demodulierte Signal ziemlich verkrüppelt aussieht, so dass die Wahl eines passenden Schwellwerts schwierig bis unmöglich wird. Wenn man das demodulierte Signal statt mit dem Schwellwert mit dem mit der zweiten Frequenz demodulierten (und damit in etwa gegenläufigen) Signal vergleicht tritt, dieses Problem weniger stark auf. Martin K. schrieb: > Lukas schrieb: >> Man könnte die noch etwas Filtern und dann die 1. Ableitung bilden und >> das Vorzeichen betrachten. > In welcher Weise? Ich habe in dein Bild von oben mal den idealisierten Phasenverlauf ohne die störenden Schwingungen eingezeichnet (s. Anhang, gelber Linienzug). Die senkrecht verlaufenden Abschnitte sind die 2π-Sprünge, die an den Wertebereichsgrenzen der atan2-Funktion (-π und +πi) entstehen. Denkst du diese Sprünge weg, ändert sich die Phase an jeder Stelle mit konstanter Geschwindigkeit, entweder in positiver (grüne Balken) oder negativer Richtung (rote Balken). Gelingt es dir durch geschicktere Filterung, den Phasenverlauf sauber zu ermitteln, bilden die Vorzeichen seiner Ableitung das gesuchte Digitalsignal. Bernd schrieb: > Kaum macht man es richtig funktioniert es! Kaum habe ich meinen Erklärungsversuch abgeschlossen, bist du auch schon selber auf des Rätsels Lösung gekommen. Ist aber schon in Ordnung, auf diese Weise lernst du mehr, als wenn dir alles von anderen vorgekaut wird :) Edit: Ich sehe gerade, dass die letzte Frage gar nicht von Bernd, sondern von Martin K. kam. Vielleicht ist die Erklärung dann doch noch zu etwas nütze.
:
Bearbeitet durch Moderator
Bernd schrieb: > Mir ist gerade aufgefallen, das alle Welt erst die Tiefpassfilterung > macht und danach Betrag und Phase aus I und Q bestimmt. > Hier, z.B. erstes Bild: Wenn du I und Q vor der Bildung von Betrag und Phase nicht filterst, solltest du für das Eingangssingal s eigentlich das Ergebnis Betrag = sqrt((s·sin(ωt))² + (s·cos(ωt))²) = s und Phase = atan2(s·sin(ωt), s·cos(ωt)) = ωt (auf ±π normiert) bekommen.
@Yalu: Danke für Deine fundierten Erklärungen. Ich habe gerade noch etwas am Tiefpassfilter gespielt:
1 | ntaps = 17 |
2 | coeff_lp = signal.firls( ntaps, [ 0, 0.05, 0.15, 1], [ 1, 1, 0, 0]) |
3 | |
4 | i_filtered = signal.lfilter( coeff_lp, 1, i) |
5 | q_filtered = signal.lfilter( coeff_lp, 1, q) |
Durch die Zahl der Taps und leichter Modifikation der Grenzen von Durchlass- und Sperrbereich kann man die Nullstellen dahin wandern lassen, wo noch Reste vom Ursprungssignal sind, um diese zu minimieren. Gefällt mir :-)
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.