利用聚类结果计算检出率、虚警率和doa角度估计均方误差把评估维度从“点”升维到“群/聚类”一架飞机在上帝视角下有 100 个真值散射点。雷达由于前级 CFAR 门限、遮挡或起伏只检出了其中 50 个点。如果按点对点匹配算出来的Pd50%P_d 50\%Pd​50%。但在战术上这架飞机已经被 100% 检出了所以需要的不是“点迹检出率”而是“目标检出率”。真实目标targets依然是上帝视角的碎点集。首先在函数内部对它进行一次“真值理想聚类”或者直接根据其原有的 TargetID第4列合成真实目标质心。检测目标data_cluster是刚刚聚类出来的成果带 Cluster_ID匹配逻辑拿检测质心去和真实质心做空间邻域匹配。簇检出ClusterPdP_dPd​如果某个真实飞机成功匹配到了至少一个检测簇则该飞机被判为“检出”。簇虚警ClusterPfaP_{fa}Pfa​如果某个检测簇在周围根本找不到任何一架真飞机它就是一个彻头彻尾的“虚警幽灵簇”。这个虚警簇个数除以噪声点总数得到虚警率。分子应该是虚警质心数还是虚警质心所在簇碎点总数分母应该是全格子数-目标真实质心数还是全格子数-目标全碎点数。AI说对于后级的点迹关联和数据跟踪算法来说它根本不在乎一个虚警里有 5 个点还是 10 个点反正已经被聚类融合成一个质心了。它最关心的是全场到底有几个虚假质心”冒充目标喂给了我。所以我写的分子是簇质心数分母用的全格子数-目标全碎点数。仅针对成功匹配上的目标计算测角误差。calculate_radar_metrics.mfunctionCfarDoaMetricscalculate_radar_metrics(targets, centroids, gates, total_bins)% CALCULATE_RADAR_METRICS 基于物理空间唯一性占位匹配计算雷达扩展目标的 Pd 和 Pfa % % 输入参数: % targets:[N_truth x4]矩阵上帝视角真值[Range, Vel, HorAngle, TargetID]% centroids:[num_clusters x5]矩阵已凝聚的检测质心[X, Y, Z, V, Total_SNR_dB]% gates:结构体包含三个维度的物理容差门限例如 % gates.r 距离容差(米)% gates.v 速度容差(m/s)% gates.ang 角度容差(度)% total_bins:标量2D-FFT的总网格数rangeBin * dopplerBin用于计算Pfa基数 % % 输出参数: % CfarDoaMetrics:结构体包含 CfarDoaMetrics.Pd 、 CfarDoaMetrics.Pfa 、 CfarDoaMetrics.angle_rmse %%1. 数据解析与初始化 % 初始化输出 CfarDoaMetrics.Cluster_Pd0;% 目标层面的检测概率 CfarDoaMetrics.Cluster_Pfa0;% 目标层面的虚警率 CfarDoaMetrics.Cluster_False_Alarm_Count0;% 没对上真实目标的假簇质心总数 CfarDoaMetrics.angle_rmse_pureNaN;% 仅针对成功匹配上的目标的测角误差 % --- 阶段1凝聚真实目标的上帝视角质心 ---ifisempty(targets)num_true_targets0;True_Centers[];elseunique_true_idsunique(targets(:,4));num_true_targetslength(unique_true_ids);True_Centerszeros(num_true_targets,4);%[Range, Vel, Angle, TargetID]fortIdx1:num_true_targets curr_true_idunique_true_ids(tIdx);curr_mask(targets(:,4)curr_true_id);% 上帝视角几何凝聚 r_meanmean(targets(curr_mask,1));v_meanmean(targets(curr_mask,2));% 航向径向速 ang_meanmean(targets(curr_mask,3));True_Centers(tIdx,:)[r_mean, v_mean, ang_mean, curr_true_id];end end % --- 阶段2检测质心 直角转极坐标 ---ifisempty(centroids)num_detect_clusters0;Detect_Centers_Radar[];elsenum_detect_clusterssize(centroids,1);Detect_Centers_Radarzeros(num_detect_clusters,3);%[Range, Vel, Angle]forcIdx1:num_detect_clusters cxcentroids(cIdx,1);cycentroids(cIdx,2);cvcentroids(cIdx,4);% 第4列是径向速度 c_rangesqrt(cx^2 cy^2);c_angleatand(cx / cy);% 保持测角定义对齐 Detect_Centers_Radar(cIdx,:)[c_range, cv, c_angle];end end % --- 阶段3边界防御 ---ifnum_detect_clusters0CfarDoaMetrics.Cluster_Pd0;CfarDoaMetrics.Cluster_Pfa0;return;endifnum_true_targets0CfarDoaMetrics.Cluster_Pd0;CfarDoaMetrics.Cluster_Pfanum_detect_clusters / total_bins;return;end % --- 阶段4点迹级别的唯一性占位匹配 --- detect_cluster_usedfalse(num_detect_clusters,1);hit_target_count0;angle_squared_errorszeros(num_true_targets,1);fori1:num_true_targets t_rTrue_Centers(i,1);t_vTrue_Centers(i,2);t_angTrue_Centers(i,3);% 算残差 r_diffabs(Detect_Centers_Radar(:,1)- t_r);v_diffabs(Detect_Centers_Radar(:,2)- t_v);ang_diffabs(Detect_Centers_Radar(:,3)- t_ang);% 先筛出所有同时满足三维门限、且未被使用的候选点布尔向量 valid_matches(r_diffgates.r)...(v_diffgates.v)...(ang_diffgates.ang)...(~detect_cluster_used);ifany(valid_matches)find_idxfind(valid_matches);% 找出所有候选点的行号 % cand_ang_diffang_diff(find_idx);scorer_diff(find_idx);% 如果只在乎空间位置可以直接用欧氏距离(也可综合考虑距离和角度)[~, min_local_idx]min(score);% 寻觅最小值对应的相对位置 match_idxfind_idx(min_local_idx);% 提炼出全场最优匹配点的真实行号 detect_cluster_used(match_idx)true;% 占位锁死 hit_target_counthit_target_count 1;% 测角误差 angle_squared_errors(hit_target_count)(Detect_Centers_Radar(match_idx,3)- t_ang)^2;end end % --- 阶段5指标计算 --- CfarDoaMetrics.Cluster_Pdhit_target_count / num_true_targets;% 检出率ifhit_target_count0CfarDoaMetrics.angle_rmse_puresqrt(mean(angle_squared_errors(1:hit_target_count)));% 测角均方误差 end false_cluster_countnum_detect_clusters - hit_target_count;CfarDoaMetrics.Cluster_False_Alarm_Countfalse_cluster_count;N_truth_points_totalsize(targets,1);N_noise_cells_totaltotal_bins - N_truth_points_total;% 分母减去所有真实目标碎点数 % 分子虚警簇的个数 CfarDoaMetrics.Cluster_Pfafalse_cluster_count / max(1, N_noise_cells_total);% 虚警率这个值通常极小比如10^{-5}它代表“单点发生误判的概率”。 endeval_gates.r5;% 距离门限 米 eval_gates.v1;% 速度门限 m/s eval_gates.ang1.5;3;% 角度门限 度 total_radar_cellsParameter.rangeBin * Parameter.dopplerBin;CfarDoaMetricscalculate_radar_metrics(Parameter.target, centroids, eval_gates, total_radar_cells);中间结果对于仿真的单个飞机目标该目标质心的[距离, 目标中心与雷达角度, 航向速度, 航向角][60, 10, -4, 225]指标计算结果如下CfarDoaMetrics Cluster_Pd: 1Cluster_Pfa: 0Cluster_False_Alarm_Count: 0angle_rmse_pure: 0.2690