Системная модель DMR

Автор
avatar-yurevyurev
Notebook

Системная модель физического уровня протокола DMR

Современные системы цифровой радиосвязи требуют высокой надежности и эффективности передачи данных, особенно если существуют риски искажений и рассинхронизации данных. Одним из ключевых протоколов, используемых в профессиональной мобильной радиосвязи, является DMR (Digital Mobile Radio), который обеспечивает цифровую передачу голоса и данных с использованием эффективных методов модуляции и кодирования.

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

В протоколе DMR, как и во многих других телекоммуникационных стандартах, используется многоуровневая архитектура, аналогичная модели OSI (Open Systems Interconnection). Основные уровни DMR можно разделить следующим образом.

  1. Физический уровень (Physical Layer, PHY). Отвечает за передачу и приём битовых потоков по радиоканалу и включает в себя модуляции (4-FSK, FM), фильтрацию, синхронизацию и коррекцию искажений в канале (также к физическому уровню относится кодирование, но его в данном примере мы не рассматриваем).

  2. Канальный уровень (Data Link Layer, DLL). Обеспечивает надёжную передачу данных между узлами, управляет доступом к среде. Включает в себя формирование пакетов DMR, таких, как голосовые, сигнальные данные. В данном примере продемонстрированы пакеты данных. Также он может включать в себя контроль ошибок (CRC, FEC), управление логическими каналами (TDMA, два слота), адресация (идентификация абонентов и групп).

  3. Сетевой уровень (Network Layer). Обеспечивает маршрутизацию и межсетевое взаимодействие, если DMR интегрирован в более крупную систему, включащую сеть Интернет.

  4. В некоторых реализациях встречаются дополнительные уровни: транспортный уровень (если DMR работает поверх IP) или, например, прикладной уровень (Application Layer) – поддержка сервисов (голос, текстовые сообщения, телеметрия).

В стандарте DMR основное внимание уделяется физическому и канальному уровням, поскольку именно они определяют работу радиоканала. Сетевые функции чаще реализуются в инфраструктурных решениях (например, в ретрансляторах и системах управления).

Подключение вспомогательной функции запуска модели

In [ ]:
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
Out[0]:
run_model (generic function with 1 method)

Запуск модели и анализ результатов

Реализованная нами модель включает в себя следующие ключевые блоки.

  1. Генерация пакетов – формирование сигнальной последовательности и пустых блоков, соответствующих типам пакетов DMR.

  2. 4-FSK-модуляция – цифровая модуляция, применяемая в DMR для эффективного использования полосы частот.

  3. Фильтр приподнятого косинуса – используется для ограничения спектра сигнала и минимизации межсимвольной интерференции.

  4. FM-модулятор – преобразование цифрового сигнала в аналоговую форму для передачи по радиоканалу.

  5. Канал связи с имитацией рассинхронизации – моделирование временного рассогласования между передатчиком и приёмником. image_3.png

  6. Детекция сигнальной последовательности и кадровая синхронизация – алгоритмы восстановления временного положения пакетов на приёмной стороне.
    image_5.png

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

Панграмма (с греческого — «все буквы»), или разнобуквица, — короткий текст, использующий все или почти все буквы алфавита, по возможности не повторяя их.

Зададим такое сообщение, а также в модели представим его в байтовом виде для удобства взаимодействия с сигналом и дополним сообщения нулями до количества элементов в векторе, кратного 27 (216 бит данных в одном пакете DMR). Часть кода из модели представлена ниже.

In [ ]:
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)")
Входное сообщение:
Red fox jumps over the lazy dog. Cъешь же ещё этих мягких французских булок, да выпей чаю.

Байтовое представление:
[82, 101, 100, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103, 46, 32, 67, 209, 138, 208, 181, 209, 136, 209, 140, 32, 208, 182, 208, 181, 32, 208, 181, 209, 137, 209, 145, 32, 209, 141, 209, 130, 208, 184, 209, 133, 32, 208, 188, 209, 143, 208, 179, 208, 186, 208, 184, 209, 133, 32, 209, 132, 209, 128, 208, 176, 208, 189, 209, 134, 209, 131, 208, 183, 209, 129, 208, 186, 208, 184, 209, 133, 32, 208, 177, 209, 131, 208, 187, 208, 190, 208, 186, 44, 32, 208, 180, 208, 176, 32, 208, 178, 209, 139, 208, 191, 208, 181, 208, 185, 32, 209, 135, 208, 176, 209, 142, 46]

Количество кадров для сообщения: 5.0

На скриншоте ниже представлена реализованная модель целиком.

image.png

Запустим нашу модель при SNR = 25 для того, чтобы увидеть результат с наименьшим количеством ошибок. Если вас интересует шумоустойчивость системы, вы можете самостоятельно поэкспериментировать с данным параметром.

In [ ]:
snr = 25
run_model("DMR") # Запуск модели.
Out[0]:
SimulationResult(
    "err_symbol" => WorkspaceArray{Vector{Int64}}("DMR/err_symbol")
,
    "Frame_Synchronization.Delay" => WorkspaceArray{Float64}("DMR/Frame_Synchronization.Delay")
,
    "Inp" => WorkspaceArray{Vector{Int64}}("DMR/Inp")
,
    "Out" => WorkspaceArray{Vector{UInt32}}("DMR/Out")

)

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

In [ ]:
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
Кол-во ошибок: 0
Битовая задержка: 20
Out[0]:

Как мы видим, при SNR = 25 ошибок не наблюдается, а, следовательно, мы безошибочно можем декодировать текстовое сообщение.

In [ ]:
SMS_sim = reduce(vcat, collect(SMS_out).value)
SMS = filter(x -> x != 0x00000000, SMS_sim)
SMS = String(UInt8.(SMS))
println("Восстановленная строка: ", SMS)  # Лишние нули игнорируются
Восстановленная строка: Red fox jumps over the lazy dog. Cъешь же ещё этих мягких французских булок, да выпей чаю.

Вывод

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