一种用于小物体的多通道宽带测向系统
该示例考虑了多通道雷达系统的建模,用于解决测向多个目标的问题。 目标小物体是无人驾驶飞行器(Uav)-"四轴飞行器"。
在执行脚本之前,建议使用命令清除工作区 engee.clear(). 如果这不是必需的,您可以删除或评论此命令。 您还可以选择图形可视化的类型:交互式或静态。 该控件是使用变量实现的 is_dinamic_plot.
engee.clear() # 清除工作区
is_dinamic_plot = true # 选择图形类型:true(plotlyjs())-interactive,false(gr())-static
is_dinamic_plot ? plotlyjs() : gr()
连接辅助文件和库
要实现有问题的系统,需要连接第三方库和辅助功能。:
let
installed_packages = collect(x.name for (_, x) in Pkg.dependencies() if x.is_direct_dep)
list_packages = ["JLD2","Hungarian"]
for pack in list_packages
pack in installed_packages || Pkg.add(pack)
end
end
using LinearAlgebra,Hungarian,DataFrames
import JLD2
include("utils/plot_sig_and_spec.jl") # 建立示波器和频谱图的功能
include("utils/viz_scene.jl") # 构建雷达运行场景的功能
include("utils/calc_plot_rcs.jl") # 反向散射图构造函数
include("utils/sort_ang_mse.jl") # 排序轴承估计值的功能
include("utils/plot_spec_azel.jl") # 构造空间谱的功能
include("utils/calc_table_ang_analysis.jl") # 用于精度分析的表计算功能
1. 雷达运行场景系统模型的开发
让我们考虑具有多个目标的多通道宽带测向系统的场景。
假设雷达位于原点,沿x轴定向。 为了解决确定支座的问题,使用矩形相控阵天线(FAR)和数字处理算法(MUSIC,MVDR,BeamScan)。
四个"四轴飞行器"类型的小型无人机物体正靠着x**轴向雷达站移动。 每个对象都有自己的轨迹。 到目标的射程为1000-1500米,速度为130-150米/秒。到目标的方位角方向在[-20,20]度内,角方向为[0,30]度。
该方案的大致外观如下图所示。
1.1雷达结构说明
让我们更详细地描述雷达系统模型的结构方案。:
*ZS发生器:具有线性频率调制(LFM)的脉冲信号用作探测信号;
*发射器:信号在发射器中放大,考虑到传输路径中的损耗;
*传输大灯:使用矩形大灯形成方向图案(DN;
*传播介质:考虑到传播衰减、频率色散和天气影响;
*目标:描述DOR,考虑到信号的宽带频谱和目标的轨迹;
*发射大灯:底部采用接收宽带矩形大灯形成,;
*接收器:通过添加自身的热噪声(LNA模型)来实现接收信号的放大。
*轴承算法:是确定目标在方位角和角平面中的方向的数字算法(MUSIC,BeamScan,MVDR)之一;
该模型的运行方案如下图所示。
1.2雷达参数
关键雷达参数是载波频率值。 在选择频率范围时,有必要考虑到雷达的任务,因为载波频率的值越高,传播过程中的衰减和衰减越高,同时增加对小物体的灵敏度。
在解决小物体的测向问题时,建议使用与目标大小(20-30cm)相称的ranges++:L-或S-ranges。 让我们选择雷达系统的L波段(1-2GHz),并取载波频率值为1GHz(λ≈0.3m)。
# 基本雷达参数
fc = 1e9 # [Hz],载波频率
c = physconst("LightSpeed") # [m/s],信号的传播速度
lambda = c / fc; # 波长,m
println("载波频率:∞(FC*1E-9)GHz")
println("光速:<c m/s")
println("波长:<lambda m")
1.3探测信号的参数
作为探测脉冲,我们将选择具有脉冲内调制的信号-[脉冲LFM信号](https://engee.com/helpcenter/stable/cn/phased-waveforms/linear-fm-waveform.html ),带有条纹 bw -100兆赫,持续时间 T -10微秒和一个钻孔 Q - 2. 这样的信号是宽带的,因为信号频带与载波频率的比率大于5%(在示例中为10%)。 信号生成是使用系统对象实现的 EngeePhased.LinearFMWaveform . 使用参数 n_pulses , n_groups_imps 您可以相应地设置每包的累积脉冲数和包数。
重要的是,宽带系统需要设置频率子带的数量。 NBand,其中信号将被认为是窄带。 总带宽由采样率决定 子范围的宽度计算为(1)
然后利用公式(2)计算子带的中心频率
# ---信号参数 ---
bw = 100e6; # LFM频段,Hz
T = 10e-6; # 脉冲持续时间,s
Q = 2 # 脉冲连续性
prf = round(1 / (Q * T);sigdigits = 15); # 脉冲重复率(必要时舍入)
type_dir = "Up" # 频率变化方向["向上","向下"]
type_sweep = "Positive" # 频率变化类型["正","对称"]
n_pulses = 2 # 累积脉冲数
n_groups_imps = 2 # 脉冲突发数
fs = 2*bw; # 采样率,Hz
NBand = 64; # 频率子带数
T_coh = n_pulses/prf # coregent积累的时间
ΔR = c/(2*bw) # 范围分辨率,m
ΔV = lambda/(2*T_coh) # 速度分辨率,m/s
Rmin = c*T/2 # 最小一位数范围,m
Rmax = c/(2*prf) # 最大一位数范围,m
Vmax = lambda*prf/4 # 最大个位数速度,m/s
# lfm信号发生器的系统对象的形成
waveform = EngeePhased.LinearFMWaveform(
SampleRate = fs, # 采样率,Hz
PulseWidth = T, # 脉冲持续时间
PRF = prf, # 脉冲重复率
SweepBandwidth = bw, # LCHM乐队
SweepDirection = "Up", # 频率变化方向
SweepInterval = "Positive", # 锯型,非对称或对称
OutputFormat = "Pulses", # 输出格式类型[]
NumPulses = n_pulses # 脉冲数
);
我们将给定脉冲数的信号波形和频谱图可视化为1包。
# LFM信号的计算
sig_lfm = waveform();
# 示波器和频谱图的构建
plot_sig_and_spec(sig_lfm;fs=fs,name_sig = "LCHM");
下文给出了成形车辆的战术和技术特征。:
println("采样率:∞(round(fs*1e-6;sigdigits=5))MHz")
println("脉冲持续时间:△(round(T*1e6;sigdigits=5))微秒")
println("随访期:$(round(1e6/prf;sigdigits=5))mks")
println("重复率:△(round(prf*1e-3;sigdigits=5))kHz")
println("钻孔:$(圆(Q;sigdigits=5))")
println("相干累积时间:△(round(T_coh*1e3;sigdigits=5))ms")
println("每包脉冲数:$n_pulses")
println("包数:$n_groups_imps")
println("范围分辨率:△(round(ΔR;sigdigits=3))m")
println("速度分辨率:△(round(ΔV;sigdigits=3))m/s")
println("最大一位数范围:$(round(Rmax;sigdigits=3))m")
println("最小一位数范围:$(round(Rmin;sigdigits=3))m")
println("最大个位数速度:∞(round(Vmax;sigdigits=3))m/s")
1.4天线形成
需要二维天线阵列用于两个方向的测向-方位角和仰角。 该示例使用最常见的类型,矩形等距头灯,它使用 EngeePhased.URA. 各向同性散热器作为前照灯的元件。 - EngeePhased.IsotropicAntennaElement.
# 天线参数
d = lambda /2 # 元素之间的距离
freq_range = [fc-bw fc+bw] # 辐射的频率范围
Nx = 24 # X轴上的元素数(方位角分辨率)
Ny = 24 # Y轴上的元素数(按位置角度的分辨率)
Δaz = rad2deg(lambda/(d*(Nx-1))) # 方位分辨率,deg
Δel = rad2deg(lambda/(d*(Ny-1))) # 座椅角度分辨率,deg
# 元素总数N=Nx*Ny
# 具有各向同性天线元件
ant_elem = EngeePhased.IsotropicAntennaElement(
FrequencyRange = freq_range, # 频率范围
BackBaffled = true # 去除天线底部的反向散射
)
# 创建矩形大灯
array = EngeePhased.URA(
Element = ant_elem, # 天线元件
Size = [Nx Ny], # 网格大小
ElementSpacing = [d d], # 元素之间的距离
);
使用该功能可视化前大灯的方向图案 pattern.
pattern(array,fc) |> display;
矩形前照灯的参数和特性如下:
println("元素之间的距离:$(round(d;sigdigits=3))m")
println("矩形大灯尺寸:$(Nx)x$Ny[Nx,Ny]")
println("辐射频率范围:∞(freq_range*1e-9)GHz")
println("方位角分辨率:△(round(Δaz;sigdigits=3))°")
println("位置角分辨率:△(round(Δel;sigdigits=3))°")
1.5发送和接收路径
雷达的下一个组件是接收和发送路径。 它执行2主要任务:
- 探测信号以电磁波(EMW)的形式辐射到太空;
- 接收来自目标的反射信号。
传输路径包括2个部件:发射器,实现预放大和头灯。 接收路径类似地形成,包括接收头灯和前置放大器。
# 接收和发送路径的参数
Pt = 1e3 # W、峰值功率
Gtx = 20 # dB,发射天线的增益
LFtx = 1.5 # dB,传输路径中的损耗
Grx = 20 # dB,接收天线的增益
NF = 2 # dB,接收路径的噪声系数
LFrx = 1.5 # dB,接收路径中的损耗
TN = 290 # 噪音温度
NP = physconst("boltzmann") * bw * TN; # W、噪声功率
# 带有发射器的生物
transmitter = EngeePhased.Transmitter(
Gain = Gtx, # 发射机增益
PeakPower = Pt, # 峰值功率
LossFactor=LFtx # 传输路径中的损耗
)
# 具有宽带传输灯的设备
radiator = EngeePhased.WidebandRadiator(
Sensor = array, # 天线元件的底部
SampleRate = fs, # 采样率
CarrierFrequency = fc, # 载波频率
NumSubbands = NBand # 频率子带数
)
# 具有宽带接收头灯的设备
collector = EngeePhased.WidebandCollector(
Sensor = array, # 天线元件的底部
SampleRate = fs, # 采样率
CarrierFrequency = fc, # 中央频率
NumSubbands = NBand # 频率子带数
)
# 创建接收前置放大器(LNA)
receiver = EngeePhased.ReceiverPreamp(
NoiseMethod="Noise power", # 噪音设定方法["噪音功率"、"噪音温度"]
Gain = Grx, # 接收器增益,dB
NoisePower = NP, # 噪音功率
LossFactor=LFrx, # 接收道中的损失
NoiseFigure = NF, # 路径中的噪声因子
SampleRate = fs # 采样率
);
下面给出收发器路径的参数和特性:
println("-----------------发射器-----------------------------")
println("发射机功率:△(round(Pt*1e-3;sigdigits=5))kW")
println("发射机增益:△(Round(Gtx;sigdigits=5))dB")
println("传输路径损耗:△(round(LFtx;sigdigits=5))dB")
println("--------------------------------------------------------")
println("-----------------接收器-----------------------------")
println("接收器增益:△(round(Gtx;sigdigits=5))dB")
println("接收路径中的损耗:△(round(LFtx;sigdigits=5))dB")
println("噪声温度:△(round(LFrx;sigdigits=5))dB")
println("噪声系数:△(round(nf;sigdigits=5))dB")
println("噪声温度:△(round(TN;sigdigits=5))°C")
println("噪声功率:△(round(NP;sigdigits=5))W")
1.6数字处理单元(测向仪)
雷达的最后一块是测向算法。 这样的块解决了确定信号到达方向的问题,结果,目标物体相对于雷达的方向。 考虑最常用的:"BeamScan","MVDR","MUSIC"
az_scan = -20:0.5:20 # 方位扫描范围
el_scan = 0:0.5:30 # 按位置角度扫描范围
n_sig = 4 # 评分数(进球数)
algorithm = "MUSIC" # @param ["Beamscan","MVDR","MUSIC"]
beamscan = EngeePhased.BeamscanEstimator2D(
SensorArray = array, # 天线
OperatingFrequency = fc, # 载波频率
AzimuthScanAngles = az_scan, # 方位扫描范围
ElevationScanAngles = el_scan, # 按位置角度扫描范围
DOAOutputPort = true, # 启用轴承估计值的输出
NumSignals = n_sig # 评级数目
);
mvdr = EngeePhased.MVDREstimator2D(
SensorArray = array, # 天线
OperatingFrequency = fc, # 载波频率
AzimuthScanAngles = az_scan, # 方位扫描范围
ElevationScanAngles = el_scan, # 按位置角度扫描范围
DOAOutputPort = true, # 启用轴承估计值的输出
NumSignals = n_sig # 评级数目
);
music = EngeePhased.MUSICEstimator2D(
SensorArray = array, # 天线
OperatingFrequency = fc, # 载波频率
AzimuthScanAngles = az_scan, # 方位扫描范围
ElevationScanAngles = el_scan, # 按位置角度扫描范围
DOAOutputPort = true, # 启用轴承估计值的输出
NumSignalsSource="Property",
NumSignals = n_sig, # 评级数目
ForwardBackwardAveraging=false # 计算正向和反向平均
);
doa_alg = if algorithm == "Beamscan"
println("算法:Beamscan")
deepcopy(beamscan)
elseif algorithm == "MVDR"
println("算法:MVDR");
deepcopy(mvdr)
elseif algorithm == "MUSIC"
println("算法:音乐");
deepcopy(music)
end;
1.7Phono目标环境
Phono-target环境块包括2个组件:分布环境和目标对象。 为了模拟环境,考虑到信号的宽带, EngeePhased.WidebandLOSChannel 它允许您考虑物体传播过程中的频率分散以及天气条件(水文气象,冰雹,压力变化等)的影响。).
# 分布环境参数
is_atmosphere = true # 大气对电磁波传播的影响的考虑
T_ch = 15 # 大气温度,°C
press_air = 101325.0 # 大气压力,PA
vap_density = 7.5 # 湿蒸汽密度
liq_density = 0.0 # 冷凝水密度
rain_rate = 0.0 # 降水强度
channel_fwd = EngeePhased.WidebandLOSChannel(
PropagationSpeed = c,
SampleRate = fs,
OperatingFrequency = fc,
NumSubbands = NBand,
TwoWayPropagation = false, # 考虑双向信号传播
SpecifyAtmosphere = is_atmosphere,
Temperature = T_ch,
DryAirPressure = press_air,
WaterVapourDensity = vap_density,
LiquidWaterDensity = liq_density,
RainRate = rain_rate
);
channel_bwd = deepcopy(channel_fwd); # 从目标到雷达的分配通道(相同)
为了形成一个目标,它与 EngeePhased.WidebandBackscatterRadarTarget. 它允许您以给定精度的空间分辨率网格(方位角和仰角)描述目标的用户门。 在示例中,dor矩阵被加载(filequad_rcs_pattern.jld2)为解析计算的四轴飞行器型无人机模型。 DOR计算的更详细描述在[2,3]中讨论。
data = JLD2.load("quad_rcs_pattern.jld2")
num_tgts = n_sig # 目标数量(设置相等数量的测向器评级)
rcs_az = data["az"] # 方位EPR记帐范围(-180:180),deg
rcs_el = data["el"] # EPR会计范围按座位角度(-90:90),deg
rcs_pattern = data["rcs"] # 目标门矩阵[181x361],m^2
type_tgt = "Nonfluctuating" # 目标类型["非波动","Swerling1","Swerling2","Swerling3","Swerling4"]
# 宽带SDR目标的形成
rcs_targets = EngeePhased.WidebandBackscatterRadarTarget(
AzimuthAngles = rcs_az, # 基于方位的EPR记帐范围
ElevationAngles = rcs_el, # 按座位角度计算的EPR会计范围
RCSPattern = rcs_pattern, # DOR目标
PropagationSpeed = c, # 传播速度,m/s
OperatingFrequency = fc, # 载波频率,Hz
NumSubbands = NBand, # 频率子带数
Model = type_tgt # 目标EPR的波动类型
);
要可视化UAV对象及其DOR,请使用函数 calc_plot_rcs:
text_title = "可视化和DOR目标"
k_norm = 0.6 # 门尺寸缩放系数
calc_plot_rcs(rcs_pattern,rcs_az,rcs_el;title = text_title,k = k_norm)
由于目标的几何特征-存在螺钉形式的不规则性,UAV心轴的一般外观具有坚固,裂开的特征。 可以注意到,当UAV从上方和下方照射时达到最大EPR值,这是由于最大照射面积,并且EPR在水平面内减小。
1.8交通场景
模型形成的最后阶段是设置目标和雷达的轨迹。 在该场景中,假设雷达位于坐标系的原点并且是静止的。 目标的初始位置和速度在变量中设置 targets_pos 和 targets_vel,选取匀速运动模型
# 目标移动模型
targets_pos = [
[1000; 100; 200];; # 1目标
[1200; -10; 200];; # 2目标
[1100; -150; 150];; # 3目标
[950; 50; 320];; # 4目标
] # 目标的初始位置,m
targets_vel = [
[-130; 0; 0];; # 第1目标的速度(在平行于x轴的雷达上)
[-150; 0; 0];; # 第二目标的速度(在平行于x轴的雷达上)
[-200; 0; 0];; # 第3目标的速度(在平行于x轴的雷达上)
[-230; 0; 0];; # 第4个目标的速度(在平行于x轴的雷达上)
] # 目标速度,m/s
type_traj = "Velocity" # 运动模型是均匀的["速度","加速度","自定义"]
targets_platform = EngeePhased.Platform(
MotionModel = type_traj,
InitialPosition = targets_pos, # 起始位置
Velocity = targets_vel # 目标速度
)
# 雷达运动模型
radar_pos = [0; 0; 0] # 雷达位置
radar_vel = [0; 0; 0] # 雷达速度
radar_platform = EngeePhased.Platform(
InitialPosition = radar_pos, # 雷达位置
Velocity = radar_vel # 雷达速度
);
abs_dist,ang_true = rangeangle(targets_pos,radar_pos)
for i in 1:num_tgts
println("----------------目标#$(i)----------------------------")
println("方位角:ψ(round(ang_true[1,i];sigdigits=3))°,仰角:ψ(round(ang_true[2,i];sigdigits=3))°")
println("雷达范围至目标号。$(i):$(round(abs_dist[i]*1e-3;sigdigits=5))km")
end
使用函数 viz_scene 我们将显示场景的初始状态,考虑到目标的目击方向。:
viz_scene(targets_pos, radar_pos) |> display;
结果,形成了雷达的以下战术和技术特征:
println("-----------------雷达站-----------------------------")
println("载波频率:∞(round(fc*1e-9;sigdigits=3))GHz")
println("光速:<c m/s")
println("波长:∞(round(lambda;sigdigits=3))m")
println("频率子带数:△NBand m")
println("雷达位置:$radar_pos[Px,Py,Pz],m")
println("雷达速度:△radar_vel[Vx,Vyc,Vz],m/s")
println("--------------------------------------------------------")
println("-----------------发电机-----------------------------")
println("采样率:∞(round(fs*1e-6;sigdigits=5))MHz")
println("脉冲持续时间:△(round(T*1e6;sigdigits=5))微秒")
println("随访期:$(round(1e6/prf;sigdigits=5))mks")
println("重复率:△(round(prf*1e-3;sigdigits=5))kHz")
println("钻孔:$(圆(Q;sigdigits=5))")
println("相干累积时间:△(round(T_coh*1e3;sigdigits=5))ms")
println("每包脉冲数:$n_pulses")
println("包数:$n_groups_imps")
println("范围分辨率:△(round(ΔR;sigdigits=3))m")
println("速度分辨率:△(round(ΔV;sigdigits=3))m/s")
println("最大一位数范围:$(round(Rmax;sigdigits=3))m")
println("最小一位数范围:$(round(Rmin;sigdigits=3))m")
println("最大个位数速度:∞(round(Vmax;sigdigits=3))m/s")
println("--------------------------------------------------------")
println("-----------------发射器-----------------------------")
println("发射机功率:△(round(Pt*1e-3;sigdigits=5))kW")
println("发射机增益:△(Round(Gtx;sigdigits=5))dB")
println("传输路径损耗:△(round(LFtx;sigdigits=5))dB")
println("--------------------------------------------------------")
println("-----------------接收器-----------------------------")
println("接收器增益:△(round(Gtx;sigdigits=5))dB")
println("接收路径中的损耗:△(round(LFtx;sigdigits=5))dB")
println("噪声温度:△(round(LFrx;sigdigits=5))dB")
println("噪声系数:△(round(nf;sigdigits=5))dB")
println("噪声温度:△(round(TN;sigdigits=5))°C")
println("噪声功率:△(round(NP;sigdigits=5))W")
println("--------------------------------------------------------")
println("-----------------天线-------------------------------")
println("元素之间的距离:$(round(d;sigdigits=3))m")
println("矩形大灯尺寸:$(Nx)x$Ny[Nx,Ny]")
println("辐射频率范围:∞(freq_range*1e-9)GHz")
println("方位角分辨率:△(round(Δaz;sigdigits=3))°")
println("位置角分辨率:△(round(Δel;sigdigits=3))°")
println("--------------------------------------------------------")
println("-----------------测向仪-----------------------------")
println("方位扫描范围:△(az_scan)deg.")
println("按位置角度扫描范围:△(el_scan)deg。")
println("评级数目:$n_sig")
println("--------------------------------------------------------")
2. 雷达运行场景的计算
2.1模型运行
使用先前初始化的CO,我们将为雷达的操作创建一个场景。 执行计算后,以下变量将可用:
-
data_y-接收装置输出端的反射信号 -
data_ang_true-N周期(脉冲突发)的真实轴承值 -
data_ang_est-轴承估计N周期(脉冲突发) -
data_spec-在所选算法的测向算法的输出处的功率谱的估计
重要的是要注意,目标的位置从脉冲更新到脉冲。 因此,在系统操作周期期间,必须将LFM信号的1个脉冲施加到发射机的输入端。 辅助变量用于此目的。 sig_lfm_one_imps 和 sig_buffer_one_groups.
# 输出信号和轴承估计的内存分配
data_y = zeros(ComplexF64,length(sig_lfm),Nx*Ny,n_groups_imps)
data_ang_true = zeros(2, num_tgts, n_groups_imps); # 目标的真正方向
data_ang_est = zeros(2, num_tgts, n_groups_imps); # 目标的真正方向
data_spec = zeros(length(el_scan),length(az_scan), n_groups_imps); # 测向器输出处视角的光谱数据
len_one_imps = round(Int,length(sig_lfm)/n_pulses) # 1脉冲的计数数
sig_lfm_one_imps = sig_lfm[1:len_one_imps] # 分配1个脉冲
sig_buffer_one_groups = similar(data_y[:,:,1]) # 用于累积脉冲串的缓冲器
println("场景的计算正在运行。..")
@inbounds for i in 1:n_groups_imps
println("束数△(i)的计算。..")
@inbounds for k in 1:n_pulses
println("脉冲数△(k)的计算。..")
# 以脉冲周期1/prf的增量更新雷达和目标的位置
radar_pos, radar_vel = radar_platform(1/prf)
tgts_pos, tgts_vel = targets_platform(1/prf)
# 计算和维护目标轴承
_,ang_doa = rangeangle(tgts_pos,radar_pos)
data_ang_true[:,:,i] .= deepcopy(ang_doa)
# 周三宽带信号发射
sig_tx = transmitter(sig_lfm_one_imps) # 传送路径的通过
sig_rad = radiator(sig_tx,ang_doa) # 向太空辐射信号
# 从雷达到目标的传播
sig_fwd = channel_fwd(sig_rad,radar_pos,tgts_pos,radar_vel,tgts_vel)
# 目标的反思
sig_refl = rcs_targets(sig_fwd,ang_doa)
# 从目标到雷达的传播
sig_ret = channel_bwd(sig_refl,tgts_pos,radar_pos,tgts_vel,radar_vel)
# 接收道
y = collector(sig_ret,ang_doa) # 接收灯
sig_buffer_one_groups[(1:len_one_imps).+(k-1)*len_one_imps,:] .= receiver(y) # 基于接收器热噪声(LNA)的预放大
end
# 轴承计算
data_spec[:,:,i],data_ang_est[:,:,i] = doa_alg(sig_buffer_one_groups); # 评估目标到达的范围和方向
data_y[:,:,i] .= sig_buffer_one_groups; # 保存接收到的信号
end
println("场景计算完成!")
2.2系统精度分析
让我们从方位角和仰角绘制测向算法输出端的信号功率谱。 角度网格继承自第1.6段,其中设置了测向算法和网格精度。
n_imp = 1 # 分析脉冲的数量
plot_size = (600,600) # 许可
plot_spec_azel(az_scan,el_scan,data_spec[:,:,n_imp];
title = "测向器输出处的功率谱(算法△(algorithm))",
size = plot_size
)
该图显示了4个特征峰,表明在这些方向上存在目标。 下面是方向和轴承估计的真实值的比较,为各自的目的。
在测向器输出处,估计值按检测顺序给出,因此我们将首先使用函数按最小欧几里德距离(L2-范数)估计值的标准进行排序 sort_ang_mse:
sort_ang_est = sort_ang_mse(data_ang_true,data_ang_est) # 排序的角度估计数据
for k in 1:n_groups_imps
println("---------------脉冲包号 $(k) -----------------------------")
for i in 1:num_tgts
println(" ----------------目标#$(i) ----------------------------")
println(" 目标:方位角=$(round(data_ang_true[1,i,k];sigdigits=4))°,仰角=$(round(data_ang_true[2,i,k];sigdigits=4))°");
println(" 估计:方位角=$(round(sort_ang_est[1,i,k];sigdigits=4))°,座角=$(round(sort_ang_est[2,i,k];sigdigits=4))°");
println(" 误差:方位角=$(round(abs(sort_ang_est[1,i,k]-data_ang_true[1,i,k]);sigdigits=4))°,座角=$(round(abs(sort_ang_est[2,i,k]-data_ang_true[2,i,k]);sigdigits=4))°");
end
println("最大误差:△(round(maximum(abs.(data_ang_true[:,:,k]。-sort_ang_est[:,:,k]));sigdigits=4))°")
println("-------------------------------------------------------------")
end
最大轴承误差为 0.538°,这与划分网格的价格相当(0.5°). 因此,所使用的算法适用于正在解决的问题。 为了提高精度,您可以增加前灯元件的数量并减少角落的分析网格。
3. 测向算法的分析与比较
在最后一节中,我们研究了测向算法(Beamscan,MVDR,Music)在不同信噪比下的准确性。
为此,让我们使用基本雷达方程估计当前SNR radareqsnr. 您可以使用应用程序"雷达方程的计算"自动计算SNR并生成jl计算文件。 下面是一个应用程序计算范围为1.5公里、长度为0.3米、脉冲持续时间为10微秒和峰值功率为1千瓦的信噪比的例子。
结果,当前配置的SNR值为34.1dB。 生成后,计算文件**RadarEquationScript_2026-05-29_21:46:25.749。jl出现在文件浏览器中。**生成的参数化代码如下所示:
tgtrng = maximum(abs_dist) # 目标范围
# SNR的计算,精度为3位
snr = round(radareqsnr(
lambda, # 波长
tgtrng, # 目标范围
Pt, # 脉冲功率
T, # 脉冲持续时间
RCS = 0.01, # 目标的EPR(选择平均值)
Gain = Grx, # 天线增益
Loss = LFtx+LFrx, # 路径中的损失
Ts = TN # 噪音温度
)[1];sigdigits = 3)
println("当前信噪比:<信噪比db")
为了分析算法的有效性,我们将选择接收器输出端的信号的最后一个脉冲,并形成一个用于增加噪声功率的向量。 noise_vec 和SNR值 snr_vec:
y = deepcopy(data_y[:,:,end]) # 复制最后一个脉冲的信号数据
ang_trues_end = data_ang_true[:,:,end]; # 复制目标的真实方向
noise_vec = collect(20:10:70) # 噪声功率的矢量相对于NP从20dB增加到70dB
snr_vec = snr .- noise_vec # SNR值的向量
println("SNR矢量:△(round.(snr_vec;sigdigits=3))dB")
3.1音乐算法
考虑算法的效率 MUSIC. 让我们用音乐打6个电话,从一个电话到另一个电话,信噪比下降了10倍.:
# 为音乐不可比拟的频谱和角度估计分配内存
spec_music = zeros(length(el_scan),length(az_scan), length(noise_vec))
ang_music = zeros(2, num_tgts, length(noise_vec)) # 目标的真正方向
@inbounds for i in 1:length(noise_vec)
println("SNR的估计计算△(round(snr_vec[i];sigdigits=3))dB")
release!(music) # 将系统对象重置为初始状态
noise_sig = sqrt(NP*10^(noise_vec[i]/10))*randn(size(y)) # 噪声信号的新数据
spec_music[:,:,i],ang_music[:,:,i] = music(y.+noise_sig); # 评估目标到达的范围和方向
end
让我们比较指定SNR的测向结果:
fig_spec_music_vec = [] #
@inbounds for i in 1:length(noise_vec)
push!(fig_spec_music_vec,
plot_spec_azel(az_scan,el_scan,spec_music[:,:,i];
title = "音乐(SNR=$(round(snr_vec[i];sigdigits=3))db)"
)
)
end
plot(fig_spec_music_vec...)
在24dB时,所有4目标都有自信的接收。 随着SNR的降低,可检测目标的数量减少:对于-15.9dB,2个目标可见,对于-25.9dB,目标检测丢失。
接下来,考虑所有目的的最大定位误差。:
sort_ang_music = similar(ang_music) # 排序的角度估计数据
[sort_ang_music[:,:,i] .= sort_ang_mse(ang_trues_end,ang_music[:,:,i]) for i in 1:length(snr_vec)]
# 建立一个表
calc_table_ang_analysis(ang_trues_end,sort_ang_music,snr_vec)
当SNR降低到-16dB时,对于弱目标,定位精度降低,并且随着信号进一步减弱,误差变得随机。
3.2MVDR算法
接下来,我们来看看算法的效率。 MVDR.
# 为MVDR分配不可比拟的频谱和角度估计的内存
spec_mvdr = zeros(length(el_scan),length(az_scan), length(noise_vec))
ang_mvdr = zeros(2, num_tgts, length(noise_vec)) # 目标的真正方向
@inbounds for i in 1:length(noise_vec)
println("SNR的估计计算△(round(snr_vec[i];sigdigits=3))dB")
release!(mvdr) # 将系统对象重置为初始状态
noise_sig = sqrt(NP*10^(noise_vec[i]/10))*randn(size(y)) # 噪声信号的新数据
spec_mvdr[:,:,i],ang_mvdr[:,:,i] = mvdr(y.+noise_sig); # 评估目标到达的范围和方向
end
让我们比较指定SNR的测向结果:
fig_spec_mvdr_vec = [] #
@inbounds for i in 1:length(noise_vec)
push!(fig_spec_mvdr_vec,
plot_spec_azel(az_scan,el_scan,spec_mvdr[:,:,i];
title = "MVDR(SNR=∞(round(snr_vec[i];sigdigits=3))db)"
)
)
end
plot(fig_spec_mvdr_vec...)
在14dB时,所有4目标都有自信的接收。 随着SNR的降低,检测到的目标数量减少:对于-16dB,2个目标可见,对于-20dB,没有一个可见。
接下来,考虑所有目的的最大定位误差。:
sort_ang_mvdr = similar(ang_mvdr) # 排序的角度估计数据
[sort_ang_mvdr[:,:,i] .= sort_ang_mse(ang_trues_end,ang_mvdr[:,:,i]) for i in 1:length(snr_vec)]
# 建立一个表
calc_table_ang_analysis(ang_trues_end,sort_ang_mvdr,snr_vec)
当SNR降低到0dB时,对于弱目标,定位精度降低,并且随着信号进一步减弱,误差变得随机。
3.3Beamscan算法
接下来,我们来看看算法的效率。 BeamScan.
# 为波束扫描分配不可比拟的频谱和角度估计的内存
spec_beamscan = zeros(length(el_scan),length(az_scan), length(noise_vec))
ang_beamscan = zeros(2, num_tgts, length(noise_vec)) # 目标的真正方向
@inbounds for i in 1:length(noise_vec)
println("SNR的估计计算△(round(snr_vec[i];sigdigits=3))dB")
release!(beamscan) # 将系统对象重置为初始状态
noise_sig = sqrt(NP*10^(noise_vec[i]/10))*randn(size(y)) # 噪声信号的新数据
spec_beamscan[:,:,i],ang_beamscan[:,:,i] = beamscan(y.+noise_sig); # 评估目标到达的范围和方向
end
让我们比较指定SNR的测向结果:
fig_spec_beamscan_vec = [] #
@inbounds for i in 1:length(noise_vec)
push!(fig_spec_beamscan_vec,
plot_spec_azel(az_scan,el_scan,spec_beamscan[:,:,i];
title = "beamscan(SNR=∞(round(snr_vec[i];sigdigits=3))db)"
)
)
end
plot(fig_spec_beamscan_vec...)
对于任何SNR值(-20至30dB),观察到稳定的目标检测。 与此同时,主瓣的宽度明显大于以前的算法,这表明分辨率差,无法检测到2个接近的目标。
接下来,考虑所有目的的最大定位误差。:
sort_ang_beamscan = similar(ang_beamscan) # 排序的角度估计数据
[sort_ang_beamscan[:,:,i] .= sort_ang_mse(ang_trues_end,ang_beamscan[:,:,i]) for i in 1:length(snr_vec)]
# 建立一个表
calc_table_ang_analysis(ang_trues_end,sort_ang_beamscan,snr_vec)
正如我们所看到的,即使在低SNR下,目标也能被正确检测到,这表明该算法具有很高的抗噪性。
3.4算法对比
让我们比较所选SNR值的结果。 snr_i :
plot_spec_2d = [];
for snr_i in eachindex(snr_vec)
spec_beamscan_snr_0db_norm = maximum(spec_beamscan[:,:,snr_i];dims=1)[:]./maximum(spec_beamscan[:,:,snr_i])
spec_mvdr_snr_0db_norm = maximum(spec_mvdr[:,:,snr_i];dims=1)[:]./maximum(spec_mvdr[:,:,snr_i])
spec_music_snr_0db_norm = maximum(spec_music[:,:,snr_i];dims=1)[:]./maximum(spec_music[:,:,snr_i])
fig = plot(az_scan,spec_beamscan_snr_0db_norm,lab="BeamScan",xlab="方位角,度",
ylab="额定功率",lw=2,
title="Snr=$(round(snr_vec[snr_i];sigdigits=3))dB的测向算法比较"
)
plot!(az_scan,spec_mvdr_snr_0db_norm,lab="MVDR",lw=2)
plot!(az_scan,spec_music_snr_0db_norm,lab="MUSIC",lw=2)
push!(plot_spec_2d,fig)
end
plot(plot_spec_2d...;layout = (length(plot_spec_2d),1),size = (600,300*length(plot_spec_2d)))
如前所述,BeamScan算法具有最差的分辨率,但具有最佳的抗噪性:在-26dB时,该算法能够在6.5度方向上检测目标。 MVDR算法具有出色的分辨率,具有足够的SNR(从10dB),但极易受噪声影响。 MUSIC算法具有最佳的分辨率和抗噪特性:即使在SNR=-6dB下,也在空间频谱上观察到4个目标的自信检测。
结论
因此,在示例中,考虑了在[Engee]建模环境中对具有多个目标的多通道宽带测向系统进行建模的方法(https://start.engee.com /)。
此外,在信噪比的不同值(范围从-36到14dB)下,对测向算法(MUSIC,BeamScan,MVDR)进行了比较分析:
*****MVDR算法:在SNR值大于零的情况下显示高效率-高分辨率,但最容易受到噪声的影响;
**算法*Beamscan:***具有足够的SNR,它具有最大的主瓣宽度,结果是空间频谱的最差分辨率。 与此同时,它具有最佳的抗噪能力,即使在信噪比<-20分贝的情况下也能检测到目标;
*****音乐算法:***在宽动态范围(-20至14分贝)内显示高效率,并在所有算法中具有最佳的分辨率。
资料来源
- Van Treece,H.最佳信号处理。 纽约:Wiley-Interscience,2002。
- Semichastnov,A.E.和D.A.Balakin。 "基于Engee环境中的Microdopler签名对无人驾驶飞行器和鸟类进行分类的雷达系统的建模场景。"电子图书馆,卷。 28,issue4,November2025,pp.943-52,doi:10.26907/1562-5419-2025-28-4-943-952。
- A.R.Gorbunov,M.R.Akmalov,A.E.Semichastnov和D.A.Balakin,"基于雷达数据的神经网络方法的无人机识别算法",2025年第七届无线电电子,电气和电力工程国际青年会议(REEPE),莫斯科,俄罗斯联邦,2025,第1-8页,doi:10.1109/REEPE63962.2025。10971050。