Примеры и проектыВопросы и ответыАкадемия Engee
Engee Community
/
Примеры и проекты
/
4-FSK модулятор и демодулятор

4-FSK модулятор и демодулятор

Автор
avatar-yurevyurev
Notebook

4-FSK модулятор и демодулятор¶

В этом примере мы рассмотрим работу с 4-FSK (Frequency Shift Keying) в Engee. Частотная модуляция – это вид модуляции, при котором информация кодируется изменением частоты сигнала. 4-FSK, четырехуровневая частотная манипуляция, – это тип модуляции, применяемый в DMR (Digital Mobile Radio), также он оптимален для использования в системах PMR (Professional Mobile Radio).

Каждая пара бит информации определяет частотный сдвиг относительно несущей частоты.

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

Битовая комбинация Соответствующий символ (4-FSK)
11 3
10 1
00 -3
01 -1

Мы построим на базовых элементах модулятор и демодулятор 4-FSK.

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)

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

image_2.png

Далее запустим модель и проанализируем результаты моделирования.

In [ ]:
run_model("4fsk")
Building...
Progress 0%
Progress 4%
Progress 9%
Progress 14%
Progress 19%
Progress 24%
Progress 29%
Progress 34%
Progress 39%
Progress 44%
Progress 49%
Progress 54%
Progress 59%
Progress 64%
Progress 69%
Progress 74%
Progress 79%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "4-FSK demodulator.Out1" => WorkspaceArray{Vector{Int64}}("4fsk/4-FSK demodulator.Out1")
,
    "Buffer.1" => WorkspaceArray{Vector{Float64}}("4fsk/Buffer.1")
,
    "Add.1" => WorkspaceArray{Float64}("4fsk/Add.1")
,
    "SumError.ErrorCnt" => WorkspaceArray{Float64}("4fsk/SumError.ErrorCnt")

)

Сравним входную группу битов с выходными битами.

In [ ]:
In_bit = collect(simout["4fsk/4-FSK demodulator.Out1"]);
Out_bit = collect(simout["4fsk/Buffer.1"]);
In_and_Out_bit = [In_bit.value Out_bit.value]
Out[0]:
5001×2 Matrix{Vector{Float64}}:
 [0.0, 0.0]  [0.0, 0.0]
 [1.0, 1.0]  [1.0, 1.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 0.0]  [1.0, 0.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 1.0]  [1.0, 1.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 0.0]  [1.0, 0.0]
 [1.0, 0.0]  [1.0, 0.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 1.0]  [1.0, 1.0]
 [1.0, 0.0]  [1.0, 0.0]
 [1.0, 1.0]  [1.0, 1.0]
 ⋮           
 [0.0, 0.0]  [0.0, 0.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 0.0]  [1.0, 0.0]
 [0.0, 1.0]  [0.0, 1.0]
 [1.0, 1.0]  [1.0, 1.0]
 [0.0, 0.0]  [0.0, 0.0]
 [1.0, 0.0]  [1.0, 0.0]
 [1.0, 1.0]  [1.0, 1.0]
 [1.0, 0.0]  [1.0, 0.0]
 [1.0, 0.0]  [1.0, 0.0]
 [1.0, 1.0]  [1.0, 1.0]
 [0.0, 0.0]  [0.0, 0.0]

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

In [ ]:
ErrorCnt = collect(simout["4fsk/SumError.ErrorCnt"]);
ErrorCnt = ErrorCnt.value;
print("Кол-во ошибок за всё время моделирования: $(ErrorCnt[end])")
Кол-во ошибок за всё время моделирования: 0.0

Вывод¶

Результаты моделирования таковы: релизованные нами модулятор и демодулятор работают корректно, без ощибок. Это значит, что такую реализацию можно применить для протоколов связи, например, DMR.

Группа видимости
ПубличноПросматривать контент могут все пользователи сообщества

Тип

Модель динамической системы

Краткое описание

В данном примере реализован 4-FSK модулятор и демодулятор на основе простейших логических блоках.

Связанные материалы

Пусто

Теги

Пусто

Категории

Моделирование в Engee
Отраслевые примененияРадиосвязьСвязь

Языки

    Julia

Форматы

    engee
    ngscript

Уровень

    Средний

Статус

Опубликовано

Обновлено

Источник

Engee