Pipeline-距离方位FFT
range_doppler_fft.mfunction[range_fft, rd_map, Metrics]range_doppler_fft(rawData, Parameter)% rawData:[虚拟通道, 距离采样点, chirp数]numADCSamplesParameter.Samples;%256numChirpsParameter.Chirps;%512%%1. 理论与实际分辨率计算cParameter.c;bandwidthParameter.BandwidthValid;lambdaParameter.lambda;txNumParameter.txNum;TcParameter.Tc;% 理论分辨率 Metrics.res_r_theoryc /(2* bandwidth);Metrics.res_v_theorylambda /(2* txNum * Tc * numChirps);% 汉宁窗Hann的主瓣展宽因子约为1.63主瓣变宽分辨率退化 win_broadening_factor_r1.63;win_broadening_factor_v1.63;Metrics.res_r_actualMetrics.res_r_theory * win_broadening_factor_r;Metrics.res_v_actualMetrics.res_v_theory * win_broadening_factor_v;%%加窗处理链路% 加窗压低距离维和速度维的旁瓣避免强目标的泄露掩盖掉弱目标 win_rhann(numADCSamples);% 定义汉宁窗[numADCSamples,1]win_dhann(numChirps);%[numChirps,1]filter_2dwin_r * win_d;% 二维滤波矩阵[numADCSamples, numChirps]filter_3dreshape(filter_2d,1, numADCSamples, numChirps);% 三维滤波矩阵 % 广播机制如果两个矩阵在某个维度上的大小不一致但其中一个是1那么 MATLAB 会自动将这个维度为1的矩阵沿着该维度进行“虚拟复制”直到它的尺寸和另一个矩阵匹配。 rawData_windowedrawData .* filter_3d;% Range FFT range_fftfft(rawData_windowed, numADCSamples,2);% 静态杂波抑制(可选减去均值)% range_fftrange_fft - mean(range_fft,3);% Doppler FFT rd_mapfftshift(fft(range_fft, numChirps,3),3);end距离分辨率雷达发射一个频率不断上升的信号Chirp扫频带宽为B BB即 bandwidth有效采样时间为T c T_cTc。那么这个信号的频率上升斜率Slope就是S B T c S \frac{B}{T_c}STcB电磁波飞出去打到目标再返回路程是2 R 2R2R花费的时间时延为τ 2 R c \tau \frac{2R}{c}τc2R在接收机里发射信号和接收信号混频就会产生一个固定的中频频率差Δ f \Delta fΔfΔ f S ⋅ τ B T c ⋅ 2 R c 2 B ⋅ R c ⋅ T c \Delta f S \cdot \tau \frac{B}{T_c} \cdot \frac{2R}{c} \frac{2B \cdot R}{c \cdot T_c}ΔfS⋅τTcB⋅c2Rc⋅Tc2B⋅R在距离维做 FFT1D-FFT。傅里叶变换有一个不可逾越的物理铁律在时间长度为T c T_cTc的信号里频率分辨力即能区分的最小频率差是Δ f min 1 T c \Delta f_{\text{min}} \frac{1}{T_c}ΔfminTc1。1 T c 2 B ⋅ Δ R c ⋅ T c \frac{1}{T_c} \frac{2B \cdot \Delta R}{c \cdot T_c}Tc1c⋅Tc2B⋅ΔRΔ R c 2 B \Delta R \frac{c}{2B}ΔR2Bc速度分辨率如果目标在运动那么两个相邻 Chirp 之间目标移动了一点点微小的距离Δ d v ⋅ Δ t \Delta d v \cdot \Delta tΔdv⋅Δt。这一小段距离会导致接收到的电磁波相位产生微小的旋转Δ ϕ \Delta \phiΔϕ。在慢时间轴上做 2D-FFT本质就是在测量这个相位旋转引发的多普勒频率f d f_dfdf d 2 v λ f_d \frac{2v}{\lambda}fdλ2v2D-FFT 是在慢时间轴上积攒了多个 Chirp 来算频率的。在 TDM-MIMO时分复用体制下o发射天线有 txNum 个比如 3 个它们必须排队发射TX1→ \rightarrow→TX2→ \rightarrow→TX3→ \rightarrow→TX1…。o每一个 Chirp 耗时T c T_cTc。一个完整的 MIMO 循环所有天线发射完一轮耗时就是t x N u m ⋅ T c txNum \cdot T_ctxNum⋅Tco整个数据帧里一共积累了 numChirps 个脉冲这是单通道的 Chirp 数。雷达观测速度的总时间窗长度为T total t x N u m ⋅ T c ⋅ n u m C h i r p s T_{\text{total}} txNum \cdot T_c \cdot numChirpsTtotaltxNum⋅Tc⋅numChirps傅里叶变换的铁律在总时间为T total T_{\text{total}}Ttotal的信号里多普勒频率的最小分辨力是Δ f d _min 1 T total 1 t x N u m ⋅ T c ⋅ n u m C h i r p s \Delta f_{d\text{\_min}} \frac{1}{T_{\text{total}}} \frac{1}{txNum \cdot T_c \cdot numChirps}Δfd_minTtotal1txNum⋅Tc⋅numChirps1代入多普勒公式f d 2 v λ f_d \frac{2v}{\lambda}fdλ2v求对应的最小速度差Δ v \Delta vΔv1 t x N u m ⋅ T c ⋅ n u m C h i r p s 2 ⋅ Δ v λ \frac{1}{txNum \cdot T_c \cdot numChirps} \frac{2 \cdot \Delta v}{\lambda}txNum⋅Tc⋅numChirps1λ2⋅ΔvΔ v λ 2 ⋅ t x N u m ⋅ T c ⋅ n u m C h i r p s \Delta v \frac{\lambda}{2 \cdot txNum \cdot T_c \cdot numChirps}Δv2⋅txNum⋅Tc⋅numChirpsλ雷达看目标看得时间越长T total T_{\text{total}}Ttotal越大多普勒频率认得越准速度分辨率就越高。加窗进行距离和多普勒维FFT前进行加窗处理压低旁瓣。如果场景里有一架大飞机和一只小鸟大飞机的 FFT 旁瓣会直接把小鸟淹没。为了看清弱目标在代码里加了汉宁窗。汉宁窗把时域两端的回波强行抹平到 0极大地压低了旁瓣降到− 32 dB -32\text{ dB}−32dB。但代价是主瓣变胖了。主瓣一变胖原本离得近、勉强能分出来的两个峰现在融合成一个大胖峰了。在数学上汉宁窗会导致主瓣展宽约 1.63 倍。理论上雷达能分辨1 米 1\text{ 米}1米处的两个目标。实际上加了汉宁窗后只有相距1.63 米 1.63\text{ 米}1.63米以上的两个目标才能被 FFT 分辨出来。有关SNR目标数量未知在雷达信号处理pipeline中不能在 CFAR 检测之前去盲猜 SNR。中间结果对于仿真的单个飞机目标该目标质心的[距离, 目标中心与雷达角度, 航向速度, 航向角][60, 10, -4, 225][range_fft, rd_map, RDMetrics]range_doppler_fft(rawData, Parameter);% Range Doppler FFT rd_map_meansqueeze(mean(abs(rd_map).^2,1));% 非相干积分二维能量图(取模平方通道平均)r_max(Parameter.Fs * Parameter.c)/(2* Parameter.Slope);% 最大理论距离 range_axislinspace(0, r_max, Parameter.rangeBin);% 计算速度轴时必须使用整个 TDM 循环的总时间TX1 的数据流在0, 3Tr, 6Tr, 9Tr...采样 v_maxParameter.lambda /(4* Parameter.txNum * Parameter.Tc);v_resParameter.lambda /(2* Parameter.Chirps * Parameter.txNum * Parameter.Tc);doppler_axislinspace(-v_max, v_max - v_res, Parameter.dopplerBin);% 生成速度轴(从-v_max到 v_max)figure(1);imagesc(range(Parameter.dopplerBin), range_axis, squeeze(mean(abs(range_fft),1)));set(gca,YDir,normal);xlabel(多普勒bin);ylabel(距离 (m));title(Range fft);figure(2);imagesc(doppler_axis, range_axis, rd_map_mean);% 设置坐标轴方向imagesc 默认 Y 轴是反的距离0在上方 set(gca,YDir,normal);xlabel(速度 (m/s));ylabel(距离 (m));title(RD Map);rd图显示的径向速度 航向速度*cos(目标中心与雷达角度 - 航向角)。规定速度为负表示靠近雷达。