AnyMath 文档
Notebook

矩形前照灯的Beamscan和MVDR测向算法

此示例演示了使用BeamscanMVDR测向算法使用矩形相控阵天线确定信号到达的方位角和角方向

辅助功能

In [ ]:
# 从"simout"变量读取数据的函数
function DataFrame2Array(X)
    squeeze(A) = reshape(A, filter(!=(1), size(A))...)
    out = collect(X)
    out_data = zeros(eltype(out.value[1]),size(out.value[1],1),size(out.value[1],2),length(out.value))
    [out_data[:,:,i] = out.value[i] for i in 1:length(out.value)]

    return squeeze(out_data), out.time
end
function plot_map_doa(X,param,n_step::Int64 = 3;title="",x_lab="方位角,度",
    y_lab="座椅角度,度数",threshold = "auto")
    plotlyjs()
    PARULA_GRAD = cgrad(
        [
            "#352A87", "#0F5CDD", "#127DD8", 
            "#079CCF", "#15B1B4", "#59BD8C", 
            "#A5BE6B", "#E1B952", "#FCCE2E", 
            "#F9FB0E"
    ])
    heatmap(param.RangeAzimuths,param.RangeElevations,X[:,:,n_step],
        color=PARULA_GRAD, title=title,xlabel = x_lab,ylabel=y_lab) |> display;
    return 
end
# 构多普勒范围和频率变化动态可视化的功能
function calc_matrix_visual(out,param;title_name="") 
    gr()
    default(titlefontsize=12,top_margin=5Plots.px,guidefont=10,
        fontfamily = "Computer Modern",colorbar_titlefontsize=8,size=(600,400),
        margin = 2Plots.mm
    )
    PARULA_GRAD = cgrad(
        [
            "#352A87", "#0F5CDD", "#127DD8", 
            "#079CCF", "#15B1B4", "#59BD8C", 
            "#A5BE6B", "#E1B952", "#FCCE2E", 
            "#F9FB0E"
    ])

    x_grid = param.RangeAzimuths
    y_grid = param.RangeElevations
    
    heatmap(x_grid,y_grid,out[:,:,1],color=PARULA_GRAD,
        xlabel="方位角,度",ylabel="座椅角度,度数",title=title_name,
        colorbartitle="的振幅")

    @info "构建轴承估计值随时间变化的可视化。.." 
    anim1 = @animate for i in axes(out,3)
        mod(i,10)==0 && (@info "$(round(100*i/size(out,3))) %")
        heatmap!(x_grid,y_grid,out[:,:,i],color=PARULA_GRAD)
    end
    @info " ,可视化建设已顺利完成。.." 
    return anim1
end;
# 运行模型的函数
function run_model( name_model, path_to_folder ) 
    Path = path_to_folder * "/" * name_model * ".engee"
    if name_model in [m.name for m in engee.get_all_models()] # 检查将模型加载到内核的条件
        model = engee.open( name_model ) # 打开模型
        engee.run( model, verbose=true ); # 启动模型
        engee.close( name_model, force=true ); # 关闭模型
    else
        model = engee.load( Path, force=true ) # 上传模型
        engee.run( model, verbose=true ); # 启动模型
        engee.close( name_model, force=true ); # 关闭模型
    end
    return 
end;

1. 模型结构的描述

让我们仔细看看模型的结构图:

{orange}(信号生成)

该模块创建2个测试信号,每个信号在方位角和角平面上变化和移动。

*Signal:使用具有正态分布的伪随机序列实现信号。 在块中,您可以设置信号中幅度的标准偏差(RMS),数学期望和样本数。;
重塑:在2个维度中组合输入信号;
到达方向(信号方向):形成改变信号的方位角和到达角方向的规律。 输出生成一个维度为[2,L]的矩阵,其中L
是信号的个数。

接收路径

该子系统实现了对矩形前照灯的给定几何形状的传入信号的接收和预放大(在示例中**[10,5]**) 考虑到信号轴承方向的变化。

*矩形大灯(窄带Rx阵列):用于模拟接收根据方位角-角向矩阵进行光束调整的矩形大灯信号;
*放大器(接收器前置放大器):模拟给定增益和噪声因子(噪声温度)的信号通过LNA ;

{orange}(轴承算法)

该模块直接解决了使用MVDR频谱Beamscan频谱算法通过方位角和仰角确定到目标的方向的问题。

*MVDR频谱:实现响应方差最小化算法,用于计算信号承载;
*Beamscan Spectrum:实现扫描光束的光谱分析算法来计算信号的方位。

下面给出系统测向模型的一般框图。:

image.png

2. 模型操作场景和输入参数的初始化

要初始化模型的输入参数,请连接配置文件"Param2DBeamscanMVDRDOA。jl"。

In [ ]:
include("$(@__DIR__)/Param2DBeamscanMVDRDOA.jl");
Параметры инициализированы успешно!

在这个例子中,使用了2个不同运动场景的信号源-轴承变化:

source-1*正在从[30° ** 阿兹。,10°的地方。][50° ** 阿兹。,-5°的地方。]**
源-2(具有较低的功率3分贝)是从移动*[50° ** 阿兹。,-5°的地方。][30° ** 阿兹。,10°的地方。]**

扫描范围在方位角设置为*-10:60*,在仰角设置为*-20:20*。

如果您需要更改参数值,请打开此文件,编辑必要的参数并保存更改。 如果参数更新,将显示以下消息:"参数已初始化成功!". 否则,请检查对配置文件所做更改的正确性。

3. 启动模型

让我们使用先前初始化的run_model函数运行模型的模拟。:

In [ ]:
run_model("2DBeamscanMVDRDOA", @__DIR__);
Building...
Progress 0%
Progress 7%
Progress 12%
Progress 17%
Progress 25%
Progress 32%
Progress 40%
Progress 45%
Progress 52%
Progress 57%
Progress 65%
Progress 70%
Progress 75%
Progress 82%
Progress 90%
Progress 95%
Progress 100%
Progress 100%

对话框信息一读到**"Progress100%",**就表示模型工作成功。

4. 读取输出数据

编程输出的仿真结果写入***"simout"变量。 让我们使用DF2Arr*函数读取测向算法输出端的数据。:

In [ ]:
sim = collect(simout) # 提取质押变量的向量
Ang1,_ = DataFrame2Array(sim[1]) # MVDR算法的结果输出方向
Ang2,_ = DataFrame2Array(sim[4])  # Beamscan算法输出中的结果方向
Y1,_ = DataFrame2Array(sim[2]) # MVDR算法输出端的响应映射
Y2,_ = DataFrame2Array(sim[3]);  # Beamscan算法输出的响应图

接下来,使用plot_map_doa函数,我们可视化给定建模步骤的算法结果。:

In [ ]:
n_step =3 # 模拟步数
plot_map_doa(Y1,param2DBeamscanMVDRDOA,n_step;
    title="在$(n_step)建模步骤处MVDR频谱操作的结果"
)
In [ ]:
n_step = 3 # 模拟步数
plot_map_doa(Y2,param2DBeamscanMVDRDOA,n_step;
    title="在$(n_step)建模步骤中BeamScan频谱操作的结果"
)

5. 模拟结果动画

为了创建算法的动画,我们使用"***cacl_matrix_visual"***函数,该函数生成一组以视频格式保存的带有扩展名的图像。gif:

In [ ]:
# MVDR光谱Alglorithm
anim1 = calc_matrix_visual(Y1,param2DBeamscanMVDRDOA;title_name="MVDR频谱操作的结果")
gif(anim1, "Visual_MVDR.gif", fps = 10);
[ Info: Построение визуализации изменения оценок пеленга во времени...
[ Info: 24.0 %
[ Info: 49.0 %
[ Info: 73.0 %
[ Info: 98.0 %
[ Info:  ✅ Построение визуализации успешно завершено...
[ Info: Saved animation to /user/models/block/Radar_models/2DBeamscanMVDRDOA/Visual_MVDR.gif

因此,具有gif扩展名的文件将被添加到当前目录的文件浏览器中。

mvdr_gif.png

MVDR的动画结果如下所示:

Visual_MVDR.gif

同样,我们为BeamScan频谱算法的结果计算动态动画。:

In [ ]:
# [医]光束光谱藻
anim2 = calc_matrix_visual(Y2,param2DBeamscanMVDRDOA;title_name="BeamScan光谱的结果")
gif(anim2, "Visual_BeamScan.gif", fps = 10);
[ Info: Построение визуализации изменения оценок пеленга во времени...
[ Info: 24.0 %
[ Info: 49.0 %
[ Info: 73.0 %
[ Info: 98.0 %
[ Info:  ✅ Построение визуализации успешно завершено...
[ Info: Saved animation to /user/models/block/Radar_models/2DBeamscanMVDRDOA/Visual_BeamScan.gif
Visual_BeamScan.gif

分析得到的图,可以注意到MVDR频谱算法相对于BeamScan频谱具有更高的分辨率:当它们之间的距离小于波束宽度时接近目标时,它们的到达方向不能使用波束扫描 与此同时,MVDR频谱**算法在甚至轻微偏离目标方向的情况下大大削弱了信号,因此,观察到角度图上目标的"闪烁"。

结论

因此,在示例中,考虑了用角坐标处理单元对接收路径的建模,并进行了MVDR频谱BeamScan频谱测向算法的比较分析。

仿真结果表明了这些算法的优缺点:

MVDR频谱-当信号的到达方向以良好的精度已知时,建议使用,因为它具有高分辨率;*
****Beamscan Spectrum-***适用于对目标检测要求增加的情况,因为它具有更好的抗噪性,分辨率较差。