phasen-test — DCF77-PZF-Demodulation

Praktische Umsetzung der korrelativen Phasenauswertung (PZF) des DCF77-Signals,
dokumentiert auf der Homepage unter „Projekte → DCF77 → Stufe 4: PZF-Demodulation
in der Praxis".

Dateien

Wichtigste Dimensionierungs-Erkenntnisse

  1. BESTÄTIGT: PZF-Chiprate 77500/120 = 645,83 Chips/s (0,7927 s Sequenzdauer)
    deckt sich mit der offiziellen PTB-Quelle (Piester 2004, PTB-Mitteilungen
    114(4), S.345; https://www.ptb.de/cms/ptb/fachabteilungen/abt4/fb-44/
    ag-442/verbreitung-der-gesetzlichen-zeit/dcf77/phasenmodulation.html):
    512 Chips dauern dort laut Diagramm ≈793 ms, nicht die volle Sekunde -
    passend zur hier verwendeten Annahme. Phasenhub laut derselben Quelle:
    ±15,6° (nicht die frueher grob geschaetzten ±13°).
  2. Das Vorfilter muss die Modulation durchlassen (Hauptkeule ±512-646 Hz,
    je nach Chipraten-Hypothese) — ein trägerschmales Filter verbessert den
    Costas-Lock und zerstört gleichzeitig die Korrelation.
  3. Costas-Bandbreite: Messreihe 0.0005–0.1 zeigt einen breiten funktionierenden
    Bereich. Gewählt: w = 0.02 (bester gemessener Wert an der aktuellen
    Referenzaufnahme, 6.8σ, 15/15 Raster).
  4. Phasenextraktion: NICHT Complex To Arg (Grad) + DC Blocker verwenden - ein
    Costas Loop 2. Ordnung rastet mit 50% Wahrscheinlichkeit auf 180° statt 0°
    ein, dann liegt complex_to_arg auf der atan2-Wickelgrenze und ein
    nachfolgender linearer Filter (DC Blocker) erzeugt Klingelartefakte bis
    ±250°. Stattdessen Complex To Imag (Im(z) ~= theta[rad] fuer kleine Winkel)
    direkt in den Matched Filter - kein atan2, kein Wickelpunkt.
  5. Manche Aufnahmen zeigen einen Einschwing-Sprung: Korrelation bleibt einige
    Sekunden nach Aufnahmestart auffällig schwach und springt dann abrupt auf
    volles Niveau - unabhängig von der Costas-Bandbreite, also kein Bug in der
    Kette, sondern vermutlich AGC-/Rauschsperren-Einschwingen des jeweiligen
    Web-Empfängers. korrelation_check.py erkennt und meldet das automatisch.
    Die aktuelle Referenzaufnahme zeigt diesen Effekt nicht.

Ausführen

gnuradio-companion phasentest.grc
# oder headless:
python3 korrelation_check.py SND.178.63.122.223_2026-07-25T11_29_19Z_77.50_iq.wav
gnuradio-companion phasentest.grc
# oder headless:
python3 korrelation_check.py SND.178.63.122.223_2026-07-25T11_29_19Z_77.50_iq.wav