Engee 文档
Notebook

基于被动雷达的目标定位

此示例演示如何模拟无源雷达系统(雷达)的运行场景并确定信号传播延迟(**TDOA)的时间差估计值。**解决在存在大型目标(飞机)的情况下定位的问题。

这个例子是一系列本地化解决方案的第二部分。 第一部分致力于使用TOA(到达时间)算法进行小型定位的有源雷达方法objects.

导言

在雷达领域,基于从具有已知坐标的一组空间间隔的传感器获得的数据来定位目标的任务具有相当大的相关性。 为了解决这个问题,传统上使用基于信号的到达时间(TOA—到达时间)和到达时间差(TDOA—到达时间差)的测量的方法。

使用TDOA方法时必须使用多位置无源雷达系统。 在这种配置中,目标由单独的发射源(基站)照射,并且同步和分布式雷达被动地接收反射信号(见下图)。

在这样的系统中,探测信号的类型被认为是未知的。 与此同时,其他雷达站、蜂窝基站、电视广播塔和其他类似设施可以充当无源雷达系统的传输源。

Пассивный_радар_крутой.png

启用辅助功能

我们将对计算定位估计和定位方法可视化所需的函数进行初始化TOA/TDOA

In [ ]:
isdefined(Main,:init_func) || include("init.jl")
Out[0]:
true

1. 雷达运行情景的形成

让我们考虑使用具有已知位置的5个基于地面的雷达接收器,通过反向散射来自在Ku波段操作的异步发射器的单独塔的信号来定位航空目标。

In [ ]:
# 雷达参数
fc = 12e9 # Hz,载波频率
c = physconst("LightSpeed") # m/s,信号传播的速度
bw = 100e6 # Hz,信号带
fs = bw # Hz,采样率

# 接收和发送路径的参数
Pt = 10 # W、峰值功率
Gtx = 40 # dB,发射天线的增益
Grx = 40 # dB,接收天线的增益
NF = 2.9 # dB,接收路径的噪声系数

# 功能雷达节点的系统对象(CO)的形成
antenna = EngeePhased.IsotropicAntennaElement( # 具有各向同性天线元件
    BackBaffled=false # 考虑到天线底部的反向散射
) 
transmitter = EngeePhased.Transmitter( # 协变送器
    Gain=Gtx, # 发射机增益
    PeakPower=Pt # 峰值功率
)
radiator = EngeePhased.Radiator( # 共发射天线
    Sensor=antenna, # 天线元件的底部
    OperatingFrequency=fc # 天线载波频率
)
collector = EngeePhased.Collector( # 共接收天线
    Sensor=antenna, # 天线元件的底部
    OperatingFrequency=fc # 天线载波频率
)
receiver = EngeePhased.ReceiverPreamp(
    Gain=Grx, # 接收器增益
    NoiseFigure=NF, # 路径中的噪声因子
    SampleRate=fs # 采样率
)

# 建立共同目标
tgtrcs = 1000 # M^2,EPR目标
target = EngeePhased.RadarTarget(
    MeanRCS=tgtrcs, # 平均EPR值
    PropagationSpeed=c, # 传播的速度
    OperatingFrequency=fc # ZS载波频率
)

# 目标移动场景的模型
tgtpos = [80; 40; 110]; # [pos_x,pos_y,pos_z],m为初始位置向量
tgtvel = [50; 40; 0]; # [v_x,v_y,v_z],m/s速度矢量
tgtplatform = EngeePhased.Platform( # 运动的共同模式
    InitialPosition=tgtpos,  # 初始位置向量
    Velocity=tgtvel # 速度矢量
) 

# 雷达运动场景模型
radarpos = [ # m,初始位置
    0 300 100 200 150; 
    0 50 -200 300 100;
    0 -10 10 5 20
]

# 雷达运动场景模型
numRadar = size(radarpos,2) # 雷达数目
radarvel = zeros(3,numRadar) # [v_x,v_y,v_z][m/s],速度矢量
radarplatform = EngeePhased.Platform( # 雷达运动的协同模型
    InitialPosition=radarpos,  # 初始位置向量
    Velocity=radarvel # 速度矢量
);

# 基站模型
txpos = [-150; -100; 50] # 起始位置
txvel = [0; 0; 0] # 速度矢量
txplatform = EngeePhased.Platform(
    InitialPosition=txpos,
    Velocity=txvel
);

2. 形成相码操作(FCM)

[FKM信号](https://engee.com/helpcenter/stable/ru/so-phased/so-phase-coded-waveform.html )是另一种类型的雷达信号。 在相位码信号中可以使用几个相位码,例如,码"Zadoff—Chu"、码"*******"等。 让我们使用代码"Zadoff—Chu",其形成是使用系统对象实现的。 EngeePhased.PhaseCodedWaveform:

In [ ]:
# 相位调制信号的形成
N = 1024 # !!!每个脉冲的报告数(快速时间计数)
M = 8 # 脉冲数(慢时间计数)
numChip = 2^nextpow2(N)-1 # FKM信号码中的码片数
tchip = 1/bw # s,芯片的持续时间
tWave = numChip * tchip # 调制周期
prf = 1/tWave # Hz,脉冲重复率

# Configure the phase coded waveform as the maximum length sequence
pmcwWaveform = EngeePhased.PhaseCodedWaveform(
    Code="ZadoffChu", # 信号代码
    SampleRate=fs, # 采样率
    NumChips=numChip, # 芯片数量
    ChipWidth=tchip, # 芯片持续时间
    OutputFormat="Samples", # 输出格式-样本
    NumSamples=numChip  # 每个脉冲的芯片数
)
sig_pmcw = pmcwWaveform()*ones(1,M);
println("CC的尺寸:$(尺寸(sig_pmcw))")
Размерность ЗС: (1023, 8)
In [ ]:
plot_sig_and_spec(sig_pmcw[:,1];fs=fs,name_sig = "FKM")

3. 分销渠道

由于在当前场景中,雷达以被动模式运行,因此,不需要考虑双向传播。 让我们创建一个基站和接收雷达的分布环境模型。:

In [ ]:
 # 基站的信道模型
txchannel = EngeePhased.FreeSpace(
    PropagationSpeed=c,
    OperatingFrequency=fc,
    SampleRate=fs,
    TwoWayPropagation=false
)

# 目标雷达信道的类似模型
rxchannel = deepcopy(txchannel);

4. 无源雷达系统运行场景的计算

与前面的场景一样,我们将使用系统对象模拟无源雷达的操作场景,并计算变量中每个雷达的反射信号 X

In [ ]:
# 为所有雷达的反射信号分配内存
X = zeros(ComplexF64,size(sig_pmcw)...,numRadar)

# 基站信号
txsig = transmitter.(sig_pmcw)

for rad_i in 1:numRadar
    # 用于计算来自第I雷达的响应的存储器分配
    x = zeros(ComplexF64,size(sig_pmcw)...)

    # 场景模型
    for m in 1:M
        # 基站位置、雷达和目标的更新
        tx_pos,tx_vel = txplatform(tWave)
        radar_pos,radar_vel = radarplatform(tWave)
        tgt_pos,tgt_vel = tgtplatform(tWave)

        # 计算目标基站的视角
        _,txang = rangeangle(tgt_pos,tx_pos) 

        # 周三基站的辐射
        radtxsig = radiator(txsig[:,m],txang) 

        # 从基站到目标的信号传播
        txchansig = txchannel(radtxsig,tx_pos,tgt_pos,tx_vel,tgt_vel)

        # 来自目标的信号的反射
        tgtsig = target(txchansig)

        # 从目标到第I雷达的信号传播
        rxchansig = rxchannel(
            tgtsig,radar_pos[:,rad_i],tgt_pos, 
            radar_vel[:,rad_i],tgt_vel
        )

        # 计算雷达目标的视线角度
        _,rxang = rangeangle(radar_pos[:,rad_i],tgt_pos)

        # 第I雷达的反射信号的接收
        rxsig = collector(rxchansig,rxang)

        # 接收信号的预放大
        x[:,m] .= receiver(rxsig)
    end

    # 接收到的第I雷达信号的记录
    X[:,:,rad_i] .= x

    # 重置基站、雷达和目标的位置
    reset_plt!(txplatform,txpos)
    reset_plt!(radarplatform,radarpos)
    reset_plt!(tgtplatform,tgtpos)
end

5. 使用TDOA方法计算延迟估计

在计算了多位置无源雷达的反射信号后,我们将使用TDOA方法形成延迟测量。 让我们使用对象 TDOAEstimator 基于广义互相关算法(GCC)与相位变换(PHAT)来评估不同对雷达之间的TDOA

In [ ]:
# 创建TDOAEstimator对象
tdoaEstimator = TDOAEstimator(
    SampleRateSource="Input port", # 采样率方法(输入端口)
    VarianceOutputPort=true
)

# 估计数和延迟方差的计算
Y2, tdoa_var_2 = tdoaEstimator(X, fs);
println("每对雷达的延迟估计:△(round.(Y2.*1e9;sigdigits=6))ns")
Оценки задержек для каждой пары РЛС: [372.5 401.0 552.0 -39.0] нc

反射信号的SPM分析可以帮助我们更好地了解每对雷达对TDOA的估计精度。 我们将使用该功能显示一对雷达的TDOA评估结果 plotTDOASpectrum.

In [ ]:
plotTDOASpectrum(tdoaEstimator;
    AnchorPairIndex=1:4, # 雷达对号
    MaxDelay=1000e-9, # 最大延迟
    DinRange=60, # 动态范围
    OneSidedSpectrum=false # 建立单向频谱
)

获得估计值,延迟估计值的方差和已知雷达坐标后,我们使用函数[tdoaposest](https://www.mathworks.com/help/phased/ref/tdoaposest.html )来确定位置:

In [ ]:
tgtposest = tdoaposest(Y2,tdoa_var_2,radarpos)

println("评估$(轮)的位置。(tgtposest;sigdigits=6))m")
println("△(Tgtpos)m的真实位置")
Оценка положений [78.6879; 39.7331; 111.871;;] м
Истинное положение [80, 40, 110] м

下面是使用TDOA方法的本地化过程的可视化。:

In [ ]:
helperPlotTDOAPositions(c,Y2,tgtposest,radarpos,tgtpos,txpos)

此外,我们将使用该函数检查位置确定的准确性 RMSE:

In [ ]:
RMSE = rmse(tgtposest,tgtpos)
println("定位时间:$(round(RMSE;sigdigits=6))m")
СКО позиционирования: 1.32823 м

结论

该示例演示了在[Engee]仿真环境中用被动多位置雷达定位目标问题的解决方案(https://start.engee.com /)。 .

该系统是分析相位编码信号的多位置无源雷达系统。 为了解决定位问题,使用了估计延迟时间差的算法(TDOA),然后使用函数对目标进行定位 TDOAEstimatortdoaPosest.