ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SAR距离多普勒算法解析与MATLAB仿真聚焦实现

SAR距离多普勒算法解析与MATLAB仿真聚焦实现 坦白讲SAR成像系列写到第三篇才真正到了最劝退人的地方——二维回波信号和距离多普勒算法。前两篇我们聊了合成孔径雷达的基本原理也动手生成过单个目标的一维回波不少读者反馈信号能跑出来相位项看得懂但一进入二维处理就懵。这篇我打算把最经典的路线完整走一遍从二维回波矩阵怎么来到RD算法为什么这样设计再到用MATLAB从零搭一个聚焦成像闭环代码直接放在每一小节里。适合正在啃SAR教材、做课程设计或者刚接手星载SAR数据处理的朋友参考。跑完这个仿真你对“距离压缩、距离徙动校正、方位压缩”这三个词的理解会完全不一样。1. 二维回波信号先搞清楚手里拿的是什么1.1 点目标模型与两个时间维度合成孔径雷达发射的是线性调频信号接收端记录的是目标反射回来的二维数据。这块一开始容易绕是因为SAR回波天然就有两个时间维度一个是距离向的“快时间”通常用(t)表示对应一个脉冲内部从发射到接收的时延量级是微秒甚至纳秒另一个是方位向的“慢时间”通常用(\eta)表示对应雷达平台沿轨道飞行时不同方位位置发射不同脉冲的时刻量级是秒。我习惯用一个类比去理解快时间像是相机快门打开后传感器阵列上每个像元在极短时间内完成的曝光采样慢时间像是你连续按下快门一张一张地拍。SAR的原始数据就是一个二维矩阵每一行是一个脉冲在快时间维上的采样每一列是同一个距离门在不同方位慢时间上的响应。也就是说数据矩阵的行号对应方位慢时间列号对应距离快时间后续所有成像算法本质上都是在处理这个矩阵。从这个模型出发正侧视情况下的点目标斜距历史可以写成[ R(\eta) \sqrt{R_0^2 v^2(\eta - \eta_c)^2} ]其中(R_0)是目标到航迹的最近斜距(v)是平台速度(\eta_c)是波束中心正对目标的时刻也就是“零多普勒时刻”。这个式子极其重要后面距离向延迟、方位向相位、距离徙动量全部由它派生出来。1.2 从发射脉冲到二维回波矩阵假设发射基带线性调频信号为[ s_t(t) \text{rect}\left(\frac{t}{T_p}\right) \exp\left(j\pi K_r t^2\right) ]其中(T_p)是脉冲宽度(K_r)是距离向调频率。经过点目标反射并被雷达接收后解调到基带的二维回波可以写成[ s(t, \eta) \text{rect}\left(\frac{t - 2R(\eta)/c}{T_p}\right) \exp\left(j\pi K_r \left(t - \frac{2R(\eta)}{c}\right)^2\right) \exp\left(-j\frac{4\pi R(\eta)}{\lambda}\right) ]这个公式看起来长拆开看就两层意思第一个指数项是发射线性调频信号的延迟复制第二个指数项是由载频带来的相位它的相位变化速度极快对方位向聚焦起决定性作用。注意这里的(R(\eta))是随慢时间变化的所以第二个指数项在方位向也构成了一个调频信号这正是合成孔径能够实现方位高分辨率的根本原因。初学的时候容易忽略矩形窗那一项但它在回波仿真里不可或缺。没有它距离向时域上所有采样点都有能量压缩后会出现很多伪峰。实际写MATLAB代码时用一个逻辑向量abs(t - tau) Tp/2就能干净地模拟这个包络。1.3 为什么把距离徙动单独拿出来讲距离徙动指的是在合成孔径时间内目标到雷达的斜距一直在变化导致目标回波在距离向延迟轴上不是一条直线而是一条曲线。对正侧视SAR最大徙动量发生在合成孔径边缘近似为[ \Delta R_{\max} \approx \frac{v^2 T_a^2}{8 R_0} ]这个值到底有多大用一组贴近星载SAR的参数来算轨道高度600km平台速度7600m/s雷达波长0.24mL波段方位向天线尺寸10m那么合成孔径时间大约是(T_a \lambda R_0 / (L_a v) \approx 1.9)秒代入上式得到(\Delta R_{\max} \approx 43)米。如果距离向带宽只有30MHz对应的距离分辨率为5米那么43米的徙动量相当于跨越了8到9个距离单元。也就是说目标在距离压缩后的轨迹会横跨好几个距离单元。如果不校正就直接做方位压缩等效于把多段相位历史强行叠加结果必然是散焦。所以RD算法里把“距离徙动校正”单独拎出来一步不是多此一举而是绕不开的物理约束。2. RD算法的设计逻辑为什么先距离压缩再方位压缩2.1 第一步距离压缩本质是一次匹配滤波距离向脉冲压缩的原理简单说就是把发射的大时宽带宽积线性调频信号通过匹配滤波变成窄脉冲。匹配滤波器的频域表达式是发射信号频谱的共轭。对于(s_t(t) \exp(j\pi K_r t^2))对应的距离向匹配滤波器常写为[ H_r(f) \exp\left(j\pi \frac{f^2}{K_r}\right) ]这里要注意一个坑不同教材对线性调频信号相位的正负号约定不同有的写(\exp(-j\pi K_r t^2))匹配滤波器的指数符号就会反过来。写代码时务必先确认自己发射信号里用的是正调频还是负调频否则距离压缩出来会“不聚焦”或者“反褶”。距离压缩之后距离向波形从线性调频变成了sinc函数主瓣宽度决定距离分辨率[ \rho_r \frac{c}{2B} ]比如B30MHz时理论距离分辨率约5米。这一步做完每个方位时刻的目标能量被压到对应的距离单元里但目标在距离向的位置仍是随慢时间变化的也就是距离徙动依然存在。2.2 第二步距离徙动校正最难也最有价值的一步距离徙动校正常见做法是在距离多普勒域完成即在方位向FFT后根据多普勒频率和斜距的对应关系对每个距离单元做“拉直”处理。成熟的工程实现会用sinc插值或者频域相位补偿精度高计算量也可控。初学仿真时有一种更直观的简化做法方位时域里根据每个慢时间时刻的斜距偏移量把距离压缩后的包络插值到同一参考时延位置。严格来说正侧视小场景下这样做精度足够但如果你后面要做大场景、大斜视数据还是要回到标准的RD流程。我这次仿真里采用简化插值方式目的就是把“距离徙动校正到底在干什么”这件事讲清楚。什么时候可以不做RCMC判断条件是最大距离徙动量不超过四分之一到半个距离单元。如果(\Delta R_{\max} \rho_r/4)直接忽略RCMC对方位压缩影响不大。很多机载正侧视小场景仿真里这个条件成立所以不少简化教程直接省略RCMC。但回到上面算的星载参数43米对5米分辨率显然不能省。2.3 第三步方位压缩又一个匹配滤波距离压缩和RCMC之后点目标在距离向已经被压到同一个距离单元剩余的方位向信号可以近似写成[ s(\eta) \approx A \cdot \exp\left(-j\pi K_a (\eta - \eta_c)^2\right) ]其中方位向调频率为[ K_a \frac{2v^2}{\lambda R_0} ]这不是巧合而是斜距历史的二阶项自然产生的。既然方位向也是一个线性调频信号那就同样可以用匹配滤波来做压缩。频域方位匹配滤波器可写作[ H_a(f_\eta) \exp\left(-j\pi \frac{f_\eta^2}{K_a}\right) ]经过方位压缩点目标在二维平面上变成一个sinc型峰值方位向分辨率理论上等于天线方位向尺寸的一半[ \rho_a \frac{L_a}{2} ]到这里RD算法三步走就闭环了。整个过程可以汇总成一张表处理步骤输入核心操作输出关注点距离压缩原始二维回波距离向FFT × 匹配滤波 IFFT距离压缩后数据距离分辨率、旁瓣距离徙动校正距离压缩数据按斜距偏差插值或相位补偿RCMC后数据目标轨迹是否拉平方位压缩RCMC后数据方位向FFT × 匹配滤波 IFFTSAR复图像方位聚焦质量、峰值位置RD算法适合正侧视、小斜视、窄波束的场景。斜视角度一大距离和方位的耦合会变强单纯三步走精度不够那时候就要考虑CSA或者ωK算法了。但你先把RD跑通后面学再复杂的算法都有底气。3. MATLAB仿真全流程从回波生成到聚焦图像3.1 仿真参数是怎么选的这次仿真我刻意选了一组贴近星载SAR的L波段参数而不是为了计算快把平台速度、斜距缩到离谱。主要原因是这组参数下距离徙动量达到40多米远超一个距离单元能让RCMC的作用非常直观。参数名称符号数值说明光速c3e8 m/s载频fc1.25 GHzL波段波长lambda0.24 mc/fc距离向带宽B30 MHz距离分辨率约5m脉冲宽度Tp10 us距离向调频率Kr3e12 Hz/sB/Tp距离向采样率Fs120 MHz4倍带宽过采样脉冲重复频率PRF2000 Hz需大于多普勒带宽平台速度v7600 m/s近地轨道卫星典型速度最近斜距R0600 km正侧视方位向天线尺寸La10 m理论方位分辨率约5m合成孔径时间Ta约1.9 s由lambdaR0/(Lav)计算这个参数下方位向多普勒调频率约为(K_a \approx 802) Hz/s多普勒带宽约1.5kHzPRF取2kHz是够的。距离向采样率取4倍过采样主要是为了让距离压缩后的sinc包络更平滑后续插值RCMC误差更小。3.2 回波生成代码与实现细节先写参数设置这部分直接复制就能跑clear; close all; c 3e8; fc 1.25e9; lambda c / fc; B 30e6; Tp 10e-6; Kr B / Tp; Fs 4 * B; PRF 2000; v 7600; R0 600e3; La 10; % 距离向时间轴 Nr round(Tp * Fs); t (-Nr/2 : Nr/2 - 1) / Fs; % 以0为中心 % 合成孔径时间与方位向时间轴 Ta lambda * R0 / (La * v); Na round(Ta * PRF); eta (0 : Na - 1) / PRF; eta eta - mean(eta); % 零多普勒时刻放到0 eta_c 0; % 点目标方位向中心时刻生成点目标回波时我用一个循环遍历每个方位脉冲逐行生成二维数据。虽然效率不如矩阵化但逻辑很清楚方便你对着公式看s zeros(Na, Nr); for azIdx 1 : Na R sqrt(R0^2 v^2 * (eta(azIdx) - eta_c)^2); tau 2 * R / c; t_delay t - tau; mask abs(t_delay) Tp / 2; s(azIdx, :) mask .* exp(1j * pi * Kr * t_delay.^2) .* exp(-1j * 4 * pi * R / lambda); end这里有几个细节容易踩坑。一是t_delay的时间轴必须和离散采样索引对好t是快时间的绝对时间刻度tau是从发射到接收到目标回波的时延两者相减才是目标回波在基带时间轴上的位置。二是载频相位项里的4*pi*R/lambda是双程距离带来的别漏了“双程”的2倍。三是矩形包络的宽度如果采样率不够高包络边缘会出现振铃所以距离向采样率尽量至少取2倍带宽。3.3 距离压缩与RCMC的实现距离压缩在频域做先构造距离向匹配滤波器f (-Fs/2 : Fs/Nr : Fs/2 - Fs/Nr); Hr exp(1j * pi * f.^2 / Kr); S_range fftshift(fft(s, Nr, 2), 2); S_range S_range .* Hr; s_rc ifft(ifftshift(S_range, 2), Nr, 2);注意fft之后的频率顺序是从0到Fs而f向量是负频率到正频率所以必须先用fftshift搬到中心处理后再用ifftshift搬回去顺序不能反。距离压缩后点目标的能量被压到一条弯曲的轨迹上。现在做距离徙动校正。我在这里用最直观的“时域插值拉直”方式对应每个方位时刻把包络峰值从实际的tau位置搬回参考时延tauc2*R0/c的位置tauc 2 * R0 / c; s_rcmc zeros(Na, Nr); for azIdx 1 : Na R sqrt(R0^2 v^2 * (eta(azIdx) - eta_c)^2); tau 2 * R / c; delta_tau tau - tauc; query t delta_tau; s_rcmc(azIdx, :) interp1(t, s_rc(azIdx, :), query, spline, 0); end这里要特别说明query t delta_tau这个方向很多人写反。当目标斜距大于R0时delta_tau为正说明当前脉冲里目标峰值出现在更晚的快时间位置。为了把它拉回到tauc处新的输出序列在时间t处的值应该取原序列在t delta_tau处的值相当于把整条包络往左搬。跑完这步你可以画一下s_rcmc的幅度图目标轨迹应该从一条弯曲曲线变成一条平直线。插值方法我用了spline比linear平滑比纯sinc插值实现简单。工程上要求更高时通常用8点或16点sinc插值抗混叠效果更好。参数0表示插值超出原始范围时补零避免边缘出现离谱的外推数值。3.4 方位压缩与结果评估方位压缩同样在频域做但方向是沿矩阵的行方向也就是方位维。先构造方位向匹配滤波器Ka 2 * v^2 / (lambda * R0); f_eta (-PRF/2 : PRF/Na : PRF/2 - PRF/Na).; S_az fftshift(fft(s_rcmc, Na, 1), 1); Haz exp(-1j * pi * f_eta.^2 / Ka); S_az_comp S_az .* Haz; s_final ifft(ifftshift(S_az_comp, 1), Na, 1);这一步做完理论上点目标会在(eta_c, tauc)附近形成一个峰值。为了更直观可以按方位时间乘以速度把方位轴换成平台位移然后画二维灰度图figure; imagesc(t * c / 2, eta * v, abs(s_final)); xlabel(距离向距离 (m)); ylabel(方位向位置 (m)); title(RD成像结果单点目标); axis equal; axis xy; colorbar;如果你想量化聚焦质量可以在峰值附近切一条距离向剖面和一条方位向剖面量取3dB主瓣宽度再算峰值旁瓣比PSLR。理论值方面距离分辨率5米方位分辨率5米旁瓣受窗函数影响会略高于理论值。加上Hamming窗后主瓣会变宽但旁瓣能压到-40dB量级这也符合雷达信号处理的一般规律。3.5 对照实验不做RCMC会怎样很多读者看完代码会问如果我直接省略RCMC把s_rc拿去方位压缩结果会差多少我在写这版仿真时特意跑了这个对照实验结果非常典型由于徙动量横跨8到9个距离单元方位压缩后目标在方位向上明显拉长峰值下降好几个dB原本清晰的聚焦点变成了一条沿方位向的弥散带。原因也好理解RCMC前同一个目标在不同方位时刻的能量落在不同的距离单元里方位向FFT等于把“不同距离单元、不同相位历史”的片段强行叠加相位对齐被打乱匹配滤波自然失效。这个对照实验强烈建议你自己跑一遍比看十遍公式都有用。4. 常见问题与调试心得4.1 图像峰值位置对不上时间轴基准这是初学最容易遇到的问题出来的二维图峰值不在你认为的坐标上或者干脆跑到图像边缘。原因多半是距离向时间轴和斜距时延的基准没对齐。比如t向量如果从0开始取而参考时延tauc却从负时间算起峰值位置就会整体漂移。我的建议是把距离向时间轴统一成以0为中心同时把目标回波的时延也换算到以0为中心的时间刻度上。每当代码里出现“峰值偏了半个屏”这类情况先别怀疑算法去检查t、tau、tauc三个量的基准是否一致。4.2 距离压缩后旁瓣很高或波形异常如果你做完距离压缩发现sinc波形不对称、底噪很高或者主瓣旁边有一堆毛刺大概率是匹配滤波器构造和发射信号相位符号不一致。前面说过Hr的指数符号取决于你构造回波时用的是exp(j*pi*Kr*t^2)还是exp(-j*pi*Kr*t^2)两者对应的滤波器要取相反的共轭。此外距离向采样率如果刚好等于2倍带宽sinc的副瓣采样点会比较稀疏画出来不太好看。建议至少取4倍带宽过采样。还有一个隐蔽问题fft之后乘滤波器时如果频率轴向量和信号频域排列顺序不一致结果必然错误。务必按照前面代码里fftshift和ifftshift的标准用法来。4.3 方位向始终不聚焦方位压缩后目标还在方位向拖成一条线原因就比较多了。第一检查PRF是否大于多普勒带宽多普勒带宽大约等于|Ka| * Ta例如本仿真约1.5kHzPRF取2kHz是够的。第二检查Ka算得对不对正侧视SAR的Ka 2v^2/(lambda*R0)如果单位混了频谱匹配滤波会完全失效。第三检查方位向匹配滤波器的符号。不同资料对相位符号约定不完全一致算法里方位向信号相位是负二次项所以Haz用了负指数。如果你跑出来不聚焦把Haz取共轭再试一次大概率就是符号问题。你也可以在方位压缩前打印一下s_rcmc的某一列相位看看是不是一个抛物线。如果是方位向处理思路就没错如果不是说明前面距离压缩或RCMC已经把相位搞坏了。4.4 计算太慢怎么办仿真中Na约3800点Nr约1200点两层循环生成回波在MATLAB里大概需要几秒RCMC的逐行spline插值也差不多整体不会太慢。但如果以后场景变大比如方位向几万个脉冲逐行插值就会变成瓶颈。这时可以把回波生成改成矩阵化操作先构造Na x Nr的斜距矩阵然后一次性计算时延矩阵和相位MATLAB的向量化能力会好很多。RCMC也可以用距离频域相位补偿代替逐行插值或者在距离压缩后做sinc插值。但调试阶段建议先用慢而清晰的方式跑通确认每个环节输出正确后再优化性能。下面是排查速查表我调试时基本按这个顺序走问题现象可能原因检查顺序距离压缩后无聚焦匹配滤波器符号错、频率轴错1. 换Hr共轭2. 检查fftshift峰值位置偏移时间轴基准不统一检查t、tau、tauc基准距离旁瓣不对称采样率低、包络未加窗提高Fs到4倍带宽以上方位向不聚焦PRF不足或Ka错误1. 算多普勒带宽2. 换Haz共轭RCMC后边缘毛刺插值外推设置extrapval0检查徙动量范围图像翻转坐标轴方向定义反了用axis xy检查方位向时间正负如果你第一次跑通这个闭环我建议你做一件事把点目标放到不同的R0和eta_c位置再跑一遍完整流程观察距离徙动量和峰值位置怎么变化。SAR成像的“手感”就是在这种一次次调整参数、对照理论值的过程中练出来的。RD算法只是起点但把这个起点真正跑透后面再看CS算法、ωK算法都会轻松很多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进