Engee 文档
Notebook

4-FSK 调制器和解调器

在本例中,我们将学习如何在Engee中使用 4-FSK(频移键控)。频率调制是一种通过改变信号频率来编码信息的调制方式。4-FSK(四电平移频键控)是 DMR(数字移动无线电)中使用的调制类型,也是 PMR(专业移动无线电)系统中的最佳调制类型。

每一对比特信息 定义了相对于载波频率的频移。

这种调制方式的包络线是恒定的,在消耗和发射机电路设计方面具有显著优势: 传输路径没有严格的线性要求。

image.png

我们将在基本元件上建立一个 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.png

接下来,我们运行模型并分析模拟结果。

In [ ]:
run_model("4fsk")
Building...
Progress 100%
Out[0]:
Dict{String, DataFrame} with 4 entries:
  "4-FSK demodulator.Out1" => 51×2 DataFrame…
  "Buffer.1"               => 51×2 DataFrame…
  "SumError.ErrorCnt"      => 101×2 DataFrame…
  "Add.1"                  => 101×2 DataFrame

让我们比较一下输入比特组和输出比特组。

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]:
51×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]
 [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, 1.0]  [0.0, 1.0]
 [0.0, 0.0]  [0.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]
 [0.0, 0.0]  [0.0, 0.0]

从比特对的显式比较中我们可以看到,所有序列都能被正确识别。现在我们来看看我们模型中的数字错误率。

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

结论

仿真结果如下:我们发布的调制器和解调器工作正常,没有错误。这意味着这种实现方式可以应用于 DMR 等通信协议。