Engee 文档
Notebook

4-FSK调制器和解调器

在这个例子中,我们将研究在Engee中使用4-FSK(频移键控)。 频率调制是一种通过改变信号的频率对信息进行编码的调制。 4-FSK,四级频率操纵,是DMR(数字移动无线电)中使用的一种调制方式,也是PMR(专业移动无线电)系统中使用的最佳方式。

每对信息位
定义相对于载波频率的频移。

这种类型的调制中的包络是恒定的,这在发送器电路的消耗和构造方面提供了显着的优点:
没有严格的要求来保证传输路径的线性度。 基于下表执行比特编码。

/位组合/对应符号(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。