Документация Engee
Notebook

Восстановление главного информационного блока 5G

Открыть пример в Engee

В этом примере показано, как использовать 5G-библиотеку для синхронизации, демодуляции и декодирования сигнала gNodeB. В примере декодируется MIB и первый из блоков системной информации (SIB1).

Для декодирования MIB и SIB1 требуется комплексный приемник, способный демодулировать и декодировать большинство каналов и сигналов нисходящей линии связи.

Начнём с подключения библиотек, объявления вспомогательных функций и путей для решения данной задачи.

In [ ]:
# Подключение библиотек
using DataFrames, CSV, Plots
include("Fun_CSV.jl");

# Подключение вспомогательной функции запуска модели
function run_model( name_model, path_to_folder )
    
    Path = path_to_folder * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end

# Пути до папок с файлами
path_csv = "/user/5G/";
path_model = "$(@__DIR__)";

Ниже представлена модель реализованной системы. Её условно можно разделить на три части:

  1. генерация входного сигнала и наложения эфектов канала связи на сгенерированный сигнал,
  2. коррекция смещения частоты c последующим поиском SSS,
  3. поиск PBCH, декодирование BCH и детекция MIB.

image_2.png

Запустим модель и залогируем данные из неё.

In [ ]:
run_model("MIB_5G", path_model)
Building...
Progress 100%
Out[0]:
Dict{String, DataFrame}()

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

Приемник выполняет поиск PSS и грубую оценку смещения частоты на основе сдвига частоты принятого сигнала при условии, что возможные смещения разнесены на половину поднесущей.

Далее коррелируется полученный сигнал со сдвигом по частоте с каждой из трех возможных последовательностей PSS (NID) и извлекается самый сильный пик корреляции.

Кроме того, пик указывает, какой из трех PSS (NID) был обнаружен в принятом сигнале, а также в какой момент были лучшие условия канала.

In [ ]:
NID = CSV.read(path_csv * "NID.csv", DataFrame);
print("Cамый сильный пик корреляции: " * string(NID[1,2]))
Cамый сильный пик корреляции: 0.0

Оценка сдвига частоты ниже половины поднесущей расчитывается путем корреляции циклического префикса каждого символа OFDM в SSB с соответствующими полезными частями символов OFDM.

Фаза этой корреляции пропорциональна сдвигу частоты сигнала.

In [ ]:
Frequency_offset = CSV.read(path_csv * "Frequency_offset.csv", DataFrame);
print("Смещение частоты на первом кадре: " * string(Frequency_offset[1,2])* " Гц") 
Waveform = Complex_CSV(path_csv * "Waveform.csv");
plot(real(Waveform))
plot!(imag(Waveform))
Смещение частоты на первом кадре: 48.8418354250601 Гц
Out[0]:

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

Объединение индексов самых сильных последовательностей PSS и SSS дает идентичность ячейки физического уровня, которая необходима для обработки PBCH DM-RS и PBCH.

In [ ]:
SSS_search = CSV.read(path_csv * "SSS_search.csv", DataFrame);
print("SSS: " * string(SSS_search[1,2]))
SSS: 102

MIB – это обязательная системная информация, которая транслируется gNB с установленной периодичностью. Во время процедуры первоначального выбора соты UE предполагает, что SSB передается gNB каждые 20 мс. UE получает MIB путем декодирования PBCH из блочного луча SS-PBCH.

In [ ]:
MIB = str2num_CSV(path_csv * "MIB.csv");
In [ ]:
print("MIB: " * string(Int8.(MIB))) ;
MIB: Int8[0, 30, 0, 3, 0, 4, 0, 0]

Вывод

Мы рассмотрели особенности работы библиотеки 5G и возможности взаимодействия с функционалом данной библиотеки в среде Engee.

Блоки, использованные в примере