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

让我们来详细了解一下模型的结构:

** FMCW 波形*:使用连续调频信号作为探测信号 (SS);

  • 发射器:发射器放大信号并产生定向模式 (DN); ** 通道:信号传播到目标并返回接收器,根据与目标的距离进行衰减; 目标(汽车):代表一辆行驶中的汽车;
  • 接收器前置放大器:将汽车反射的信号送入接收天线阵列并放大,同时考虑接收器自身的热噪声; ** 信号处理:估计汽车的射程。

模型原理图如下图所示。

image_2.png

1.2 数字信号处理步骤说明

在雷达接收器中,反射信号要经过个处理步骤,然后才能获得目标车辆的距离估计值。信号处理过程包括两个阶段: **1 阶段:测距处理。接收到的信号与复共轭输入信号相乘,从而在反射信号和测深仪之间产生一个因目标运动而产生的差频(或跳频)。然后,64 个脉冲在相干积分子系统中相干累积,从而提高信噪比。接下来,数据被传送到测距响应单元,该单元执行快速傅立叶变换(FFT),以进行后续测距估计。

  • 第二阶段:目标检测和距离估计**由 5 个并行处理通道组成,用于检测和估计目标物体的距离。

image.png

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

** 目标检测:雷达数据首先传输到采用滑动均值窗算法的一维误报率(CFAR)(CFAR)**检测器。该装置检测是否存在反射信号。

聚类:然后在"DBSCAN 聚类器 "块中执行聚类过程,利用在CFAR块中获得的数据将探测单元聚类为范围组。

  • 范围估算器**是识别探测对象和群组的最后一步。该步骤利用雷达数据估算探测目标的范围。

image_2.png

1.3 渠道模式和目标

信道和目标子系统模拟信号传播和目标飞行器的反射。 ** 信道 - 模拟雷达车和目标车之间的信号传播。信道可配置为自由空间信道(自由空间信道)或双光束信道(信号通过直接和反射路径到达接收器)(双光束信道)。默认选择自由空间信道。

image_2.png

** 目标** - 反射入射信号并模拟目标飞行器的路径。下图所示子系统由两部分组成:模拟反射信号的目标模型(块 - 目标)和模拟目标飞行器动态的空间物体模型(块 - 平台)。

image_4.png

2.输入参数初始化

在模型场景中,一辆装有雷达的汽车以 100 公里/小时(27.8 米/秒)的速度从参考点出发,目标物以 96 公里/小时(26.7 米/秒)的速度从其前方 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 输入信号的频谱图

首先让我们来看看发射的低频调制信号的频谱图。

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

上面的频谱图显示,频率偏差为 150 兆赫,周期为每 7 微秒一次,相当于约 1 米的分辨率。

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

接下来,我们来看看数字处理后的信号频谱图:

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

从图中可以看出,物体产生的节拍频率约为 100 kHz。请注意,经过处理后,信号只有一个频率成分。根据节拍频率计算出最终的测距估计值,精度为 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]:

因此,雷达与目标物体之间距离的估算精度与宣布的精度一致 - 1 米。

5.4 分析双波束信号传播的影响

上一段的结果是通过模拟自由空间中的直接传播信道得出的。在现实中,车辆之间的传播通常使用发射器和接收器之间的多条路径。因此,来自不同路径的信号可以同相或反相叠加。

如果建立一个在(双射线)信道(这是最简单的多径信道)上传播的模型,就会发现在噪声频谱的背景下无法分辨出主拍频(见下面的频谱图),因为直达信号与反射信号叠加在一起。

image.png

关闭

在本示例中,我们考虑了原子移动雷达基本模型的建模,并将连续 LFM 信号用作探测信号。模型运行的结果是,雷达与目标物体(汽车)之间的距离估计精度为雷达分辨率 - 1 米。

还研究了信号传播模型的影响:直接传播通道和双折射传播通道。结果表明,双波束传播模型会通过补偿拍频分量对雷达性能产生负面影响,从而导致无法进行测距。