Эксперименты с Nb-IoT (LTE-NB). Прием и детектирование сигнала NPSS при помощи SDR HackRF.

В последнее время много разговоров на тему «интернет вещей» и связанных с этим технологий.
Одна из таких технологий — Nb-IoT, или Narrow-band Internet of Things.
Технология является подмножеством LTE, ну или в некотором смысле его упрощением.

Более подробную информацию можно найти в интернетах, в данной статье я расскажу о своих небольших экспериментах с реальным сигналом, принятым с ближайшей базовой станции и поделюсь результатами в виде картинок и моим комментариям к ним.
Данные эксперименты — это плод моей любознательности и желания изучать новое, чем я с вами и делюсь.

В Nb-IoT, как и в LTE, используется ODFM для Downlink и SC-FDMA для Uplink. Но об этом чуть позже. Сначала давайте разберемся, где вообще искать этот сигнал и как он может выглядеть.
Для приема сигнала я использовал HackRF, которую мне одолжил один хороший человек.



Для начала, погуглим и выясним, на каких вообще частотах работает этот самый Nb-IoT у нас в стране.



Подключив HackRF к компьютеру, я запустил программу SDR# и начал искать вручную в этих диапазонах. Задача не очень затратная, так как HackRF выдает мне 20 мегавыборок в секунду, что обеспечивает полосу в 20 МГц.
В конце концов наткнулся на следующий сигнал:



Если посмотреть на среднюю картинку, то выглядит очень похоже:



Видимо. я его нашел, вместе с сигналом LTE. Картинка намекает, что там действительно OFDM-сигнал, который состоит из множества поднесущих.



Что такое OFDM доступно объяснено, например, в этой статье. Если в кратце, это мультиплексирование с ортогональным частотным разделением каналов. То есть, каналы и длительности сигналов в них подобраны таким образом, что друг другу не мешают:



В идеальном виде приемник такого сигнала выглядит так: (картинка из википедии)



Выглядит просто, не так ли? Оцифровали сигнал, подали на FFT и имеем на выходе информацию с каналов. Далее декодируем каждый канал (обычно используются фазовые модуляции QAM, QPSK, BPSK. В Nb-IoT используются две последние) и извлекаем данные.

Но на деле все не так просто, как минимум потому, что мы не знаем момент, в который нам надо записать данные и отправить их на FFT. Если мы просто реализуем подобную схему, на выходе получим кашу. Кроме того, есть еще и некоторая неопределенность по частоте, с которой тоже надо разобраться.

В Nb-IoT задачу синхронизации выполняют специальные сигналы NPSS и NSSS. На первом, Narrow Primary Synchronization Signal, мы и остановимся. Это — первичный сигнал синхронизации.

Вся передача Nb-IoT в Downlink поделена на фреймы и субфреймы.




Нам необходимо во всем этом потоке каким-то образом выделить этот сигнал и научиться его детектировать программно.
Еще один товарищ поделился со мной моделью сигнала Nb-IoT в Матлабе (ее можно найти в одном из платных дополнений), На ней можно будет потренироваться, однако все же мне интереснее живой, реальный сигнал.



А вот так выглядит модель сигнала NPSS, вернее его амплитуда:


К нему мы вернемся чуть позже. Теперь нам надо поймать реальный сигнал и отсеять от него все лишнее.



Для дальнейшей работы я использовал связку HackRF -> GnuRadio (прием, простая обработка и фильтрация) -> UDP -> Моя программа.

Схема в GnuRadio получилась следующая:



В приемниках с аналоговым разложением на квадратуры и последующей оцифровкой есть проблема «постоянной составляющей». Есть алгоритмы, позволяющие от нее избавиться, но я поступил немного другим образом. Я выставил центральную частоту немного «левее» моего сигнала, а затем уже в GnuRadio я его сдвинул в центр. А постоянная составляющая и все лишнее обрезалась фильтром. Кроме того, так как полоса сигнала уменьшилась, соответственно, можно уменьшить и частоту семплирования.

Давайте посмотрим на сигнал, который мы приняли. Что-то похожее на модель, за исключением того, что на модели был отображен модуль сигнала, а здесь — квадратуры. Но структура узнаваема.



Ну а вот тот самый синхросигнал NPSS (модуль)



Видим, что визуально очень похож на сигнал из модели.

Построим также результат FFT в скользящем окне, 1024 точки:



Получилось немного размыто. Попробуем немного по-другому. 1024 точки, но берем по 200 точек, остальные заполняем нулями. Таким образом мы увеличиваем ширину каждого «фильтра», при этом сокращая длительность анализируемого сигнала.



Огонь!

Давайте разберемся, что такое сигнал NPSS.
Это сигнал, который состоит из m-последовательности длиной 11 во временной области, и последовательности Задова-Чу, тоже длиной 11, в частотной области. Чем хороши эти последовательности? А тем, что обе имеют хорошие автокорреляционные свойства.

АКФ последовательности Задова-Чу длиной 11:



АКФ м-последовательности длиной 11:



Начнем с более простого: Найдем корреляцию нашего сигнала с м-последовательностью во временной области. Сначала на модели.



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



Значит пора разбираться с сигналом еще и в частотной области.
Для начала отобразим сигнал после вычисления корреляции и FFT в скользящем окне.



Вот, уже выглядит интереснее, и надо считать корреляцию в частотной области.
Скажу сразу, это у меня получилось не сразу. Сначала я ошибся в алгоритме и получалось что-то, что вообще нельзя автоматически проанализировать.




Разобравшись в своих ошибках, я получил первый результат, и построил его в 3D. (длинная шкала — временная область, короткая — частотная)




Да, это то, что нужно. Вот еще немного сигнала, искусственно подвинутого немного от центра, большее количество записанных и проанализированных выборок.



Ну и можно так же посмотреть на кусок в 2D.



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

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



Построив этот сигнал, я замечаю, что это какая-то частота, и при этом модуль этого сигнала сильно «скачет» по амплитуде.



Проанализировав эту частоту, можно еще более точно установить отстройку от несущей. На данный момент точность определения частоты соответствует ширине фильтра в FFT на 1024 точки, а данный анализ позволит установить частоту еще более точно.

И тут я замечаю интересное. Я получаю сигнал не каждые 2400 выборок, а иногда каждые 2399. Следовательно, мой тактовый генератор рассинхронизирован с тактовым генератором базовой станции. Это видно на следующем графике:



Что-ж… HackRF. А что у тебя вообще с тактовым генератором?
Нашел сравнительную таблицу с другими SDR, и сравнение было явно не в пользу HackRF и как-то не воодушевляет.



Погуглив, что с этим сделать, принял решение заказать из китая TCXO сразу для HackRF, с заявленными 0.1 PPM, что скорее всего неправда, но по отзывам тех, кто такую штуку использовал, с ней намного лучше.



И теперь жду посылку.

Ну а на данный момент можно фиксировать промежуточный результат. Сигнал NPSS можно детектировать, однако остается проблема «биений» амплитуды в результатах вычисления корреляции, что может затруднить детектирование.
Частично эту проблему должен решить более стабильный тактовый генератор.



Спасибо за внимание! Готов ответить на вопросы и выслушать идеи о том, какие еще причины могли вызвать эти «биения» и как от этого можно избавиться.
  • ?
  • 17 апреля 2019, 17:30
  • Ezhik

Комментарии (8)

RSS свернуть / развернуть
Вдогонку: видео, в котором наглядно видна эта самая рассинхронизация тактовых генераторов:
yadi.sk/i/gznX8LJt3xipEQ
0
Интересная статья спасибо. Тоже люблю с SDR поиграться. Но пока на что-то дорогое типа как у вас, жаба давит :). А какая конечная цель изысканий? Просто расшифровать сигнал или делать свой девайс?
0
Можно и подешевле взять — RTL-SDR, 1.5-2 тысячи рублей на АлиЭкспрессе, плюс видел в каких-то группах ВК, если не хочется ждать. С HackRF мне повезло — нашел у кого попросить :). Но так как когда-нибудь у меня его заберут, я и заказал себе RTL-SDR с кварцем 0.5РРМ (китайских ненастоящих, разумеется).

Конечная цель — освежить старые знания, освоить что-то новое. Все же образование у меня в этой области, и кое-какой опыт тоже есть.

Сделать девайс — тут надо не в одного человека делать. Все же там помимо радиочасти довольно много работы.
Да и на самом деле разбирать данные, пакеты, и прочее — это мне не так интересно, как решить вышеупомянутую задачу по синхронизации, ибо в моем представлении она здесь наиболее сложная и интересная.
0
Эм ртл-сдр, это ТВ свисток что-ли. Есть такой у меня, но там полоса АЦП то-ли 3 то-ли 6 МГц. Много чего не посмотришь, хотя может на NBLTE и хватит.
0
Это офигенная статья, но есть одно замечание.

Замена кварца — неправильный путь. У вас всё равно когда-нибудь оно разъедется, а на что вам SDR? На то, что бы железные проблемы решать софтово. 20ppm это смешно. У вас уже есть отлчиный детектор ошибки (а это всегда самое сложное) — ну так запихните его в closed loop carrier recovery с дробным ресемплером. Всё, любые ошибки кварцев будут компенсироваться.

Надо только почитать-посчитать что тут лучше подойдёт, PLL, Costas или M&M какой-нибудь. Но в любом случае это будет правильное, true-SDR решение.

Если заменить 20ppm на 0.2ppm у вас просто будет разъезжаться на целый семпл в 100 раз реже, но будет. И, к тому же, ДО того как разъедется на целый семпл будет очень ухудшен SNR, когда расхождение будет где-нибудь пол-семпла.
0
Большое спасибо за Ваш отклик!

Да, я думал о том, что разбежки не избежать в любом случае. Однако, все же хочется увидеть более равномерную картинку, а не ту, что получилась у меня. Кроме того, кварц все равно можно будет вытащить и вернуться к тому, с чего начинал.

Так же я думал о различных путях решения данной проблемы.
Сформулирую их и напишу, как будет побольше свободного времени.
0
Мне кажется, шага carrier recovery всё равно не миновать, какой кварц не ставь…

с интересом буду ждать продолжения!
0
Собственно, вот еще одна причина, по которой я хочу попробовать с более стабильным кварцем.
Иногда костыли в программе или железе помогают найти проблемы, например, когда поставленный костыль не приводит к ожидаемому улучшению результата.

Я попробовал смоделировать ситуацию, когда у нас разбегаются кварцы и есть еще и сдвиг по частоте.
И получил следующее:



«Биения» амплитуд оказались не такими сильными, как в реальном сигнале. Значит, либо я что-то еще упустил в обработке, либо некорректно смоделировал эти эффекты.
Есть над чем еще подумать.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.