Engee 文档
Notebook

基于多频调制(MFSK)信号的汽车雷达

该示例介绍了基于多位置频率调制(MFSK)信号的汽车雷达设计,用于估计多个物体的距离和速度。

使用的函数

In [ ]:
Pkg.add(["LinearAlgebra", "DSP"])
   Resolving package versions...
┌ Warning: It looks like the Kaleido process is not responding. 
│ The unresponsive process will be killed, but this means that you will not be able to save figures using `savefig`.
│ 
│ If you are on Windows this might be caused by known problems with Kaleido v0.2 on Windows (you are using version 0.2.1).
│ You might want to try forcing a downgrade of the Kaleido_jll library to 0.1.
│ Check the Package Readme at https://github.com/JuliaPlots/PlotlyKaleido.jl/tree/main#windows-note for more details.
│ 
│ If you think this is not your case, you might try using a longer timeout to check if the process is not responding (defaults to 10 seconds) by passing the desired value in seconds using the `timeout` kwarg when calling `PlotlyKaleido.start` or `PlotlyKaleido.restart`
└ @ PlotlyKaleido /usr/local/ijulia-core/packages/PlotlyKaleido/U5CX4/src/PlotlyKaleido.jl:24
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
include("$(@__DIR__)/calcParamMFSK.jl")

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 = 32,
    nfft::Int64=32,
    lap::Int64  = 30,
    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 .*1e3, permutedims(power_new),color= :jet,
        gridalpha=0.5,margin=5Plots.mm,size=(900,400))
    xlabel!("Частота, МГц")
    ylabel!("Время, мс")
    title!(title)

    return fig
end;

1. 模型结构描述

image_2.png

结构方案与示例(用于多目标测距和测速的汽车雷达)类似。主要区别在于

  • 使用多位置频率调制的连续辐射发生器;
  • 信号处理考虑到两个参数:节拍频率和扫描之间的相移。

信号处理装置

image_2.png

信号处理子系统包括以下几个阶段: 1.接收信号与Dechirp模块中的复数共轭输入信号相乘,得到解调信号; 2.2. 下一步,解调信号在扫频块中进行处理,利用快速傅里叶变换计算频域内的频谱; 3.3. 接下来,使用一维检测器(CA CFAR 检测器)检测频谱中与目标相对应的峰值。 4.4. 最后,在求解测距多普勒方程块中,利用找到的节拍频率值和扫描之间的相位差,计算出目标的测距和速度估计值;

2 输入参数初始化

模拟场景如下:一辆装有雷达的车辆以 100 公里/小时(27.8 米/秒)的速度从参考点出发

视线内有两辆目标车辆**,分别是一辆轿车和一辆货车,每辆车都有一个相应的传播通道。汽车距离雷达 50 米,时速 60 公里(16.7 米/秒)。卡车距离雷达 150 米,时速为 130 公里(36.1 米/秒)。

信号传播通道为自由空间。

为了初始化模型的输入参数,我们连接了 "calcParamMFSK.jl"文件。如果需要更改参数值,请打开该文件并编辑必要的参数。

In [ ]:
include("$(@__DIR__)/calcParamMFSK.jl") # подключения файла с валидационными параметрами
paramRadarMFSKMT = CalcParamMFSK(); # валидация входных параметров
T = paramRadarMFSKMT.T; # шаг моделирования
SimT = T; # Время моделирования

3.运行模型

In [ ]:
run_model("MFSK_Radar_Range_Estimation_MT",@__DIR__); # Запуск модели
Building...
Progress 0%
Progress 100%
Progress 100%

4.读取模拟结果

In [ ]:
sig_MFSK, fast_time = DataFrame2Array(MFSK) # входной ЛЧМ-сигнал
out_range, _ = DataFrame2Array(Range) # сигнал после цифровой обработки
out_speed, slow_time = DataFrame2Array(Speed); # оценки дальности

5.雷达操作可视化

5.1 输入信号的频谱图

让我们使用 calc_spectrogram 函数绘制输入信号的频谱图

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

频谱图的频率成分具有阶跃特性,这与信号的多频频率调制相对应。事实上,使用 MFSK 的信号由两次带有固定离散频率偏移的 FMCW 信号扫描组成。辐射信号的扫描时间由离散步长与步长数的乘积决定,约为 2 毫秒,比连续 FMCW 信号(约 7 微秒)长几个数量级。

5.2 估算物体的距离和速度

让我们分析一下雷达操作的结果

比较测距和测速的估计值和真实值(汽车测距 50 米,卡车测距 150 米)

In [ ]:
println("Оценка дальности автомобиля $(round(out_range[1,1,end];sigdigits=5)) м")
println("Оценка дальности грузовика $(round(out_range[2,1,end];sigdigits=5)) м")

println("Оценка дальности автомобиля $(round(out_range[1,1,end]-50;sigdigits=5)) м")
println("Оценка дальности грузовика $(round(out_range[2,1,end]-150;sigdigits=5)) м")
Оценка дальности автомобиля 49.664 м
Оценка дальности грузовика 149.99 м
Оценка дальности автомобиля -0.3361 м
Оценка дальности грузовика -0.011043 м

现在让我们比较一下估计值和真实速度值(汽车的相对速度 - 40 km/h,卡车的相对速度 - 30 km/h)

In [ ]:
println("Оценка относительной скорости автомобиля $(round(out_speed[1,1,end]*3.6;sigdigits=5)) км/ч")
println("Оценка относительной скорости грузовика $(round(out_speed[2,1,end]*3.6;sigdigits=5)) км/ч")
println("Погрешность оценки относительной скорости автомобиля $(round(out_speed[1,1,end]*3.6-40;sigdigits=5)) км/ч")
println("Погрешность оценки относительной скорости грузовика $(round(out_speed[2,1,end]*3.6-(-30);sigdigits=5)) км/ч")
Оценка относительной скорости автомобиля 39.941 км/ч
Оценка относительной скорости грузовика -30.857 км/ч
Погрешность оценки относительной скорости автомобиля -0.059183 км/ч
Погрешность оценки относительной скорости грузовика -0.85661 км/ч

通过对模拟结果的分析,我们可以得出结论:雷达估测值符合所宣称的测距精度(1 米)和速度精度(1 公里/小时)。

结论

在示例中,我们考虑了使用多位置频率调制探测信号的汽车雷达模型的设计。 通过该模型的运行,我们可以估算出雷达到目标(汽车和卡车)的正向速度和距离,雷达分辨率精度为:距离 1 米,速度约 1 公里/小时。

还应指出的是:与连续 LFM 信号相比,使用所考虑的信号可将扫描时间从 7 µs 增加到 2 ms,从而降低设备成本。

示例中使用的块