Лабораторная 8.9 — Восстановление несущей QPSK¶
Цель¶
Компенсировать CFO, который превращает QPSK-созвездие в кольцо, с помощью decision-directed петли Костаса и снять остаточную неоднозначность 90°.
Алгоритм¶
Для каждого символа петля:
- поворачивает отсчёт на отрицательную оценку фазы NCO;
- вычисляет QPSK phase error;
- обновляет интегральную составляющую частоты;
- обновляет фазу пропорционально-интегральным фильтром.
y = s · exp(-jθ)
e = sign(Re(y))·Im(y) - sign(Im(y))·Re(y)
freq += ki·e
θ += freq + kp·e
Петля совмещает кластеры с QPSK-сеткой, но может захватить любую из четырёх ориентаций k·90°. Известная преамбула перебирает четыре поворота и выбирает правильную раскладку битов.
Запуск¶
python blocks/block_08_modulation_and_synchronization/python/qpsk_carrier_recovery.py
Ожидаемый результат:
- до коррекции BER близок к случайному решению;
- после захвата петли остаются четыре компактных кластера;
- оценка NCO следует фазовому наклону CFO;
- после снятия
90°-неоднозначности BER равен нулю на контрольном sweep.
Эта лабораторная завершает QPSK-маршрут Block 8 и подготавливает перенос carrier recovery в потоковый RTL.