Восстановление главного информационного блока 5G
В этом примере показано, как использовать 5G-библиотеку для синхронизации, демодуляции и декодирования сигнала gNodeB. В примере декодируется MIB и первый из блоков системной информации (SIB1).
Для декодирования MIB и SIB1 требуется комплексный приемник, способный демодулировать и декодировать большинство каналов и сигналов нисходящей линии связи.
Начнём с подключения библиотек, объявления вспомогательных функций и путей для решения данной задачи.
# Подключение библиотек
neededLibs = ["CSV"]
for lib in neededLibs
try
eval(Meta.parse("using $lib"))
catch ex
Pkg.add(lib)
eval(Meta.parse("using $lib"))
end
end
# Пути до папок с файлами
path_model = "$(@__DIR__)/";
# Подключение библиотек
using DataFrames, CSV, Plots
include(path_model*"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;
Ниже представлена модель реализованной системы. Её условно можно разделить на три части:
- генерация входного сигнала и наложения эфектов канала связи на сгенерированный сигнал,
- коррекция смещения частоты c последующим поиском SSS,
- поиск PBCH, декодирование BCH и детекция MIB.

Запустим модель и залогируем данные из неё.
run_model("MIB_5G", path_model)
Далее произведём считывание из CSV залогированных сигналов и более детально разберём систему связи и принципы, на основе которых она реализована. Мы не будем заострять внимание на генерации входного сигнала в данной демонстрации, а рассмотрим сам принимающий тракт.
Приемник выполняет поиск PSS и грубую оценку смещения частоты на основе сдвига частоты принятого сигнала при условии, что возможные смещения разнесены на половину поднесущей.
Далее коррелируется полученный сигнал со сдвигом по частоте с каждой из трех возможных последовательностей PSS (NID) и извлекается самый сильный пик корреляции.
Кроме того, пик указывает, какой из трех PSS (NID) был обнаружен в принятом сигнале, а также в какой момент были лучшие условия канала.
NID = CSV.read(path_model * "NID.csv", DataFrame);
print("Cамый сильный пик корреляции: " * string(NID[1,2]))
Оценка сдвига частоты ниже половины поднесущей расчитывается путем корреляции циклического префикса каждого символа OFDM в SSB с соответствующими полезными частями символов OFDM.
Фаза этой корреляции пропорциональна сдвигу частоты сигнала.
Frequency_offset = CSV.read(path_model * "Frequency_offset.csv", DataFrame);
print("Смещение частоты на первом кадре: " * string(Frequency_offset[1,2])* " Гц")
Waveform = Complex_CSV(path_model * "Waveform.csv");
plot(real(Waveform))
plot!(imag(Waveform))
Далее приемник извлекает элементы, связанные с SSS, из полученной сетки и коррелирует их с каждой возможной последовательностью SSS, сгенерированной локально.
Объединение индексов самых сильных последовательностей PSS и SSS дает идентичность ячейки физического уровня, которая необходима для обработки PBCH DM-RS и PBCH.
SSS_search = CSV.read(path_model * "SSS_search.csv", DataFrame);
print("SSS: " * string(SSS_search[1,2]))
MIB – это обязательная системная информация, которая транслируется gNB с установленной периодичностью. Во время процедуры первоначального выбора соты UE предполагает, что SSB передается gNB каждые 20 мс. UE получает MIB путем декодирования PBCH из блочного луча SS-PBCH.
MIB = str2num_CSV(path_model * "MIB.csv");
print("MIB: " * string(Int8.(MIB))) ;
Вывод
Мы рассмотрели особенности работы библиотеки 5G и возможности взаимодействия с функционалом данной библиотеки в среде Engee.