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, який детально описує передачу, але не прийом.

Сигнал в ефірі з частотою семплювання 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" тільки зміцніла.

Приймаємо сигнал як є, інтерполюємо його практично до аналога і виймаємо дискретний, але схожий на справжній.

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

SDR DVB-T2 receiver на C++

Тут усе за підручником. Далі трохи складніше. Необхідно обчислити відхилення. Є багато літератури та дослідницьких статей, які порівнюють переваги та недоліки різних методів. З класики - це "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission - Part I and II". Тільки я не зустрічав жодного інженера, який вміє і бажає рахувати, тому був застосований інженерний підхід. Тим самим методом синхронізації було внесено розлади в тестовий сигнал. Шляхом порівняння різних метрик із відомими відхиленнями (сам же вносив) обрані найкращі для продуктивності та простоти реалізації. Відхилення частоти прийому обчислюється порівнянням захисного інтервалу та його частини, що повторюється. Фаза частоти прийому та частота семплювання оцінюється за відхиленням фаз пілот сигналів і воно ж використовується в простому, лінійному еквалайзері OFDM сигналу.

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

SDR DVB-T2 receiver на C++

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

Автокореляція сигналу P1 (найвища точка початку кадру):

SDR DVB-T2 receiver на C++

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

SDR DVB-T2 receiver на C++

І саме тут ми дізнаємося, що таке IQ imbalance, DC offset та витік LO. Як правило, компенсація цих специфічних для прямого перетворення спотворень реалізована в драйвері SDR пристрою. Тому пішло багато часу, щоб зрозуміти: вибивання зірочок із дружнього сузір'я QAM64 – це робота функцій компенсації. Довелося все відключити та писати свій велосипед.

І ось картинка засувалась:

SDR DVB-T2 receiver на C++

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

SDR DVB-T2 receiver на C++

Якщо коротко, це результат пропускання фаршу назад, через м'ясорубку. Стандарт передбачає чотири види перемішування:

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

У результаті на вході маємо такий сигнал:

SDR DVB-T2 receiver на C++

Все це боротьба за стійкість до перешкод кодованого сигналу.

Підсумок

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

Одна дивина помічена в першому мультиплексі - перший PLP має мітку "multiple", що логічно, оскільки він у мультиплексі не один, а другий PLP має мітку "single" і це питання.
Ще цікавіша друга дивина в другому мультиплексі — всі програми в першому PLP, а в другому PLP на тихій швидкості є сигнал невідомої природи. Принаймні плеєр VLC, який розуміє близько півсотні відео форматів і стільки ж аудіо, його не розпізнає.

Сам проект можна знайти тут.

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

PS Поки важко писалася стаття, вдалося прикрутити в проект PlutoSDR.

Хтось одразу скаже, що там лише 6Msps для IQ сигналу на виході USB2.0, а потрібно не менше 9,2Msps, але це вже окрема тема.

Джерело: habr.com

Додати коментар або відгук