cfar_detection_1D_pro.m% cfar_detection_1D的改进function[pointList, cfarRD]cfar_detection_1D_pro(accumulateRD, targetnum)% 输入说明accumulateRD 假定为线性功率谱如果是dB谱建议先10.^(RD/10)还原[rangeLen, dopplerLen]size(accumulateRD);%1. 参数提取与配置iftargetnum1%1-点目标 d_guard2;d_train8;r_guard4;r_train8;d_SNR10;% 多普勒维参数 r_SNR10;% 距离维参数else% 飞机参数 %【仿真的飞机形状有将近一百个点降低d_SNR和r_SNRcfar输出的点从5个锐增到50个】 d_guard4;d_train8;r_guard5;r_train8;d_SNR5.5;3.5;% 多普勒维参数 r_SNR5.5;3.5;% 距离维参数 end %2. 使用 1D 卷积算子 【舍去多普勒维双重循环】 % 构造多普勒方向的滑窗卷积核 -- 直接计算出噪声均值 % 长度为 d_train d_guard 1 d_guard d_train total_d_len2*(d_train d_guard)1;k_doppler_leftzeros(1, total_d_len);k_doppler_rightzeros(1, total_d_len);% 左侧训练区 k_doppler_left(1:d_train)1/ d_train;% 右侧训练区 k_doppler_right(end - d_train 1:end)1/ d_train;% 环形边界处理对应环形填充imfilter 内置circular leftNoiseimfilter(accumulateRD, k_doppler_left,circular);rightNoiseimfilter(accumulateRD, k_doppler_right,circular);%1:CA-CFAR2:GO-CFAR3:SO-CFAR noise_CA(leftNoise rightNoise)/2;noise_GOmax(leftNoise, rightNoise);noise_SOmin(leftNoise, rightNoise);% 默认采用 CA-CFAR直接矩阵相除得到全图所有点的信噪比线性域用除法 snr_map_doppleraccumulateRD ./ noise_CA;%[rangeLen, dopplerLen]% 找出通过多普勒检测的所有列多普勒Bin th_linear_d10^(d_SNR /10);% 将 dB 门限转换为线性倍数 doppler_maskany(snr_map_dopplerth_linear_d,1);%[1, dopplerLen]沿着参数1矩阵的第1维纵向/逐行 dopplerCfarListfind(doppler_mask);%3. 距离维度的矩阵级级并行计算 cfarRDzeros(rangeLen, dopplerLen);pointList[];ifisempty(dopplerCfarList)return;end % 构造距离向的上滑窗和下滑窗卷积核(纵向列向量)total_r_len2*(r_train r_guard)1;k_range_upzeros(total_r_len,1);k_range_downzeros(total_r_len,1);% 真正的上方训练区 k_range_up(1:r_train)1/ r_train;% 真正的下方训练区 k_range_down(end - r_train 1:end)1/ r_train;% 对称边界处理对应对称填充imfilter 内置symmetric upNoiseimfilter(accumulateRD, k_range_up,symmetric);downNoiseimfilter(accumulateRD, k_range_down,symmetric);noise_range_CA(upNoise downNoise)/2;snr_map_rangeaccumulateRD ./ noise_range_CA;th_linear_r10^(r_SNR /10);%4. 两维 Mask 交叉相乘瞬间提取点迹 % 只有同时通过多普勒列筛选且满足距离维 SNR 的点才留下 final_mask(snr_map_rangeth_linear_r);%[rangeLen, dopplerLen]final_mask(:, ~doppler_mask)0;% 裁剪掉没通过多普勒筛选的列 % 提取最终结果[r_hits, d_hits]find(final_mask);pointList[r_hits; d_hits];% 完美的[2x N]坐标矩阵 % 填充输出谱 linear_indicesfind(final_mask);cfarRD(linear_indices)accumulateRD(linear_indices);% 如果整体流水线后面需要 dB最后统一转回 dB cfarRD10* log10(cfarRD eps);end输入的是未做db处理的RD通道平均图。对于距离维度的保护单元大小设定可根据参数确定的距离分辨率计算一个普通人或车辆目标在距离轴上横跨的range bin并考虑目标能量泄露扩展。汽车目标较宽出现单辆车横跨上百个range bin的情况此时会先做数据下采样或者在cluster后再做CFAR。如果在距离维FFT前加了hamming窗抑制旁瓣那么峰值会被拓宽2-3个range bin此时保护单元也需要在物理尺寸下额外增加1-2个单元。同样地多普勒维度的保护单元设定根据目标速度展宽速度微动–加速度帧周期工程经验值对于常规的车载/室内人员检测多普勒维的目标速度展宽Δvspread\Delta v_{\text{spread}}Δvspread​通常预设为0.5∼1.5 m/s0.5 \sim 1.5\text{ m/s}0.5∼1.5m/s。结合加窗拓宽多普勒维的单侧保护单元通常设为 2~4 个 Bin。d_SNR与r_SNR决定检测出来的点数降低SNR检测点数增加虚警点增多。常用经典配置多普勒维度做了环形填充相位周期回绕特性距离维度做了镜像填充非周期性。用卷积算子通过设置循环或镜像不用自己构造直接计算训练单元的噪声。多普勒和距离分开进行CFAR检测处理。先进行多普勒维度的搜索再根据搜索结果进行距离维度搜索大大减少了距离维度搜索次数/时间。CA-CAFR 单元平均恒虚警PnPleftPright2P_n \frac{P_{\text{left}} P_{\text{right}}}{2}Pn​2Pleft​Pright​​认为雷达所处的噪声环境在局部是绝对均匀分布的直接取两边的平均值。场景理想均匀噪声环境。GA/GO-CFARPnmax⁡(Pleft,Pright)P_n \max(P_{\text{left}}, P_{\text{right}})Pn​max(Pleft​,Pright​)哪边算出来的功率大就用哪边作为噪底基准。场景检测单元位于“杂波边缘”。LA/SO-CFARPnmin⁡(Pleft,Pright)P_n \min(P_{\text{left}}, P_{\text{right}})Pn​min(Pleft​,Pright​)哪边算出来的功率小就用哪边作为噪底基准。场景密集多目标并行真正的目标在检测单元CUT但由于距离极近另一个同样很强的邻近目标刚好落在了右侧的参考单元里Pleft≪PrightP_{\text{left}} \ll P_{\text{right}}Pleft​≪Pright​。为了彻底打破这种“按下葫芦起了瓢”的僵局现代高性能雷达如 4D 毫米波雷达、车载高阶感知雷达在后级处理中普遍倒向了 OS-CFAR有序统计 和 2D-CFAR二维空间联合检测。OS-CFAROS-CFAROrdered Statistic CFAR从算术平均升级到先排序后抽样。假设我们的参考单元Reference Cells一共抽样了N24N 24N24个格子左边 12 个右边 12 个。第一步无差别收集不管这些盒子里装的是纯噪声、突变的杂波、还是并排同行的另一个大目标把这 24 个格子里的功率数值全部掏出来。第二步升序排列将这 24 个数值按照从小到大的顺序进行物理排序得到一个有序序列X(1)≤X(2)≤⋯≤X(k)≤⋯≤X(N)X_{(1)} \le X_{(2)} \le \dots \le X_{(k)} \le \dots \le X_{(N)}X(1)​≤X(2)​≤⋯≤X(k)​≤⋯≤X(N)​第三步精准定位噪底算法不求和也不求平均而是直接指定排序后的第kkk个位置的值X(k)X_{(k)}X(k)​作为当前检测单元CUT的噪声基准。在工程落地中这个kkk通常被设定在总数NNN的34\frac{3}{4}43​处例如N24N24N24时取k18k18k18。这被称为“高分位数选择”在多目标相互遮蔽时高功率会被排到末尾在杂波边缘时强杂波也会被排在后端。2D-CFAR代码中先在速度维Range滑一次窗然后在距离维Doppler滑一次窗这是 1D-CFAR2×1D 级联 CFAR。2D-CFAR 则是直接把滑窗变成了一个二维的“空心十字架”或“空心双层方砖”在距离-多普勒热力图RD Map上进行二维扫描。“空心十字架”只收集和 CUT检测单元 处于同一行同一多普勒和同一列同一距离的噪声数据算力开销低但是四个角是盲区如果多目标或者杂波干扰刚好长在十字架的斜对角方向45度角位置十字架完全探测不到它会导致噪底估计失真。“空心双层方砖”最中间一个检测单元格子围绕检测单元绕一圈保护单元比如3x3最外圈为训练单元比如9x9。CA-CFAR 中间结果[pointList, cfarRD]cfar_detection_1D_pro(rd_map_mean, targetnum);% 送入CFAR前不必加db直接就是功率谱 figure(3);imagesc(doppler_axis,range_axis,cfarRD); set(gca, YDir, normal); xlabel(速度(m/s)); ylabel(距离(m));title(CFAR RD);对于仿真的单个飞机目标该目标质心的[距离, 目标中心与雷达角度, 航向速度, 航向角][60, 10, -4, 225]rd图d_SNR 5.5; r_SNR 5.5; 时的cfar检测结果检测出点数为225个d_SNR 3.5; r_SNR 3.5; 时的cfar检测结果检测出点数为1168个背景的虚警点明显增多。cfar_detection_2D.mfunction[pointList, cfarRD]cfar_detection_2D(accumulateRD, targetnum)% 输入说明accumulateRD 传入的为非相干积分线性功率谱[rangeLen, dopplerLen]size(accumulateRD);%%1. 2D 物理空间滑窗参数自适应配置 %iftargetnum1%1-点目标参数 r_guard2;r_train4;% 距离维保护、参考【半宽】 d_guard2;d_train4;% 多普勒维保护、参考【半宽】 cfar_SNR_dB12;% 2D 联合恒虚警检测门限else% 飞机扩展目标参数 %【针对飞机目标的调谐2D 下适当放宽保护区降低门限以捞出机翼等散射点迹】 r_guard4;r_train6;d_guard4;d_train6;cfar_SNR_dB5.5;end %%2. 构建“二维空心双层方砖”卷积核(Nested Matrix)%% 计算大方砖外圈参考窗的完整边长 N_r_total2*(r_train r_guard)1;N_d_total2*(d_train d_guard)1;% 步骤 A创建一个充满1的全尺寸实心大方砖 kernel_2Dones(N_r_total, N_d_total);% 步骤 B计算出内圈“保护方砖”在矩阵内部的绝对坐标边界 r_centerr_train r_guard 1;d_centerd_train d_guard 1;r_guard_range(r_center - r_guard):(r_center r_guard);d_guard_range(d_center - d_guard):(d_center d_guard);% 步骤 C将中间保护区含CUT本身全部强行抹零形成“方砖城墙” kernel_2D(r_guard_range, d_guard_range)0;% 步骤 D计算这堵城墙到底由多少个纯噪声格子组成进行均值归一化 num_noise_cellssum(kernel_2D(:));kernel_2Dkernel_2D / num_noise_cells;%%3. 2D 空间滑窗 %% 边界处理距离向纵向采用对称反射填充symmetricpad_size_dd_train d_guard;% 拼接宽度多普勒向横向由于速度具有周期折叠特性 % 横向环形手动填充把右边的数据贴到左边左边的数据贴到右边 padded_RD[accumulateRD(:, end-pad_size_d1:end), accumulateRD, accumulateRD(:,1:pad_size_d)];padded_noiseimfilter(padded_RD, kernel_2D,symmetric);% 对称反射填充 % 裁剪回原有 2D 图尺寸 mean_noise_floorpadded_noise(:, pad_size_d1:end-pad_size_d);% 还原原始 RD 图尺寸 %%4. 2D 联合信噪比对账与点迹提取 %% 线性域直接相除得到整张二维图每一个坐标点的真实 2D SNR Map snr_map_2DaccumulateRD ./(mean_noise_floor eps);% 转换门限 th_linear10^(cfar_SNR_dB /10);% 生成最终的 2D 检测掩膜(1代表冲破门限的强点0代表噪底)final_mask(snr_map_2Dth_linear);% 剔除边缘极其靠边、无法形成完整保护区的死角点迹可选防呆机制 final_mask(1:r_guard,:)0;final_mask(end-r_guard1:end,:)0;% 提取最终通关的散射点坐标[r_hits, d_hits]find(final_mask);% 完美的[N x2]坐标矩阵满足你后续 DOA 测角函数输入要求的[rangeIdx, dopplerIdx] pointList[r_hits; d_hits];%%5. 谱图填充与格式转换转回 dB 供后级显示或调试 %cfarRDzeros(rangeLen, dopplerLen);linear_indicesfind(final_mask);cfarRD(linear_indices)accumulateRD(linear_indices);% 统一转回符合雷达可视化账本的 dB 格式 cfarRD10* log10(cfarRD eps);end中间结果还是单飞机目标2Dcfar参数设置r_guard 4; r_train 6;d_guard 4; d_train 6;cfar_SNR_dB 5.5;cfar检测结果检测出点数为270个相比1Dcfar结果飞机具有更多细节。cfar_SNR_dB 3.5; cfar检测结果检测出点数为758个背景虚警点明显增多。