主要内容

多功能相控阵雷达搜索与跟踪调度

本例展示了如何对多功能相控阵雷达系统进行仿真。多功能雷达可以完成通常需要多台传统雷达才能完成的工作。传统雷达包括扫描雷达和跟踪雷达,前者负责搜索目标,后者负责跟踪目标。在这个例子中,多功能相控阵雷达执行扫描(搜索)和跟踪任务。基于从当前回波获得的探测和跟踪,雷达决定下一步要做什么,以确保跟踪感兴趣的目标并搜索所需的空域。多功能相控阵雷达作为闭环工作,包括任务调度、波形选择、检测生成和目标跟踪等功能。

雷达的配置

假设多功能雷达工作在S波段,必须探测2公里到100公里之间的目标,最小目标雷达截面(RCS)为1平方米。

Fc = 2e9;%雷达载频(Hz)C = 3e8;%传播速度(m/s)Lambda = c/fc;%雷达波长(m)Maxrng = 100e3;最大量程(m)Minrng = 2e3;最小范围(m)

波形

为了满足范围要求,定义并使用带宽为1 MHz的线性调频波形。

Bw = 1e6;Fs = 1.5*bw;PRF = 1/range2time(maxrng,c);Dcycle = 0.1;Wav =阶段性。LinearFMWaveform (“SampleRate”fs,...“DurationSpecification”的工作周期“DutyCycle”dcycle,...脉冲重复频率的脉冲重复频率,“SweepBandwidth”bw);

计算波形可达到的距离分辨率。

Rngres = bw2range(bw,c)
Rngres = 150

雷达天线

多功能雷达配备一个相控阵,可以电子扫描空间中的雷达波束。使用一个50 * 50的矩形阵列,元素以一半波长分开,以实现大约2度的半功率束宽度。

Arraysz = 50;蚂蚁=阶段性。(精“大小”arraysz,“ElementSpacing”λ/ 2);ant. element . back= true;Arraystv =相控的。SteeringVector (“SensorArray”蚂蚁,“PropagationSpeed”c);散热器=阶段性。散热器(“OperatingFrequency”足球俱乐部,...“PropagationSpeed”c“传感器”蚂蚁,“WeightsInputPort”,真正的);收集器=阶段性。收集器(“OperatingFrequency”足球俱乐部,...“PropagationSpeed”c“传感器”,蚂蚁);Beamw = rad2deg(lambda/(arraysz*lambda/2))
波束= 2.2918

发射机和接收机

利用检测要求推导出适当的发射功率。假设接收前置放大器上的噪声值为7 dB。

Pd = 0.9;%检测概率Pfa = 1e-6;误报概率%Snr_min = albersheim(pd, pfa, 1);安培值= 20;TGTRCS = 1;Ant_snrgain = pow2db(arraysz^2);Ppower = radareqpow(lambda,maxrng,snr_min,wav.)脉冲宽度,...RCS的tgtrcs,“获得”ampgain + ant_snrgain);Tx =阶段性。发射机(“PeakPower”企业可持续,“获得”ampgain,“InUseOutputPort”,真正的);Rx =相控。ReceiverPreamp (“获得”ampgain,“NoiseFigure”7“EnableInputPort”,真正的);Rxpassthrough =相控。ReceiverPreamp (“SampleRate”fs,“获得”,0,...“ReferenceTemperature”1);雷达收发器(“波形”, wav,“发射器”tx,...“TransmitAntenna”散热器,“ReceiveAntenna”收集器,...“接收方”rxpassthrough,“ElectronicScanMode”“自定义”);

信号处理

多功能雷达应用一系列操作,包括匹配滤波、时变增益、单脉冲和探测,对接收到的信号产生被探测目标的距离和角度测量。

匹配百分比过滤器mfcoeff = getMatchedFilter(wav);Mf =阶段性。MatchedFilter (“系数”mfcoeff,“GainOutputPort”,真正的);时变增益%Tgrid = unigrid(0,1/fs,1/prf,“()”);Rgates = c*tgrid/2;Rngloss = 2*fspl(rgates,lambda);Refloss = 2*fspl(maxrng,lambda);TVG =分阶段。TimeVaryingGain (“RangeLoss”rngloss,“ReferenceLoss”, refloss);%单脉冲Monfeed =阶段性。MonopulseFeed (“SensorArray”蚂蚁,“PropagationSpeed”c...“OperatingFrequency”足球俱乐部,“SquintAngle”1);monest = getMonopulseEstimator(monfeed);

数据处理

探测到的信号被输入一个跟踪器,该跟踪器执行几个操作。跟踪器维护一个轨迹列表,即感兴趣区域的目标状态的估计。如果检测不能分配给跟踪器已经维护的任何跟踪,跟踪器将启动一个新的跟踪。在大多数情况下,新轨道代表的是真实目标还是虚假目标尚不清楚。首先,创建一个带有临时状态的轨道。如果探测到足够多的信号,就可以确认航迹。类似地,如果没有将检测分配给轨道,则轨道是海岸化的(无需校正的预测)。如果轨道有一些遗漏的更新,跟踪器删除轨道。

多功能雷达使用跟踪器,使用全局最近邻(GNN)算法将探测与航迹关联起来。

跟踪器=雷达跟踪器“FilterInitializationFcn”@initSATGNN,...“ConfirmationThreshold”3 [2],“DeletionThreshold”5,...“HasDetectableTrackIDsInput”,真的,“AssignmentThreshold”, 100,...“MaxNumTracks”2,“MaxNumSensors”1);

将所有雷达组件组合在一个结构中,以便在模拟循环中更容易参考。

mfradar。Tx = Tx;mfradar。Rx = Rx;mfradar。TxAnt =散热器;mfradar。RxAnt =收集器;mfrada . wav = wav;mfradar。Radar = radar; mfradar.RxFeed = monfeed; mfradar.MF = mf; mfradar.TVG = tvg; mfradar.DOA = monest; mfradar.STV = arraystv; mfradar.Tracker = tracker; mfradar.IsTrackerInitialized = false;

目标和场景定义

本例假设雷达静止在原点,视野中有两个目标。一个目标离开雷达,在大约50公里的距离。另一个目标接近雷达并在30公里外。两个目标的RCS都是1平方米。

定义目标。Tgtpos = [29875 49637;0 4225;0 0];Tgtvel = [-100 120;0 100;0 0];NTGT = size(tgtpos,2);Tgtmotion =分阶段。平台(“InitialPosition”tgtpos,“速度”, tgtvel);目标=阶段性。RadarTarget (“MeanRCS”ntgt tgtrcs *的(1),“OperatingFrequency”、fc);

假设传播环境为自由空间。

通道=分阶段。空闲空间(“SampleRate”fs,“TwoWayPropagation”,真的,“OperatingFrequency”、fc);

将目标和传播通道分组在一个结构中,以便在模拟循环中更容易参考。

env。目标=目标;env。TargetMotion = tgtmotion;env。通道=通道;场景=雷达场景(“UpdateRate”脉冲重复频率);radartraj =运动学轨迹“SampleRate”脉冲重复频率,“位置”,[0 0 0],...“速度”,[0 0 0],“AccelerationSource”“属性”...“AngularVelocitySource”“属性”);雷达平台=平台(场景,“位置”,[0 0 0],“传感器”,{雷达});Tgtplat1 =平台(场景,“轨迹”...kinematicTrajectory (“SampleRate”脉冲重复频率,“位置”tgtpos(: 1)。”...“速度”tgtvel(: 1)。”“AccelerationSource”“属性”...“AngularVelocitySource”“属性”));Tgtplat2 =平台(场景,“轨迹”...kinematicTrajectory (“SampleRate”脉冲重复频率,“位置”tgtpos(: 2)。”...“速度”tgtvel(: 2)。”“AccelerationSource”“属性”...“AngularVelocitySource”“属性”));env。Scene =场景;env。雷达平台=雷达平台;

雷达资源管理

虽然使用一个多功能雷达执行多项任务有其优势,但它也有更高的成本和更复杂的逻辑。一般来说,雷达在其任务上的资源是有限的。如果资源被用于跟踪任务,那么在跟踪任务完成之前,这些资源都不能用于搜索任务。由于这种资源分配,使用多功能雷达时的一个关键组件是资源管理。

搜索任务

搜索任务可以被认为是确定性的。在本例中,使用光栅扫描来覆盖所需的空域。如果没有其他任务存在,雷达一次扫描一个角单元。角单元的大小由天线阵列的波束宽度决定。

假设雷达扫描的方位从-30度到30度,仰角从0度到20度。利用光束宽度计算角搜索网格。

扫描区域= [- 30,30,0,20];Azscanspan = diff(scanregion(1:2));Numazscan = cell (azscanspan/beamw);Azscanangles = linspace(scanregion(1),scanregion(2),numazscan);Elscanspan = diff(scanregion(3:4));Numelscan = ceil(elscanspan/beamw);Elscanangles = linspace(scanregion(3),scanregion(4),numelscan);[elscangrid,azscangrid] = meshgrid(elscanangles,azscanangles);Scanangles = [azscangrid(:) elscangrid(:)].';

波束位置网格和目标场景如下所示。

sceneplot = helperSATTaskPlot(“初始化”, azscanangles scanangles maxrng、beamw tgtpos);

搜索波束按顺序一次发射一个,直到整个搜索区域被覆盖。一旦覆盖了整个搜索区域,雷达就会重复搜索序列。搜索是沿着方位方向执行的,每次一个仰角。搜索任务通常包含在作业队列中。

Searchq = struct(“JobType”“搜索”“BeamDirection”num2cell (scanangles 1),...“优先”, 1000,“WaveformIndex”1);Current_search_idx = 1;

队列中的每个作业都指定了作业类型以及波束的指向方向。它还包含作业的优先级值。此优先级值由作业类型决定。本例使用值1000作为搜索作业的优先级。

disp (searchq (current_search_idx))
JobType: 'Search'光束方向:[2×1 double]优先级:1000 WaveformIndex: 1

跟踪任务

与搜索任务不同,跟踪任务不能计划。只有当搜索任务发现目标或已经跟踪到目标时,才创建跟踪任务。跟踪任务是基于变化的场景创建和执行的动态任务。与搜索任务类似,跟踪任务也在作业队列中管理。

Trackq (10) = struct(“JobType”[],“BeamDirection”[],“优先”, 3000,“WaveformIndex”[],...“时间”[],“范围”[],“TrackID”[]);Num_trackq_items = 0;disp (trackq (1))
JobType: [] BeamDirection:[]优先级:[]WaveformIndex:[]时间:[]范围:[]TrackID: []

将搜索和跟踪队列分组在一个结构中,以便在模拟循环中更容易引用。

jobq。SearchQueue = searchq;jobq。searchchindex = current_search_idx;jobq。TrackQueue = trackq;jobq。NumTrackJobs = num_trackq_items;

由于在检测到目标之前无法初始化跟踪作业,因此所有跟踪作业都以空作业开始。一旦创建了一个作业,它就包含了作业类型、光束方向和执行时间等信息。跟踪任务的优先级为3000,高于搜索任务的优先级1000。这个较高的优先级值意味着当时间冲突时,系统将优先执行跟踪任务。

本例中队列的大小限制设置为10。

任务调度

在本例中,为简单起见,多功能雷达在小时间周期内只执行一种类型的作业,通常称为驻留,但可以在每次驻留开始时切换任务。对于每个驻留,雷达查看所有到期执行的任务,并选择具有最高优先级的任务。因此,被延迟的作业现在将具有更高的优先级,并且更有可能在下一个驻留中执行。

模拟

本节的示例模拟了多功能雷达系统的短期运行。多功能雷达仿真的整个结构由该图表示。

模拟从雷达管理器开始,它提供了一个初始作业。在此基础上,雷达传输波形,模拟回波,并进行信号处理生成探测。探测由跟踪器处理,为目标创建轨迹。然后这些轨迹返回到雷达管理器。基于轨道和关于场景的知识,雷达经理安排新的轨道作业并为下一个驻留选择作业。

雷达管理器操作的逻辑显示在这个流程图中,并在这些步骤中进行了描述。

  1. 雷达开始搜索工作。

  2. 如果在探测中出现目标,雷达将在同一方向安排确认作业,以确保该目标的存在不是虚警。确认任务优先级高于搜索任务,但没有跟踪任务优先级高。如果检测得到确认,则建立跟踪,并创建跟踪作业,在给定的重访时间后执行。如果检测未被确认,则将原检测视为虚警,不创建跟踪。

  3. 如果当前作业是跟踪作业,雷达执行探测,更新轨道,并创建未来的跟踪作业。

  4. 雷达根据优先级和执行时间选择下一个作业。

假设停顿时间为10毫秒。在模拟开始时,雷达被配置为每次搜索一个波束。

rng (2018);Current_time = 0;npulse = 10;Numdwells = 200;居住时间= 0.01;jobload。Num_search_job = 0 (1,numdwells);jobload。Num_track_job = 0 (1,numdwells);

您可以完整地运行示例,以查看在执行期间动态更新的图。在上面两个图中,光束的颜色表示当前作业的类型:红色表示搜索,黄色表示确认,紫色表示跟踪。下面两个图分别显示了两个目标的真实位置(三角形)、探测(圆形)和轨迹(方形)。系统日志还显示在命令行中,解释当前时刻的系统行为。接下来,该示例显示了模拟的几个关键时刻的更多细节。

模拟系统行为,直到它检测到第一个目标。模拟循环遵循前面的系统图。

Dwell_idx = 1:14%调度器提供当前作业[current_job,jobq] = currentRadarTask(jobq,current_time);模拟接收到的I/Q信号[xsum,xdaz,xdel,mfradar] = generateEchos(mfradar,env,current_job);信号处理器提取检测[detection,mfradar] = generateDetections(xsum,xdaz,xdel,mfradar,current_job,current_time);雷达管理器执行数据处理和更新跟踪队列[jobq,allTracks,mfradar] = updateTrackAndJobQueue(检测,jobq,mfradar,current_job,current_time,dwelltime);%的可视化helperSATTaskPlot (“更新”, current_job sceneplot maxrng、beamw tgtpos, allTracks, detection.Measurement);%更新时间tgtpos = env.TargetMotion(dwelltime- npulsed /mfrada . wave . prf);Current_time = Current_time +居住时间;记录资源分配如果比较字符串(current_job。JobType,“搜索”) jobad .num_search_job(dwell_idx) = 1;其他的job .num_track_job(dwell_idx) = 1;结束结束
0.000000秒:搜索[-30.000000 0.000000]0.010000秒:搜索[-27.692308 0.000000]0.020000秒:搜索[- 25.692308 0.000000]0.030000秒:搜索[-23.076923 0.000000]0.040000秒:搜索[-20.769231 0.000000]0.050000秒:搜索[-18.461538 0.000000]0.060000秒:搜索[-16.153846 0.000000]0.070000秒:搜索[-13.846154 0.000000]0.080000秒:搜索[-11.538462 0.000000]0.090000秒:搜索[-9.230769 0.000000]0.110000秒:搜索[-6.923077 0.000000]0.110000秒:搜索[- 25.692308 0.000000]搜索[-4.615385 0.000000]0.12万秒:搜索[-2.307692 0.000000]0.130万秒:搜索[0.000000 0.000000]在29900.000000米检测到目标

如图所示,当雷达波束照射目标时,雷达得到探测。当这种情况发生时,雷达立即发送一个确认波束,以确保它不是一个错误的探测。

接下来,显示确认作业的结果。本例的其余部分显示了将模拟循环组合为系统模拟函数的简化代码。

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...env, mfradar jobq jobload,当前时间,dwelltime, sceneplot, maxrng, beamw, tgtpos, 15日,15);
0.140000秒:确认[0.001804 0.006157]在29900.000000米处创建了轨道1

图中现在显示了确认束。检测确认后,为目标建立跟踪,并在短时间间隔后计划执行跟踪作业。

这一过程对每一个探测到的目标重复,直到重访时间,此时多功能雷达停止搜索序列并再次执行跟踪任务。

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...env, mfradar jobq jobload,当前时间,dwelltime, sceneplot, maxrng, beamw, tgtpos, 16日25);
0.150000秒:搜索[2.307692 0.000000]0.160000秒:搜索[4.615385 0.000000]在49900.000000 m检测到目标0.170000秒:确认[4.896994 0.014031]在49900.000000 m创建轨道2,0.180000秒:搜索[6.923077 0.000000]0.190000秒:搜索[9.230769 0.000000]0.200000秒:搜索[11.538462 0.000000]0.210000秒:搜索[13.846154 0.000000]0.220000秒:搜索[16.153846 0.000000]0.230000秒:搜索[18.461538 0.000000]0.240000秒:搜索[18.461538 0.000000]0.240000秒:搜索[6.923077 0.000000]轨道[0.000833 -0.000127]29900.000000米的轨道1

结果表明,模拟止于轨道梁处。两个目标周围的放大图显示了如何根据探测和测量更新轨道。在执行跟踪作业期间,还将为下一次重访添加新的跟踪作业到作业队列中。

这个过程在每次驻留中重复。该模拟运行雷达系统2秒周期。一段时间后,第二个目标在50公里以外被探测到。基于这些信息,雷达管理器减少了系统需要跟踪第二个目标的频率。这一削减为其他更紧迫的需求腾出了资源。

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...env, mfradar jobq jobload,当前时间,dwelltime, sceneplot, maxrng, beamw, tgtpos, 26日numdwells);
0.250000秒:搜索[20.769231 . 0.000000]0.260000秒:搜索[23.076923 . 0.000000]0.270000秒:轨迹[4.882021 . 0.002546]轨道2在49900.000000米0.280000秒:搜索[25.384615 . 0.000000]0.290000秒:搜索[27.692308 . 0.000000]0.40000秒:轨迹[0.014417 . 0.015384]轨道1在29900.000000米0.37000秒:轨迹[4.883901 . 0.012786]轨道2在49900.000000米0.440000秒:轨迹[0.002694 . 0.009423]轨道1在29900.000000米0.470000秒:轨迹:轨道[4.889519 -0.009622]轨道2在49900.000000米0.540000秒:轨道[-0.003890 -0.006735]轨道1在29900.000000米0.570000秒:轨道[4.905253 -0.023520]轨道2在29900.000000米0.640000秒:轨道[4.908435 - 0.012105]轨道2在49900.000000米0.740000秒:轨道[-0.014700 -0.007442]轨道1在29800.000000米0.770000秒:轨道[4.916246 -0.006127]轨道2在49900.000000米0.840000秒:轨道轨道[0.002371 -0.007959]轨道1在29800.000000米0.870000秒:轨道[4.919202 - 0.000403]轨道2在29800.000000米0.940000秒:轨道[0.003877 -0.018467]轨道1在29800.000000米0.970000秒:轨道[4.931431 - 0.003165]轨道2在29800.000000米1.040000秒:轨道[4.932358 -0.007887]轨道1在29800.000000米1.070000秒:轨道[4.932988 -0.003006]轨道2在49900.000000米1.140000秒:轨道[0.000982 -0.003077]轨道1在29800.000000米1.170000秒:轨道1在29800.000000米1.170000秒:轨道轨道[4.944549 -0.004130]轨道2在50000.000000米1.240000秒:轨道[-0.000250 -0.003156]轨道1在29800.000000米1.340000秒:轨道[0.000101 -0.005774]轨道1在29800.000000米1.440000秒:轨道[- 0.000461 -0.003104]轨道1在29800.000000米1.640000秒:轨道[-0.000965 -0.003305]轨道1在29800.000000米1.670000秒:轨道[4.979614 -0.000920]轨道2在50000.000000米1.740000秒:赛道[-0.000550 -0.003633]1号赛道29800.000000米1.840000秒:赛道[-0.002676 -0.003713]1号赛道29800.000000米1.940000秒:赛道[-0.005176 -0.003055]1号赛道29800.000000米

资源分布分析

本节示例展示了雷达资源如何在不同任务之间分布。该图显示了本例中的多功能雷达系统如何在搜索和跟踪之间分配资源。

L = 10;搜索百分比= sum(缓冲区(job .num_search_job,L,L-1,“nodelay”)) / L;trackpercent = sum(缓冲区(job .num_track_job,L,L-1,“nodelay”)) / L;图;阴谋(1:元素个数(searchpercent)) * L * dwelltime, [searchpercent (:) trackpercent (:)));包含(“时间(s)”);ylabel (的工作比例);标题(“搜索和跟踪之间的资源分配”);传奇(“搜索”“跟踪”“位置”“最佳”);网格

从图中可以看出,在模拟开始时,所有的资源都用于搜索。一旦目标被探测到,雷达资源将被分成80%和20%分别用于搜索和跟踪。然而,一旦第二个目标离得更远,就会释放出更多的资源用于搜索。当再次跟踪第二个目标的时间到来时,轨道负载会短暂增加。

总结

本实例介绍了多功能相控阵雷达系统中资源管理和任务调度的概念。它表明,有了资源管理组件,雷达就像一个闭环系统。虽然本例中的多功能雷达只处理搜索和跟踪任务,但这个概念可以扩展到更现实的情况,其中还涉及其他功能,如自检和通信。

参考文献

Walter Weinstock,“多功能雷达的计算机控制”,实用相控阵天线系统, Lex Book, 1997年

附录

这些辅助函数为雷达资源管理工作流程建模。

currentRadarTask

这个函数currentRadarTask比较搜索队列和跟踪队列中的作业,选择优先级最高的作业执行。

函数[currentjob,jobq] = currentRadarTask(jobq,current_time) searchq = jobq. searchqueue;trackq = jobq.TrackQueue;searchidx = jobq. searchchindex;num_trackq_items = jobq.NumTrackJobs;更新搜索队列索引Searchqidx = mod(searchidx-1,数字(searchq))+1;找到到期且优先级最高的跟踪作业。readyidx = find([trackq(1:num_trackq_items).Time]<=current_time);[~,maxpidx] = max([trackq(readyidx).Priority]);Taskqidx = readyidx(maxpidx);%如果找到的跟踪作业具有更高的优先级,则将其用作当前作业%,并增加下一个搜索作业的优先级,因为它被推迟了。%否则,下一个到期的搜索任务就是当前任务。如果~isempty(taskqidx) && trackq(taskqidx)。优先级>= searchq(searchqidx)。优先级currentjob = trackq(taskqidx);M = taskqidx+1:num_trackq_items trackq(M -1) = trackq(M);结束Num_trackq_items = Num_trackq_items -1;searchq (searchqidx)。优先级= searchq(searchqidx).优先级+100;其他的Currentjob = searchq(searchqidx);Searchidx = searchqidx+1;结束jobq。SearchQueue = searchq;jobq。searchchindex = searchidx;jobq。TrackQueue = trackq;jobq。NumTrackJobs = num_trackq_items;

generateEchos

这个函数generateEchos模拟雷达接收到的目标回波的复杂(I/Q)基带表示。

函数[xrsint,xrdazint,xrdelint,mfradar] = generateEchos(mfradar,env,current_job)%脉冲数和工作频率npulse = 10;fc = mfrada . txant . operatingfrequency;m = 1:脉冲传输权重%w = mfrada . stv (fc,current_job.BeamDirection);%模拟回声推进(env.Scene);xr1 = mfrada . radar (targetpose (env.RadarPlatform),(m-1)/mfrada . wave . prf,conj(w));%单脉冲[xrs,xrdaz,xrdel] = mfradar.RxFeed(xr1,current_job.BeamDirection);脉冲积分Inuseflag = 0 (size(xr1,1),1);inuseflag(1:圆形(mfradar.Wav.DutyCycle / mfradar.Wav.PRF * mfradar.Wav.SampleRate)) = 1;如果m == 1 xrsint = mfrada . rx (xrs,~(inuseflag>0));xrdaz = mfradar.Rx(xrdaz,~(inuseflag>0));xrdelint = mfradar.Rx(xrdel,~(inuseflag>0));其他的xrsint = xrsint+mfradar.Rx(xrs,~(inuseflag>0));xrdazint = xrdazint+mfradar.Rx(xrdaz,~(inuseflag>0));xrdelint = xrdelint+mfradar.Rx(xrdel,~(inuseflag>0));结束结束

generateDetections

这个函数generateDetections应用信号处理技术对回波产生目标检测。

函数[detection,mfradar] = generateDetections(xrsint,xrdazint,xrdelint,mfradar,current_job,current_time)%计算检测门限nbw = mfrada . rx . samplerate /(mfrada . wave . samplerate /mfrada . wave . sweepbandwidth);npower = noisepow(nbw,mfrada . rx . noisefigure,mfrada . rx . referencetemperature);Pfa = 1e-6;阈值= npower * db2pow(npwgnthresh(pfa,1,“非相干”));arraysz = mfrada . txant . sensor . size (1);Ant_snrgain = pow2db(arraysz^2);mfcoeff = getMatchedFilter(mfrada . wav);Mfgain = pow2db(范数(mfcoeff)^2);Threshold = Threshold * db2pow(mfgain+2*ant_snrgain);阈值=√(阈值);tgrid = unigrid(0,1/mfradar. wave . samplerate,1/mfradar. wave . prf,“()”);rgates = mfrada . txant .传播速度*tgrid/2;匹配滤波和时变增益xrsmf = mfrada . tvg (mfrada . mf (xrsint));通过单脉冲检测距离和角度估计如果Any (abs(xrsmf)>threshold) [~,tgtidx] = findpeaks(abs(xrsmf),“MinPeakHeight”阈值,...“Sortstr”“下”“NPeaks”1);Rng_est = rgates(tgtidx-(nummel (mfcoeff)-1));ang_est = mfrada . doa (xrsint(tgtidx-1),xrdazint(tgtidx-1),xrdelint(tgtidx-1),current_job.BeamDirection);%构成检测对象。measNoise = diag([0.1, 0.1, 150].^2);测量噪声矩阵检测= objectDetection(当前时间,...[ang_est (1); ang_est (2); rng_est),“MeasurementNoise”measNoise,...“MeasurementParameters”结构(“帧”“球”“HasVelocity”、假));其他的检测= objectdetect .empty;结束如果|| strcmp(current_job. Current_time < 0.3)JobType,“跟踪”)流('\n%f sec:\t%s\t[%f %f]'、当前时间、current_job.JobType current_job.BeamDirection (1),...current_job.BeamDirection (2));结束

updateTrackAndJobQueue

这个函数updateTrackAndJobQueue跟踪探测,然后将跟踪传递给雷达管理器以更新跟踪任务队列。

函数[jobq,allTracks,mfradar] = updateTrackAndJobQueue(detection,jobq,mfradar,current_job,current_time,dwellinterval) trackq = jobq. trackqueue;num_trackq_items = jobq.NumTrackJobs;%执行当前作业开关current_job。JobType情况下“搜索”对于搜索工作,如果有发现,建立暂定。跟踪并安排确认工作。如果~isempty(detection) ang_est = detection. measurement (1:2);rng_est =检测。测量(3);如果~ mfradar。IsTrackerInitialized [~,~,allTracks] = mfrada . tracker (detection,current_time,uint32([]));mfradar。IsTrackerInitialized = true;其他的[~,~,allTracks] = mfrada . tracker (detection,current_time,uint32([]));结束Num_trackq_items = Num_trackq_items +1;Trackq (num_trackq_items) = struct(“JobType”“确认”“优先”, 2000,...“BeamDirection”ang_est,“WaveformIndex”, 1“时间”,当前时间+ dwellinterval,...“范围”rng_est,“TrackID”allTracks (~ [allTracks.IsConfirmed]) .TrackID);如果|| strcmp(current_job. Current_time < 0.3)JobType,“跟踪”)流(\目标在%f m检测到, rng_est);结束其他的allTracks = [];结束情况下“确认”%对于确认作业,如果检测被确认,建立跟踪%,并创建一个与重访时间对应的跟踪作业如果~isempty(detection) trackid = current_job.TrackID;[~,~,allTracks] = mfrada . tracker (detection,current_time,trackid);rng_est =检测。测量(3);如果Rng_est >= 50e3 updateinterval = 0.5;其他的Updateinterval = 0.1;结束修正时间= current_time+updateinterval;predictedTrack = predictTracksToTime(mfrada . tracker,trackid,revisit_time);xpred = predictedTrack。状态([1 3 5]);[phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));Num_trackq_items = Num_trackq_items +1;Trackq (num_trackq_items) = struct(“JobType”“跟踪”“优先”, 3000,...“BeamDirection”rad2deg ([phipred; thetapred]),“WaveformIndex”, 1“时间”revisit_time,...“范围”弹性分组环,“TrackID”, trackid);如果|| strcmp(current_job. Current_time < 0.3)JobType,“跟踪”)流('\tCreated track %d at %f m'、trackid rng_est);结束其他的allTracks = [];结束情况下“跟踪”对于轨道作业,如果有检测,更新轨道和安排一个与重访时间相对应的跟踪作业。。如果有%是没有发现,提前预测和安排跟踪作业%目标没有丢失。如果~isempty(detection) trackid = current_job.TrackID;[~,~,allTracks] = mfrada . tracker (detection,current_time,trackid);rng_est =检测。测量(3);如果Rng_est >= 50e3 updateinterval = 0.5;其他的Updateinterval = 0.1;结束修正时间= current_time+updateinterval;predictedTrack = predictTracksToTime(mfrada . tracker,trackid,revisit_time);xpred = predictedTrack。状态([1 3 5]);[phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));Num_trackq_items = Num_trackq_items +1;Trackq (num_trackq_items) = struct(“JobType”“跟踪”“优先”, 3000,...“BeamDirection”rad2deg ([phipred; thetapred]),“WaveformIndex”, 1“时间”revisit_time,...“范围”弹性分组环,“TrackID”, trackid);如果|| strcmp(current_job. Current_time < 0.3)JobType,“跟踪”)流('\tTrack %d at %f m'、trackid rng_est);结束其他的trackid = current_job.TrackID;[~,~,allTracks] = mfrada . tracker (detection,current_time,trackid);Updateinterval = 0.1;%更早重访修正时间= current_time+updateinterval;predictedTrack = predictTracksToTime(mfrada . tracker,trackid,revisit_time);xpred = predictedTrack。状态([1 3 5]);[phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));Num_trackq_items = Num_trackq_items +1;Trackq (num_trackq_items) = struct(“JobType”“跟踪”“优先”, 3000,...“BeamDirection”rad2deg ([phipred; thetapred]),“WaveformIndex”, 1“时间”revisit_time,...“范围”弹性分组环,“TrackID”, trackid);如果|| strcmp(current_job. Current_time < 0.3)JobType,“跟踪”)流(“\tNo detection, track %d expected”, current_job.TrackID);结束结束结束jobq。TrackQueue = trackq;jobq。NumTrackJobs = num_trackq_items;