mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP IQ demodulieren, was ist mit der Phase


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bernd (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
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?

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin O. (ossi-2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Ge. B. (georg2011) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd schrieb:
> Zur Taktrückgewinnung wird das Signal quadriert und
> durch einen Bandpass geschickt

Welche GF?

Autor: Yalu X. (yalu) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:

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

efr.py efr129855.wav 129100 129855

erhält man folgende Ausgabe:

f_mix:    129855.0 Hz
f_demod0:    585.0 Hz
f_demod1:    925.0 Hz
f_sample:   7119.0 Hz
samples:   50176
data:
68 0a 0a 68 b7 00 00 00 80 0a 8e e9 06 13 d1 16 
68 09 09 68 17 e2 e8 99 8a 21 c0 e7 80 4c 16 68 
08 08 68 b7 b0 b1 50 07 bb b0 87 61 16 

Im Hexdump sind drei Telegramme erkennbar

 68   0a 0a   68   b7 00 00 00 80 0a 8e e9 06 13   d1   16 
 68   09 09   68   17 e2 e8 99 8a 21 c0 e7 80      4c   16
 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
Autor: Bernd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Bernd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
[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 :-(

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[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?

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[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:
./efr.py websdr_recording_start_2019-05-30T20_54_18Z_139.8kHz.wav 139000 139800
f_mix:    139800.0 Hz
f_demod0:    630.0 Hz
f_demod1:    970.0 Hz
f_sample:   7119.0 Hz
samples:   27776
data:
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.

Autor: Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Herman (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Was macht den der 2:1 Block genau?

Autor: Martin K. (mkmannheim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
    for sample in bandpassed:
        if sample > 0 and sample_old < 1:
            tick = not tick
        sample_old = sample

Autor: Bernd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
[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!

Autor: Yalu X. (yalu) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Bernd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Yalu: Danke für Deine fundierten Erklärungen.

Ich habe gerade noch etwas am Tiefpassfilter gespielt:
    ntaps = 17
    coeff_lp = signal.firls( ntaps, [ 0, 0.05, 0.15, 1], [ 1, 1, 0, 0])

    i_filtered = signal.lfilter( coeff_lp, 1, i)
    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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.