[Из песочницы] SDR DVB-T2 receiver на C++

Software Defined Radio (программно-определяемая радиосистема) — это метод замены работы по металлу (что, в принципе, полезно для здоровья) на головную боль программирования. SDR пророчат большое будущее и основным достоинством считается снятие ограничений в реализации радиопротоколов. Примером является метод модуляции OFDM (Orthogonal frequency-division multiplexing), которая стала возможна только методом SDR. Но есть в SDR и еще одна, чисто инженерная возможность, — это возможность контролировать и визуализировать сигнал в любой произвольной точке с наименьшими усилиями.

Одним из интересных стандартов связи является наземное эфирное телевидение DVB-T2.
Зачем? Конечно, можно просто не вставая включить телевизор, но смотреть там абсолютно нечего и это уже не моё мнение, а медицинский факт.

Если серьёзно, DVB-T2 разработан с очень широкими возможностями, в том числе:


  • indoor применение
  • модуляция от QPSK до 256QAM
  • полоса пропускания от 1,7MHz до 8MHz

Опыт приема цифрового телевидения по принципу SDR есть. Стандарт DVB-T есть в известном проекте GNURadio. Есть блок gr-dvbs2rx для стандарта DVB-T2 (все для того же GNURadio), но требующий предварительной синхронизации сигнала и он вдохновляет (отдельное thanks to Ron Economos).

Что мы имеем.

Есть стандарт ETSI EN 302 755, подробно описывающий передачу, но не прием.

Сигнал в эфире c частотой семплирования 9,14285714285714285714 MHz, модулируемый COFDM с 32768 несущими, в полосе 8 MHZ.

Принимать такие сигналы рекомендуется с удвоенной частотой семплирования (чтобы ничего не потерять) и на промежуточной частоте больше полосы пропускания (супергетеродинный прием), для избавления от смещения по постоянному току (DC) и «протекания» местного генератора (LO) на вход приемника. Устройства, удовлетворяющие этим условиям, слишком дороги для простого любопытства.

SdrPlay с 10Msps 10bit или AirSpy со схожими характеристиками на порядок дешевле. Здесь нет речи об удвоенной частоте семплирования и прием можно вести только с прямым преобразованем (Zero IF). Поэтому (по финансовым соображениям) переходим на сторону адептов «чистого» SDR с минимумом аппаратного преобразования.

Необходимо было решить две задачи:


  1. Синхронизация. Узнать точное отклонение радиочастоты с точностью до фазы и отклонение частоты семплирования.
  2. Переписать стандарт DVB-T2 задом на перёд.

Вторая задача требует много больше кода, но решаема усидчивостью и легко проверяется по тестовым сигналам.

Тестовые сигналы доступны на сервере BBC ftp://ftp.kw.bbc.co.uk/t2refs/ с подробной инструкцией.

Решение первой задачи сильно зависит от характеристик устройства SDR и возможностей управления. Использовать рекомендуемые функции управления частотой, как говорится, не увенчалось успехом, но дало много опыта чтения тех. документации, программирования, просмотра сериалов, решение философских вопросов…, короче говоря, забросить проект не удалось.

Вера в «pure SDR» только окрепла.

Принимаем сигнал как есть, интерполируем его практически до аналога и вынимаем уже дискретный, но похожий на настоящий.

Блок-схема синхронизации:

image

Здесь все по учебнику. Далее чуть сложнее. Необходимо вычислить отклонения. Есть много литературы и исследовательских статей, сравнивающих достоинства и недостатки разных методов. Из классики — это «Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission — Part I and II». Только я не встречал ни одного инженера, умеющего и желающего считать, поэтому был применен инженерный подход. Тем же методом синхронизации были внесены расстройки в тестовый сигнал. Путем сравнения разных метрик с известными отклонениями (сам же вносил) выбраны лучшие для производительности и простоты реализации. Отклонение частоты приема вычисляется сравнением защитного интервала и его повторяющейся части. Фаза частоты приема и частота семплирования оценивается по отклонению фаз пилот сигналов и оно же используется в простом, линейном эквалайзере OFDM сигнала.

Характеристика эквалайзера:

image

И все это хорошо работает, если знать когда начинается кадр DVB-T2. Для этого в сигнале передается символ преамбулы P1. Способ детектирования и декодирования символа P1 описан в Technical Specification ETSI TS 102 831 (там же много полезных рекомендаций по приему).

Автокорреляция сигнала P1 (самая верхняя точка начало кадра):

image

Первая картинка (до движущегося изображения осталось всего шесть месяцев…):

image

И именно здесь мы узнаем, что такое IQ imbalance, DC offset и утечка LO. Как правило, компенсация этих специфических для прямого преобразования искажений, реализована в драйвере SDR устройства. Поэтому ушло много времени, чтобы понять: выбивание звездочек из дружного созвездия QAM64 — это работа функций компенсации. Пришлось все отключить и писать свой велосипед.

И вот картинка задвигалась:

image

Модуляция QAM64 со специфическим поворотом созвездия в стандарте DVB-T2:

image

Если кратко, то это результат пропускания фарша обратно, через мясорубку. Стандарт предусматривает четыре вида перемешивания:


  • bit interleaving (битовое перемешивание с закручиванием столбцов)
  • cell interleaving (перемешивание ячеек в блоке кодирования)
  • time interleaving (оно же в группе блоков кодирования)
  • frequency interleaving (перемешивание частот в OFDM символе)

В итоге на входе имеем вот такой сигнал:

image

Все это борьба за помехоустойчивость кодированного сигнала.


Итог

Теперь мы можем видеть не только сам сигнал и его форму, но и служебную информацию.
В эфире два мультиплекса. В каждом два физических канала (PLP).

Одна странность замечена в первом мультиплексе — первый PLP имеет метку «multiple», что логично, так как он в мультиплексе не один, а второй PLP имеет метку «single» и это вопрос.
Еще интересней вторая странность во втором мультиплексе — все программы в первом PLP, а во втором PLP на тихой скорости присутствует сигнал неизвестной природы. По крайне мере, плеер VLC, понимающий около полусотни видео форматов и столько же аудио, его не распознает.

Сам проект можно найти здесь.

Проект создавался с целью определить саму возможность декодировать DVB-T2 с помощью SdrPlay (а теперь уже и AirSpy.), поэтому эта даже не альфа-версия.

P.S. Пока с трудом писалась статья, удалось прикрутить в проект PlutoSDR.

Кто-то сразу скажет, что там только 6Msps для IQ сигнала на выходе USB2.0, а нужно не менее 9,2Msps, но это уже отдельная тема.

© Habrahabr.ru