Системная модель физического уровня протокола DMR
Современные системы цифровой радиосвязи требуют высокой надежности и эффективности передачи данных, особенно если существуют риски искажений и рассинхронизации данных. Одним из ключевых протоколов, используемых в профессиональной мобильной радиосвязи, является DMR (Digital Mobile Radio), который обеспечивает цифровую передачу голоса и данных с использованием эффективных методов модуляции и кодирования.
В данном проекте рассматривается системная модель протокола DMR, включающая в себя полную цепочку обработки сигнала, — от генерации пакетов до демодуляции и синхронизации на приемной стороне. Моделирование каждого этапа передачи сигнала позволяет проанализировать устойчивость системы к различным видам помех и искажений.
В протоколе DMR, как и во многих других телекоммуникационных стандартах, используется многоуровневая архитектура, аналогичная модели OSI (Open Systems Interconnection). Основные уровни DMR можно разделить следующим образом.
-
Физический уровень (Physical Layer, PHY). Отвечает за передачу и приём битовых потоков по радиоканалу и включает в себя модуляции (4-FSK, FM), фильтрацию, синхронизацию и коррекцию искажений в канале (также к физическому уровню относится кодирование, но его в данном примере мы не рассматриваем).
-
Канальный уровень (Data Link Layer, DLL). Обеспечивает надёжную передачу данных между узлами, управляет доступом к среде. Включает в себя формирование пакетов DMR, таких, как голосовые, сигнальные данные. В данном примере продемонстрированы пакеты данных. Также он может включать в себя контроль ошибок (CRC, FEC), управление логическими каналами (TDMA, два слота), адресация (идентификация абонентов и групп).
-
Сетевой уровень (Network Layer). Обеспечивает маршрутизацию и межсетевое взаимодействие, если DMR интегрирован в более крупную систему, включащую сеть Интернет.
-
В некоторых реализациях встречаются дополнительные уровни: транспортный уровень (если DMR работает поверх IP) или, например, прикладной уровень (Application Layer) – поддержка сервисов (голос, текстовые сообщения, телеметрия).
В стандарте DMR основное внимание уделяется физическому и канальному уровням, поскольку именно они определяют работу радиоканала. Сетевые функции чаще реализуются в инфраструктурных решениях (например, в ретрансляторах и системах управления).
Подключение вспомогательной функции запуска модели
function run_model( name_model)
Path = (@__DIR__) * "/" * 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
sleep(5)
return model_output
end
Запуск модели и анализ результатов
Реализованная нами модель включает в себя следующие ключевые блоки.
-
Генерация пакетов – формирование сигнальной последовательности и пустых блоков, соответствующих типам пакетов DMR.
-
4-FSK-модуляция – цифровая модуляция, применяемая в DMR для эффективного использования полосы частот.
-
Фильтр приподнятого косинуса – используется для ограничения спектра сигнала и минимизации межсимвольной интерференции.
-
FM-модулятор – преобразование цифрового сигнала в аналоговую форму для передачи по радиоканалу.
-
Канал связи с имитацией рассинхронизации – моделирование временного рассогласования между передатчиком и приёмником.
-
Детекция сигнальной последовательности и кадровая синхронизация – алгоритмы восстановления временного положения пакетов на приёмной стороне.
Для тестирования корректной передачи сообщений на русском и английском языках воспользуемся панграммами на этих двух языках.
Панграмма (с греческого — «все буквы»), или разнобуквица, — короткий текст, использующий все или почти все буквы алфавита, по возможности не повторяя их.
Зададим такое сообщение, а также в модели представим его в байтовом виде для удобства взаимодействия с сигналом и дополним сообщения нулями до количества элементов в векторе, кратного 27 (216 бит данных в одном пакете DMR). Часть кода из модели представлена ниже.
En = "Red fox jumps over the lazy dog"
Ru = "Cъешь же ещё этих мягких французских булок, да выпей чаю"
inp_sms = "$En. $Ru."
println("Входное сообщение:")
println(inp_sms)
println()
bytes = Int.(Vector{UInt8}(inp_sms))
remainder = length(bytes) % 27
bytes = vcat(bytes, remainder == 0 ? Int[] : zeros(Int, 27 - remainder))
println("Байтовое представление:")
println(bytes)
println()
println("Количество кадров для сообщения: $(length(bytes)/27)")
На скриншоте ниже представлена реализованная модель целиком.

Запустим нашу модель при SNR = 25 для того, чтобы увидеть результат с наименьшим количеством ошибок. Если вас интересует шумоустойчивость системы, вы можете самостоятельно поэкспериментировать с данным параметром.
snr = 25
run_model("DMR") # Запуск модели.
Проведём анализ результатов. Для начала отобразим байтовое представление входного и выходного текстового сообщения, а также количество ошибок по байтам.
println("SNR: $snr")
error_bytes = reduce(vcat,collect(simout["DMR/err_symbol"]).value)
println("Кол-во ошибок: $(sum(error_bytes.>0))")
Delay = reduce(vcat,collect(simout["DMR/Frame_Synchronization.Delay"]).value)
println("Битовая задержка: $(Int.(Delay[end]))")
Input = reduce(vcat,collect(simout["DMR/Inp"]).value)
plot(Input, seriestype = :steppre, label = "Input")
Output = reduce(vcat,collect(simout["DMR/Out"]).value)
plot!(Output, seriestype = :steppre, label = "Output")
Как мы видим, при SNR = 25 ошибок не наблюдается, а, следовательно, мы безошибочно можем декодировать текстовое сообщение.
SMS_sim = reduce(vcat, collect(SMS_out).value)
SMS = filter(x -> x != 0x00000000, SMS_sim)
SMS = String(UInt8.(SMS))
println("Восстановленная строка: ", SMS) # Лишние нули игнорируются
Вывод
В данном примере разобрана системная модель DMR, затрагивающая только физический уровень протокола. В дальнейшем, если тема будет интересна Сообществу, мы рассмотрим и другие уровни данного протокола и представим реализацию различных его составляющих.