Engee 文档
Notebook

用于估计单个目标范围的车载雷达

该示例考虑了基于线性频率调制(lfm)信号的汽车雷达系统模型的设计,以确定物体的范围。

使用的函数

In [ ]:
Pkg.add(["LinearAlgebra", "DSP", "FileIO" ,"Images" , "ImageShow"])
In [ ]:
using DSP,FFTW,LinearAlgebra

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;

function DataFrame2Array(X)
    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 out_data, out.time
end

function calc_spectrogram(x::Array,fs::Real,title::String;
    num_pulses::Int64 = 4,
    window_length::Int64 = 64,
    nfft::Int64=512,
    lap::Int64  = 60,
    thesh::Real = -Inf)

    gr()

    spec_out = DSP.spectrogram(x[:,:,1:num_pulses][:],window_length,lap;window=kaiser(window_length,3.95),nfft=nfft,fs=fs)

    power = DSP.pow2db.(spec_out.power)
    power .= map(x -> x < thesh ? thesh : x,power)

    power_new = zeros(size(power))

    power_new[1:round(Int64,size(power,1)/2),:] .= power[round(Int64,size(power,1)/2)+1:end,:]
    power_new[round(Int64,size(power,1)/2)+1:end,:] .= power[1:round(Int64,size(power,1)/2),:]

    fig = heatmap(fftshift(spec_out.freq).*1e-6,spec_out.time .*1e6, permutedims(power_new),color= :jet,
        gridalpha=0.5,margin=5Plots.mm,size=(900,400))
    xlabel!("Частота, МГц")
    ylabel!("Время, мкс")
    title!(title)

    return fig
end;

1. 模型结构的描述

1.1系统模型的一般方案

系统模型的一般框图如下所示:

image.png

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

*LFM信号发生器(FMCW波形):连续的LFM信号用作探针信号;
*发射器:信号在发射器中放大并形成辐射图案;
*传播介质(通道):信号传播到目标并返回接收器,而衰减则取决于到目标的距离;
*Object(Car):表示移动的汽车;
*接收器前置放大器:从机器反射的信号进入接收天线阵列并被放大,同时考虑到接收器自身的热噪声;
*数字信号处理:评估车辆的范围。

该模型的运行方案如下图所示。

image_2.png

1.2数字信号处理阶段的描述

在雷达接收器中,反射信号经过几个处理阶段,然后获得到目标物体(汽车)的范围估计值。 信号处理Signal Processing)的过程包括两个阶段:
第1阶段:范围信号处理。 接收信号与复共轭输入信号相乘,由于目标在反射和目标区域之间的移动而产生差频(或拍频)。 然后是64个脉冲的相干累积,这些脉冲在子系统相干积分中组合,这增加了信噪比。 接下来,将数据传送到范围响应*块,其执行快速傅立叶变换(FFT)以用于随后的范围估计。
*阶段2:目标检测和范围估计由5个并行数据处理通道组成,用于目标目标检测和范围估计。

image.png

在阶段2中,每个通道包括3个处理步骤:

目标检测:雷达数据首先使用滚动平均窗口算法传输到具有给定假警报概率的一维探测器*(CFAR)**。 该块检测反射信号的存在。

聚类:然后在*"DBSCAN Clusterer"块中执行聚类过程,其中使用CFAR**块中获得的数据将检测像元分组为范围组。

*范围估计:在定义检测对象和聚类的最后阶段,最后一步是范围估计器块。 在此阶段,基于雷达数据估计目标探测范围。

image_2.png

1.3渠道模式和目标

"通道和目标"模型的子系统模拟信号的传播及其从目标车辆的反射。
通道-模拟雷达载具和目标载具之间信号的传播。 该通道可以配置为自由空间中的直接传输通道(型号
自由空间通道
)或作为两束通道,其中信号沿着直接和反射路径从地面传输到接收器(型号
双射线通道*)。 默认情况下,选择可用空间中的通道。

image_2.png

*目标-反映入射信号并模拟目标车辆的轨迹。 下图所示的子系统由两部分组成:模拟反射信号的目标模型(block-Target)和模拟目标车辆动力学的空间对象模型(block-Platform)。

image_4.png

2.输入参数的初始化

在模型场景中,配备雷达的车辆以100km/h(27.8m/s)的速度从参考点开始移动,目标物体以96km/h(26.7m/s)的速度在其前方43米处开始移动。 在传播信道中使用雷达和目标位置和速度来计算延迟、多普勒效应和信号衰减。

要初始化模型的输入参数,我们将连接文件"FMCWParam。jl"。 如果您需要更改参数值,请打开此文件并编辑必要的参数。

In [ ]:
include("$(@__DIR__)/FMCWParam.jl") # подключение файла с входными параметрами
paramRadarFMCW = FMCWParam(); # запись входных параметров в структуру
T = paramRadarFMCW.T; # шаг дискретизации модели
simT = 640*T; # время симуляции модели

3. 启动模型

让我们开始使用run_model函数计算模型的模拟:

In [ ]:
run_model("FMCW_Radar_Range_Estimation",@__DIR__); # Запустить модель
Building...
Progress 0%
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 41%
Progress 46%
Progress 57%
Progress 63%
Progress 69%
Progress 83%
Progress 94%
Progress 100%

4. 读取输出数据

我们将从工作区中记录的变量中提取模拟结果到一个数组中,以便进一步可视化。:

In [ ]:
input_signal, _ = DataFrame2Array(in_sig) # входной ЛЧМ-сигнал
dec_signal, _ = DataFrame2Array(dec_sig) # сигнал после цифровой обработки
range_estimate, slow_time = DataFrame2Array(rng_est) # оценки дальности
RPos, fast_time = DataFrame2Array(RPos) # положение радара
CPos,_ = DataFrame2Array(CPos); # положение объекта

5. 雷达操作的可视化

5.1输入信号频谱图

首先,让我们考虑发射的LFM信号的频谱图。

In [ ]:
calc_spectrogram(
    input_signal, # ЛЧМ-сигнал
    paramRadarFMCW.Fs, # частота дискретизации
    "Cпектрограмма ЛЧМ-сигнала";
    num_pulses=4 # количество импульсов отображения
)
Out[0]:

上面显示的频谱图显示频率偏差为150MHz,周期为每7微秒,对应于大约1米的分辨率。

5.2数字处理后的信号频谱图

接下来,考虑数字处理后信号的频谱图:

In [ ]:
calc_spectrogram(
    dec_signal[:,:,2:end], # сигнал после обработки (отображается со 2 импульса)
    paramRadarFMCW.Fs/paramRadarFMCW.NumSweeps, # частота дискретизации
    "Cпектрограмма сигнала после обработки";
    num_pulses=4, # количество импульсов 
    thesh=-300 # порог, дБ
)
Out[0]:

图表显示物体产生的拍频大约为100khz. 注意,在处理之后,信号仅具有一个频率分量。 根据拍频计算最终范围估计值,精度为1米。

5.3估计到物体的距离

最后,让我们来看看雷达操作的结果。:

In [ ]:
gr()
true_range = [norm(CPos[:,1,i].-RPos[:,1,i]) for i in 1:size(CPos,3)]
p1 = plot(Vector(slow_time)*1e3,range_estimate[:],label="оценка расстояния",margin=5Plots.mm,
    titlefont=font(10,"Computer Modern"),guidefont = font(8,"Computer Modern"),legendfont = font(8,"Computer Modern"))
plot!(Vector(fast_time)*1e3,true_range,label="истинное расстояние")
ylabel!("Расстояние, м")
title!("Зависимость оценки расстояния до цели от времени")

p2 = plot(Vector(slow_time)*1e3,abs.(range_estimate[:].-true_range[1:paramRadarFMCW.NumSweeps:end]),lab="",
titlefont=font(10,"Computer Modern"),guidefont = font(8,"Computer Modern"),legendfont = font(8,"Computer Modern"))
xlabel!("Время, мс")
ylabel!("Расстояние, м")
title!("Отклонение оценки")

plot(p1,p2,layout=(2,1),size=(900,460))
Out[0]:

因此,估计从雷达到目标物体的距离的精度对应于1m的规定精度。

5.4双波束信号传播效果分析

上一段的结果是用自由空间中直接传播信道的模型实现的。 实际上,发射器和接收器之间的多条路径经常用于车辆之间的传输。 因此,来自不同路径的信号可以同相或异相组合。

如果我们建立一个双射线传播模型**(Two-Ray)**,这是最简单的多径信道,我们可以看到主拍频不能在噪声谱的背景下区分(见下面的频谱图),因为直接信号与反射

image.png

填满

在该示例中,考虑了使用连续LFM信号作为探测信号的原子雷达基本模型的建模。 作为模型操作的结果,发现了从雷达到目标物体(汽车)的距离的估计,雷达分辨率精度为1米。

还研究了信号传播模型对直接传播信道和双波束传播信道的影响。 结果表明,双波束传播模型可以通过补偿拍频分量对雷达操作产生负面影响,从而使范围估计变得不可能。

示例中使用的块