对象 :
sar_imaging_sim/仓库中由tests/test_area_three_window_bp.py驱动的面目标回波仿真链路
风格 :教授课堂讲授视角 --- "先直观感觉 → 再数学公式 → 最后用跑过的数据把每一步对齐"
主线例子 :三窗口实验的 W0 窗口 (北京 AOI,Sentinel-1A TLE,Sentinel-2 L2A B04 作为 σ₀ 底图)。所有出现的数字都对应data/output/32_three_window/tableA_window_geometry.csv与experiment_log.txt中已经跑出来的实际结果。
整套流程分 五层 来讲,三个**"预备课"**穿插在之间补齐信号处理的先验知识:
| 章节 | 关键产物 | 模块 |
|---|---|---|
| 第 0 课 | 直觉:手电筒 / 啾啾声 | --- |
| 预备 A · 信号与系统速成 | FT、卷积、LTI、LFM chirp、匹配滤波、DFT/Nyquist | --- |
| ① 几何层 | 轨道、可见窗、入射/斜视、参考斜距 R₀ | geometry/orbit.py, geometry/visibility.py, geometry/slant_range.py |
| 预备 B · 从 DFT 到 NUFFT | DFT→FFT→Type-1 NUFFT"spread-FFT-deconvolve" | echo/area_target.py 里 finufft 调用 |
| ② 回波层 | 散射系数场 σ(x,y)、发射 chirp、原始回波 s(η, τ) | scene/sentinel2_basemap.py, pipeline.build_optical_area_scene, echo/area_target.py |
| 预备 C · BP 的哲学 | 延时求和 → 相位补偿 → 驻相 → PSF | imaging/back_projection.py |
| ③ 算法层 | 距离压缩、上采样、BP 时域后向投影 | imaging/range_compress.py, imaging/back_projection.py |
| ④ 评估层 | IRW / PSLR / ISLR(伴随点目标)、面目标真值重投影 | quality/metrics.py, test_area_three_window_bp._truth_projection |
| ⑤ 可视化层 | figA(光学-σ对)、figC(三行三列诊断图)、figD(PT 剖面) | _figure_A_s2_and_scatter, _figure_C_area_triptych, _figure_D_pt_cuts, _replot_figC.py |
课堂口号:几何告诉我们"在哪里看",回波告诉我们"看到什么信号",算法告诉我们"怎样把信号聚焦成像",评估告诉我们"像得好不好",可视化告诉我们"人眼怎么读"。五者缺一不可。
读法建议(按背景分层):
- 本科大二以下 / 无信号处理背景 → A→几何→B→回波→C→算法→评估→可视化,顺序一遍;
- 学过信号与系统、FFT → 跳过 A 直接读几何,在回波层停下来读 B;
- 学过 SAR 基础(CSA/RDA)→ 跳过 A/B,只读 C + 算法层,对比 BP 与频域算法的差异;
- 只想知道 W0 怎么跑出来的 → 直接看"全流程数值回顾"一节。
第 0 课:先建立直观感受
想象你背着一台手电筒(雷达)在夜里飞过北京上空,手电筒的光束不是竖直朝下,而是斜着打向地面,形成一个椭圆的光斑(footprint)。你不是看反射光的强度,而是发一串"啾啾"声(chirp),听回声:
- 声音飞到地面再飞回来要时间 → 这个时间 × 光速 / 2 就是 斜距 R;
- 不同的地块(房顶、水面、公园)把啾啾声反射回来的强度不同 → 这就是 散射系数 σ₀;
- 你在空中匀速飞,连续发 2048 声啾啾 → 得到一个 2D 的回波矩阵 s(η,τ)s(\eta, \tau)s(η,τ),横轴是"快时间"(单次啾啾内部的采样),纵轴是"慢时间"(第几声啾啾);
- 这个原始矩阵在人眼里只是一堆杂乱的条纹,必须再做一次处理(成像算法),才能把每个地块的回波能量"聚焦"回它真正的位置 → 得到一张图像。
面目标 = 很多个点目标叠在一起。核心物理就是:散射相干叠加。每个小地块产生的复回波按复数相加,它们的相位差被地物几何精确编码,聚焦算法做的就是把这个编码反向解开。
预备 A · 信号与系统速成包
在进入几何之前,我们必须先把信号处理的几样核心工具练熟,否则后面的 chirp、匹配滤波、NUFFT、BP 都是"听天书"。这一节没有 SAR,只讲信号与系统,用最短的路径把需要的 7 个知识点讲完。
A.1 复数、相位与复指数
雷达信号一律用复数 表示。一个频率 f0f_0f0 的正弦波在复数下写成:
ej2πf0t = cos(2πf0t)+jsin(2πf0t)(A.1) e^{j 2\pi f_0 t} \;=\; \cos(2\pi f_0 t) + j\sin(2\pi f_0 t) \tag{A.1} ej2πf0t=cos(2πf0t)+jsin(2πf0t)(A.1)
这样写的好处:时延 = 相位旋转 。如果一个信号 s(t)s(t)s(t) 延迟了 ddd 秒变成 s(t−d)s(t-d)s(t−d),那么它的每个频率分量都乘了一个复数 e−j2πfde^{-j2\pi f d}e−j2πfd。这就是整个 SAR 处理链最重要的一条规律:
F{s(t−d)}(f) = S(f)⋅e−j2πfd(A.2) \mathcal{F}\{s(t-d)\}(f) \;=\; S(f)\cdot e^{-j 2\pi f d} \tag{A.2} F{s(t−d)}(f)=S(f)⋅e−j2πfd(A.2)
直观:时间上推晚 = 频域上所有分量都顺时针转一个角度,角度正比于频率。SAR 把"斜距"编码进回波相位,全靠这条。
A.2 傅里叶变换 & 卷积定理
连续傅里叶变换对:
S(f) = ∫−∞∞s(t) e−j2πft dt,s(t) = ∫−∞∞S(f) e+j2πft df(A.3) S(f) \;=\; \int_{-\infty}^{\infty}s(t)\,e^{-j 2\pi f t}\,dt,\qquad s(t) \;=\; \int_{-\infty}^{\infty}S(f)\,e^{+j 2\pi f t}\,df \tag{A.3} S(f)=∫−∞∞s(t)e−j2πftdt,s(t)=∫−∞∞S(f)e+j2πftdf(A.3)
卷积定理:时域卷积 = 频域乘积。
(s1∗s2)(t) = ∫s1(τ) s2(t−τ) dτ⟺S1(f)⋅S2(f)(A.4) (s_1 * s_2)(t) \;=\; \int s_1(\tau)\,s_2(t-\tau)\,d\tau \quad\Longleftrightarrow\quad S_1(f)\cdot S_2(f) \tag{A.4} (s1∗s2)(t)=∫s1(τ)s2(t−τ)dτ⟺S1(f)⋅S2(f)(A.4)
为什么重要 :后面的距离压缩、面目标频域回波生成都会把"时域一长串乘加"转换成"频域一次乘法",再 IFFT 回来。这让 SAR 仿真从 O(N2)O(N^2)O(N2) 掉到 O(NlogN)O(N\log N)O(NlogN)。
A.3 LTI 系统与冲激响应
如果一个系统 H\mathcal{H}H 满足线性 (H{as1+bs2}=aH{s1}+bH{s2}\mathcal{H}\{a s_1 + b s_2\} = a\mathcal{H}\{s_1\} + b\mathcal{H}\{s_2\}H{as1+bs2}=aH{s1}+bH{s2})和时不变 (H{s(t−t0)}=(H{s})(t−t0)\mathcal{H}\{s(t-t_0)\} = (\mathcal{H}\{s\})(t-t_0)H{s(t−t0)}=(H{s})(t−t0)),就叫 LTI 系统。LTI 系统完全由它对 Dirac 冲激 δ(t)\delta(t)δ(t) 的响应 h(t)h(t)h(t) 刻画:
y(t) = (s∗h)(t)(A.5) y(t) \;=\; (s * h)(t) \tag{A.5} y(t)=(s∗h)(t)(A.5)
SAR 信道就是一个 LTI 系统 。发射 p(t)p(t)p(t)、从一个点目标回来的 s(t)=σ⋅p(t−2R/c)⋅e−j2πf0⋅2R/cs(t) = \sigma\cdot p(t - 2R/c)\cdot e^{-j 2\pi f_0 \cdot 2R/c}s(t)=σ⋅p(t−2R/c)⋅e−j2πf0⋅2R/c,就是"冲激→点目标→回波"这个 LTI 系统的响应。整张 SAR 图像的点扩展函数(PSF) 就是成像系统的 hhh。
A.4 LFM chirp:SAR 的标准发射波形
为什么 SAR 不直接发一个窄脉冲 δ(t)\delta(t)δ(t)?因为要发出去能量就必须有持续时间 τ\tauτ,窄脉冲峰值功率高到发射机烧掉。工程上选 线性调频(LFM / chirp) :长脉冲(低峰值功率)但拥有大带宽 BBB,接收端用匹配滤波压回窄脉冲。
p(t) = rect(t/τ) exp(jπKrt2),Kr = B/τ(A.6) p(t) \;=\; \mathrm{rect}(t/\tau)\,\exp(j\pi K_r t^2),\quad K_r \;=\; B/\tau \tag{A.6} p(t)=rect(t/τ)exp(jπKrt2),Kr=B/τ(A.6)
瞬时频率 :finst(t)=12πddt[πKrt2]=Kr tf_{\mathrm{inst}}(t) = \tfrac{1}{2\pi}\tfrac{d}{dt}[\pi K_r t^2] = K_r\,tfinst(t)=2π1dtd[πKrt2]=Krt,从 −B/2-B/2−B/2 线性扫到 +B/2+B/2+B/2。时频图 是一条斜率 KrK_rKr 的直线 --- 这是整个 SAR 教材里 chirp 的标准直观图。
时间-带宽积:
TBP = τ⋅B(A.7) \mathrm{TBP} \;=\; \tau\cdot B \tag{A.7} TBP=τ⋅B(A.7)
Sentinel-1 的 TBP =41.75 μs×56.5 MHz≈2360= 41.75\,\mu s \times 56.5\,\mathrm{MHz} \approx 2360=41.75μs×56.5MHz≈2360 --- 意思是"一个长 41.75 μs 的脉冲,匹配滤波后可以被压缩成 1/2360 倍长(≈ 17.7 ns)的窄主瓣"。这就是 脉冲压缩。
A.5 匹配滤波:雷达的"开罐器"
问题 :回波 s(t)=p(t−d)+n(t)s(t) = p(t-d) + n(t)s(t)=p(t−d)+n(t),n(t)n(t)n(t) 是白噪声,怎么在输出端使峰值 SNR 最大?
答案 :用 h(t)=p∗(−t)h(t) = p^*(-t)h(t)=p∗(−t) 做卷积,这是匹配滤波器。频域里它等价于:
H(f) = P∗(f)⟹Y(f) = P(f) P∗(f) e−j2πfd = ∣P(f)∣2 e−j2πfd(A.8) H(f) \;=\; P^*(f) \quad\Longrightarrow\quad Y(f) \;=\; P(f)\,P^*(f)\,e^{-j 2\pi f d} \;=\; |P(f)|^2\,e^{-j 2\pi f d} \tag{A.8} H(f)=P∗(f)⟹Y(f)=P(f)P∗(f)e−j2πfd=∣P(f)∣2e−j2πfd(A.8)
输出:
y(t) = F−1{∣P(f)∣2}(t−d)(A.9) y(t) \;=\; \mathcal{F}^{-1}\{|P(f)|^2\}(t-d) \tag{A.9} y(t)=F−1{∣P(f)∣2}(t−d)(A.9)
即发射信号的自相关函数 ,中心在真实延迟 t=dt=dt=d 处。对 LFM,自相关是一个 sinc\mathrm{sinc}sinc,主瓣宽度 ≈ 1/B,旁瓣 −13.3 dB。
直观:匹配滤波 = 把发射信号的每个频率分量按它自己的能量反向相加(把能量都收拢到同相位的一点)。这是**距离压缩(range compression)**的数学基础,在 SAR 成像第一步就用它。
A.6 DFT、FFT、采样定理
实际信号离散后用 DFT:
Xn = ∑k=0N−1xk e−j2πkn/N,n=0,...,N−1(A.10) X_n \;=\; \sum_{k=0}^{N-1} x_k\,e^{-j 2\pi k n / N},\qquad n=0,\ldots,N-1 \tag{A.10} Xn=k=0∑N−1xke−j2πkn/N,n=0,...,N−1(A.10)
朴素实现 O(N2)O(N^2)O(N2);FFT 用分治把同一个和拆成"偶数项 + 奇数项"递归,降到 O(NlogN)O(N\log N)O(NlogN)。SAR 每个脉冲 FFT/IFFT 是性能关键路径。
Nyquist 采样定理 :若最高频率为 BBB,采样率必须 ≥2B\geq 2B≥2B(复基带可以 ≥B\geq B≥B)。我们的 Fs=64.35F_s=64.35Fs=64.35 MHz > B=56.5B=56.5B=56.5 MHz,留了大约 14% 过采样余量。
A.7 小小示例:一个点目标发射-接收-压缩
让我们用一个完整的玩具例子把 A.1--A.6 串起来。假设:f0=1f_0 = 1f0=1 GHz,B=100B=100B=100 MHz,τ=10\tau=10τ=10 μs,一个点目标距离 R=1.5R=1.5R=1.5 km → d=2R/c=10d=2R/c=10d=2R/c=10 μs。
- 发射 p(t)p(t)p(t)(式 A.6,Kr=1013K_r = 10^{13}Kr=1013 Hz/s);
- 传播 :回波 s(t)=p(t−d)⋅e−j2πf0ds(t) = p(t-d)\cdot e^{-j 2\pi f_0 d}s(t)=p(t−d)⋅e−j2πf0d。注意那个相位常数 e−j2πf0de^{-j 2\pi f_0 d}e−j2πf0d --- 对本例 f0d=104f_0 d = 10^4f0d=104 整数圈的附近的小数部分,肉眼看不出但它就是SAR 的全部信息载体;
- 匹配滤波 (式 A.9):输出是 sinc(B(t−d))⋅e−j2πf0d\mathrm{sinc}\big(B(t-d)\big)\cdot e^{-j 2\pi f_0 d}sinc(B(t−d))⋅e−j2πf0d。主瓣宽度 1/B=101/B = 101/B=10 ns,对应斜距分辨率 c/(2B)=1.5c/(2B) = 1.5c/(2B)=1.5 m;
- 把峰值位置读出来 :d=10 μsd=10\,\mu sd=10μs → R=1500R=1500R=1500 m ✓。
到此为止你已经掌握了 SAR 回波的全部微观原理。剩下的只是:把一个点变成很多个点(面目标),把一个脉冲变成很多个脉冲(合成孔径),把 3D 几何替换掉 "距离 = d·c/2" 这个一维关系。
第一层 · 几何层
1.1 直观:从"卫星在哪"到"波束照哪"
一条 LEO 轨道每 95 min 绕地一圈。我们有三件事要从轨道解出来:
- 在一段扫描时间(比如 24 h)里,卫星什么时候 能看到 AOI? → 可见窗
window; - 在窗口中点,卫星的 ECEF 位置 rs\mathbf{r}_srs、速度 vs\mathbf{v}_svs、高度 HHH 是多少?
- 从 rs\mathbf{r}srs 到场景中心 rc\mathbf{r}crc 的斜距 R0R_0R0、入射角 θinc\theta{\text{inc}}θinc、斜视角 θsq\theta{\text{sq}}θsq、侧视方向是左是右?
1.2 数学:轨道 + 斜距 + 多普勒
TLE → 状态向量。给定 Sentinel-1A 的 TLE,SGP4 在每个历元给出 ECEF 位置和速度:
(rs(t)vs(t))=SGP4(TLE,t)(1) \begin{pmatrix}\mathbf{r}_s(t)\\ \mathbf{v}_s(t)\end{pmatrix} = \text{SGP4}(\text{TLE}, t) \tag{1} (rs(t)vs(t))=SGP4(TLE,t)(1)
参考斜距(从卫星到场景中心):
R0=∥rs−rc∥(2) R_0 = \lVert \mathbf{r}_s - \mathbf{r}_c \rVert \tag{2} R0=∥rs−rc∥(2)
入射角 (地面天顶方向 u^=rc/∥rc∥\hat{\mathbf{u}} = \mathbf{r}_c/\lVert\mathbf{r}_c\rVertu^=rc/∥rc∥ 与视线方向夹角):
cosθinc = (rs−rc)⋅u^R0(3) \cos \theta_{\text{inc}} \;=\; \frac{(\mathbf{r}_s - \mathbf{r}_c)\cdot \hat{\mathbf{u}}}{R_0} \tag{3} cosθinc=R0(rs−rc)⋅u^(3)
斜视角(速度方向在视线方向上的投影):
sinθsq = vs⋅(rc−rs)∥vs∥⋅R0(4) \sin \theta_{\text{sq}} \;=\; \frac{\mathbf{v}_s \cdot (\mathbf{r}_c - \mathbf{r}_s)}{\lVert\mathbf{v}_s\rVert \cdot R_0} \tag{4} sinθsq=∥vs∥⋅R0vs⋅(rc−rs)(4)
多普勒中心频率:
fDC = 2 Vr sinθsqλ(5) f_{\text{DC}} \;=\; \frac{2\,V_r\,\sin\theta_{\text{sq}}}{\lambda} \tag{5} fDC=λ2Vrsinθsq(5)
合成孔径时间 (达到给定方位分辨率 δaz\delta_{\text{az}}δaz 所需的照射时间):
Ta = λ R02 Vr δaz(6) T_a \;=\; \frac{\lambda\, R_0}{2\, V_r\, \delta_{\text{az}}} \tag{6} Ta=2VrδazλR0(6)
3 dB 方位波束宽度:
θbwaz = 0.886 λLaz(7) \theta_{\text{bw}}^{\text{az}} \;=\; 0.886\,\frac{\lambda}{L_{\text{az}}} \tag{7} θbwaz=0.886Lazλ(7)
距离分辨率(带宽主导,与几何几乎无关):
δr = c2B(8) \delta_r \;=\; \frac{c}{2B} \tag{8} δr=2Bc(8)
方位分辨率(天线主导,等于天线半长):
δaz = Laz2(9) \delta_{\text{az}} \;=\; \frac{L_{\text{az}}}{2} \tag{9} δaz=2Laz(9)
双曲斜距历程 (某个散射体 kkk 相对于场景中心有 rkr_krk 的距离偏移、aka_kak 的方位偏移时,随慢时间 η 变化):
Rk(η) = R0,k2+Vr2 (η−ηc,k)2−2 R0,k Vr (η−ηc,k) sinθsq(10) R_k(\eta) \;=\; \sqrt{R_{0,k}^2 + V_r^2\,(\eta - \eta_{c,k})^2 - 2\, R_{0,k}\, V_r\,(\eta - \eta_{c,k})\,\sin\theta_{\text{sq}}} \tag{10} Rk(η)=R0,k2+Vr2(η−ηc,k)2−2R0,kVr(η−ηc,k)sinθsq (10)
其中 R0,k=R0+rkR_{0,k} = R_0 + r_kR0,k=R0+rk,ηc,k=R0,ksinθsq/Vr\eta_{c,k} = R_{0,k}\sin\theta_{\text{sq}}/V_rηc,k=R0,ksinθsq/Vr 是 波束中心穿越时刻 。slant_range.py::FlatEarthGeometry.slant_range 就是这一条公式。
1.3 数值例子:W0 窗口
tableA_window_geometry.csv 里 W0 行:
| 量 | 值 | 来源 |
|---|---|---|
| UTC 起 / 止 | 2026-04-15 T08:36:21.234Z → T08:36:55.594Z | JSVF + PPTD 扫描 |
| 窗口时长 | 34.359 s | window.duration |
| 入射角 θinc\theta_{\text{inc}}θinc | 59.099° | 式 (3) |
| 斜视角 θsq\theta_{\text{sq}}θsq | +0.036° | 式 (4) |
| 斜距 R0R_0R0 | 1688.497 km | 式 (2) |
| 高度 HHH | 691.404 km | ECEF → 大地 |
| 速度 VrV_rVr | 7591.95 m/s | ∥vs∥\lVert\mathbf{v}_s\rVert∥vs∥ |
| 侧视 | 左视(L) | look_side 符号 |
| 地距分辨率 | 3.09 m | δr/sinθinc\delta_r / \sin\theta_{\text{inc}}δr/sinθinc |
| 方位分辨率 | 6.15 m | 式 (9) + 几何修正 |
| Na_full | 59099 脉冲 | ⌈PRF⋅Twin⌉\lceil \text{PRF}\cdot T_{\text{win}}\rceil⌈PRF⋅Twin⌉ |
| Na_use | 2048 | NA_CAP |
| Nr | 4096 | NR_USE |
把 W0 的数代入验算几个关键公式(λ = c/f₀ = 3e8/5.405e9 ≈ 0.0555 m):
- 式 (7) :θbwaz=0.886×0.0555/12.3≈4.0\theta_{\text{bw}}^{\text{az}} = 0.886 \times 0.0555 / 12.3 \approx 4.0θbwaz=0.886×0.0555/12.3≈4.0 mrad;
- 式 (6) :Ta=0.0555×1.688 × 106/(2×7592×6.15)≈1.0T_a = 0.0555 \times 1.688\!\times\!10^6 / (2 \times 7592 \times 6.15) \approx 1.0Ta=0.0555×1.688×106/(2×7592×6.15)≈1.0 s;
- 波束在地面的方位足印 Faz=R0⋅θbwaz≈1688km×4mrad≈6.75F_{\text{az}} = R_0 \cdot \theta_{\text{bw}}^{\text{az}} \approx 1688 \text{km} \times 4 \text{mrad} \approx 6.75Faz=R0⋅θbwaz≈1688km×4mrad≈6.75 km;
- 式 (5) :fDC≈2×7592×sin(0.036°)/0.0555≈172f_{\text{DC}} \approx 2 \times 7592 \times \sin(0.036°)/0.0555 \approx 172fDC≈2×7592×sin(0.036°)/0.0555≈172 Hz(几乎零多普勒,正侧视几何)。
直观结论 :W0 是一次高入射(59°)、几乎零斜视、左视、斜距 1688 km 的 34 s 长观测。因为仿真用到 Na_full=59099 太贵,我们在
NA_CAP=2048处截断 --- 这等价于仍然照够 Tₐ(=1 s) × PRF(=1720) ≈ 1720 脉冲的物理合成孔径,对 Doppler 支撑不构成损失。
预备 B · 从 DFT 到 NUFFT
回波层里最让学生卡住的一句话是:"把 ∑kσke−j2πdk(f0+fn)\sum_k \sigma_k e^{-j 2\pi d_k(f_0+f_n)}∑kσke−j2πdk(f0+fn) 写成 Type-1 NUFFT"。本节把 FFT → NUFFT 的递进关系用最朴素的方式讲清楚。
B.1 DFT 的代数形式
DFT 就是这样一个求和(式 A.10 重抄):
Xn = ∑k=0K−1bk e−j2πkn/N,n=0,1,...,N−1(B.1) X_n \;=\; \sum_{k=0}^{K-1} b_k \,e^{-j 2\pi k n / N},\quad n=0,1,\ldots,N-1 \tag{B.1} Xn=k=0∑K−1bke−j2πkn/N,n=0,1,...,N−1(B.1)
关键特征:输入下标 kkk 均匀(0,1,...,K−1),输出下标 nnn 也均匀。这一"双重均匀性"让 FFT 能做分治。
B.2 朴素 DFT → FFT 的分治(一分钟版)
把 N=2MN=2MN=2M 偶奇分开:
Xn=∑m=0M−1b2m e−j2πmn/M⏟En + e−j2πn/N⋅∑m=0M−1b2m+1 e−j2πmn/M⏟On(B.2) X_n = \underbrace{\sum_{m=0}^{M-1} b_{2m}\,e^{-j 2\pi m n / M}}{E_n} \;+\; e^{-j 2\pi n / N}\cdot\underbrace{\sum{m=0}^{M-1} b_{2m+1}\,e^{-j 2\pi m n / M}}_{O_n} \tag{B.2} Xn=En m=0∑M−1b2me−j2πmn/M+e−j2πn/N⋅On m=0∑M−1b2m+1e−j2πmn/M(B.2)
- En,OnE_n, O_nEn,On 各是一个 N/2N/2N/2 长的 DFT;
- 每层合并是 O(N)O(N)O(N);
- 递归深度 log2N\log_2 Nlog2N;
- 总复杂度 O(NlogN)O(N\log N)O(NlogN)。
记住两件事:FFT 要求 (i) 输入点均匀、(ii) 输出频率均匀。一旦破坏任何一条,就不能直接 FFT,需要 NUFFT。
B.3 SAR 里为什么 "均匀性" 被打破?
回波频谱(主文式 15):
E(fn;ηi) = P(fn)∑kσk(ηi) e−j2πdk(ηi)(f0+fn)(B.3) E(f_n;\eta_i) \;=\; P(f_n)\sum_k \sigma_k(\eta_i)\,e^{-j 2\pi d_k(\eta_i)(f_0 + f_n)} \tag{B.3} E(fn;ηi)=P(fn)k∑σk(ηi)e−j2πdk(ηi)(f0+fn)(B.3)
把 dkd_kdk 提出来,归一化到 xk=2πdkΔfx_k = 2\pi d_k \Delta fxk=2πdkΔf(Δf=Fs/Nr\Delta f = F_s/N_rΔf=Fs/Nr 是频率轴间距),并把常数 f0f_0f0 部分并入 bkb_kbk:
Sn = ∑kbk e−jxk n,bk=σk e−j2πf0dk(B.4) S_n \;=\; \sum_k b_k\,e^{-j x_k\,n},\quad b_k = \sigma_k\,e^{-j 2\pi f_0 d_k} \tag{B.4} Sn=k∑bke−jxkn,bk=σke−j2πf0dk(B.4)
和 (B.1) 比一下:输出 n=0,...,N−1n=0,\ldots,N-1n=0,...,N−1 仍然均匀,但输入点 xkx_kxk 不再是整数 2πk/N2\pi k/N2πk/N 的倍数 ------ 因为 dkd_kdk 来自真实斜距 RkR_kRk,散射体空间位置是任意的,xkx_kxk 是连续实数。
结论 :这是一个经典 Type-1 NUFFT(Non-Uniform → Uniform)。
B.4 NUFFT 的三种类型(一张表)
| 类型 | 输入 | 输出 | 典型用途 |
|---|---|---|---|
| Type-1 | 非均匀源点 xkx_kxk + 系数 bkb_kbk | 均匀频栅 SnS_nSn | 散射体 → 均匀频谱 (我们用) |
| Type-2 | 均匀频栅系数 f^n\hat f_nf^n | 非均匀样点 g(xk)g(x_k)g(xk) | 从图像/谱反投影到任意点 |
| Type-3 | 非均匀 → 非均匀 | 通用插值 FT | 椭圆 MRI 等罕见场景 |
B.5 Type-1 NUFFT 的三步直观算法("spread-FFT-deconvolve")
把连续求和 (B.4) 理解成"把 K 个 δ 函数撒在连续 xxx 轴上再做 FT"。物理实现分三步:
① Spread(网格化) :选一个比目标 NNN 大 σ\sigmaσ 倍的细网格(如 σ=2\sigma=2σ=2),把每个 (xk,bk)(x_k, b_k)(xk,bk) 用一个紧支 kernel ψ\psiψ (如截断高斯或 Kaiser-Bessel) 散布到附近几个格点上:
b~(xp) = ∑kbk ψ(xp−xk)(B.5) \tilde b(x_p) \;=\; \sum_k b_k\,\psi(x_p - x_k) \tag{B.5} b~(xp)=k∑bkψ(xp−xk)(B.5)
② FFT :对均匀网格 b~(xp)\tilde b(x_p)b~(xp) 做普通 FFT,得 S~n\tilde S_nS~n。
③ Deconvolve(谱域修正) :由于第①步用 ψ\psiψ 涂抹过,FFT 输出已被 ψ^(n)\hat\psi(n)ψ^(n) 乘过,除回来:
Sn = S~n / ψ^(n)(B.6) S_n \;=\; \tilde S_n \,/\, \hat\psi(n) \tag{B.6} Sn=S~n/ψ^(n)(B.6)
总复杂度 :O(K+NlogN)O(K + N\log N)O(K+NlogN),远好于朴素 O(KN)O(KN)O(KN)。finufft 库实现用 Kaiser-Bessel kernel,精度由 eps 控制(我们用 eps=1e-9)。
B.6 对照代码:area_target.py 里的 NUFFT 调用
4:423:sar_imaging_sim/src/sar_sim/echo/area_target.py
b = s * np.exp(-1j * 2.0 * np.pi * f0 * d)
x = (2.0 * np.pi * d * df) % (2.0 * np.pi)
x = np.where(x > np.pi, x - 2.0 * np.pi, x)
S_sum = _finufft.nufft1d1(
x.astype(np.float64),
b.astype(np.complex128),
nfft,
isign=-1,
eps=1e-9,
modeord=0,
)
x = 2π d df mod 2π:把非均匀源点映射到 [−π,π)[-\pi, \pi)[−π,π) 区间(finufft约定);b = σ · exp(-j 2π f₀ d):对应 (B.4) 定义的权重;nfft:输出均匀频栅点数;isign=-1:取与 SAR 习惯相符的时延相位符号;modeord=0:fftshift-centered 输出。
B.7 一分钟迷你手算:K=2, N=4
为了看清 NUFFT 在做什么,取一个极小的例子:
- 两个散射体:(x0,b0)=(0.3π, 1)(x_0,b_0)=(0.3\pi,\,1)(x0,b0)=(0.3π,1),(x1,b1)=(−0.7π, 2)(x_1,b_1)=(-0.7\pi,\,2)(x1,b1)=(−0.7π,2);
- 输出频栅 4 点:n=−2,−1,0,1n=-2,-1,0,1n=−2,−1,0,1。
按 (B.4):
Sn=b0e−jx0n+b1e−jx1n S_n = b_0 e^{-j x_0 n} + b_1 e^{-j x_1 n} Sn=b0e−jx0n+b1e−jx1n
得:
- S0=1+2=3S_0 = 1+2 = 3S0=1+2=3;
- S−1=ej0.3π+2e−j0.7πS_{-1} = e^{j 0.3\pi} + 2 e^{-j 0.7\pi}S−1=ej0.3π+2e−j0.7π;
- S1=e−j0.3π+2ej0.7πS_{1} = e^{-j 0.3\pi} + 2 e^{j 0.7\pi}S1=e−j0.3π+2ej0.7π;
- S−2=ej0.6π+2e−j1.4πS_{-2} = e^{j 0.6\pi} + 2 e^{-j 1.4\pi}S−2=ej0.6π+2e−j1.4π。
直接这样算 O(KN)=8O(KN)=8O(KN)=8 次复乘。K=10⁴, N=4096 就是 4×10⁷ ------ 一个脉冲 30 ms;2048 脉冲 60 s。NUFFT 降到 O(K+NlogN)≈5×104O(K + N\log N) \approx 5\times 10^4O(K+NlogN)≈5×104,单脉冲 < 1 ms。这就是本仿真能跑起来的根本原因。
B.8 Type-1 / Type-2 与 BP 的关系(预告)
- 回波生成(本预备 B)用 Type-1 :散射体位置是非均匀源 xkx_kxk,目标是均匀频谱 SnS_nSn;
- BP 如果也要用 NUFFT 加速 ,方向相反:距离压缩后的均匀时域样本 → 非均匀像素上的值,就是 Type-2。
本仓库的 BP(back_projection.py)目前用"上采样+线性插值"实现,概念上等价于 Type-2 NUFFT 的朴素近似。把它理解成"逆向 NUFFT"对后面的 BP 推导非常有帮助。
第二层 · 回波层
2.1 直观:地面不是一个点,而是一张"σ₀ 图片"
面目标 = 一张数字图片,每个像素存一个复数散射系数 σ(x,y)。我们用 Sentinel-2 光学底图 B04(红波段,10 m/px)作为 σ 的灰度代理,然后把这张图"撒"成一堆空间散点(每 5 m 一个),每一个散点都是一个小点目标。最终的回波是所有点目标回波的相干叠加。
为什么要相干叠加? --- 因为 SAR 分辨单元里有很多随机相位散射体,它们的复数和服从中心极限定理 → 产生散斑(speckle)。这是 SAR 图像"颗粒感"的物理根源。
2.2 光学反射率 → σ₀
Sentinel-2 L2A 整数栅格值 DN ∈ [0, 10000],除以 BOA_QUANTIFICATION_VALUE 得到表面反射率:
ρ(x,y) = DN(x,y) / 10000(11) \rho(x,y) \;=\; \text{DN}(x,y)\,/\,10000 \tag{11} ρ(x,y)=DN(x,y)/10000(11)
然后我们做一次 百分位 + gamma 拉伸,把 Sentinel-2 在北京场景 [0.10, 0.40] 的窄动态范围撑开到 SEMUS 式 [0, 1]:
σ(x,y) = (clip (ρ−ρploρphi−ρplo, 0,1))γ(12) \sigma(x,y) \;=\; \Big(\mathrm{clip}\!\Big(\tfrac{\rho - \rho_{p_{\mathrm{lo}}}}{\rho_{p_{\mathrm{hi}}} - \rho_{p_{\mathrm{lo}}}},\, 0, 1\Big)\Big)^{\gamma} \tag{12} σ(x,y)=(clip(ρphi−ρploρ−ρplo,0,1))γ(12)
默认 plo=5, phi=95, γ=1.5p_{\mathrm{lo}}=5,\ p_{\mathrm{hi}}=95,\ \gamma=1.5plo=5, phi=95, γ=1.5(见 test_area_three_window_bp.py 对 SARSIM_REFL_STRETCH / SARSIM_REFL_GAMMA 的读取)。再乘上一个随机相位(或不乘 --- W0 默认关闭显式散斑,让 SEMUS-式 sinc² 天线方向图加密集散点自然涌现散斑)。
2.3 发射信号:线性调频 chirp
发射脉冲是一段 LFM chirp,调频率 Kr=B/τK_r = B/\tauKr=B/τ:
p(t) = rect (t/τ) exp (jπKrt2)(13) p(t) \;=\; \mathrm{rect}\!\big(t/\tau\big)\,\exp\!\big(j\pi K_r t^2\big) \tag{13} p(t)=rect(t/τ)exp(jπKrt2)(13)
其频谱 P(f)=F{p(t)}P(f) = \mathcal{F}\{p(t)\}P(f)=F{p(t)},由 _build_reference_chirp_spectrum 数值地算好。
2.4 频域回波生成公式(核心)
对一个散射体 kkk,发射→地面→回收总路径长为 2Rk2 R_k2Rk,往返时延 dk=2Rk/cd_k = 2R_k/cdk=2Rk/c。单点目标频域回波是"发射谱 × 散射系数 × 往返延迟相位":
Ek(f) = P(f) σk exp (−j 2π dk (f0+f))(14) E_k(f) \;=\; P(f)\,\sigma_k\,\exp\!\big(-j\,2\pi\,d_k\,(f_0 + f)\big) \tag{14} Ek(f)=P(f)σkexp(−j2πdk(f0+f))(14)
把所有散射体相加(线性系统叠加原理)得到面目标的每脉冲频域回波:
E(f;ηi) = P(f)∑kσk(ηi) exp (−j 2π dk(ηi) (f0+f)) (15) \boxed{\;E(f;\eta_i) \;=\; P(f)\sum_{k}\sigma_k(\eta_i)\,\exp\!\big(-j\,2\pi\,d_k(\eta_i)\,(f_0+f)\big)\;} \tag{15} E(f;ηi)=P(f)k∑σk(ηi)exp(−j2πdk(ηi)(f0+f))(15)
再做 IFFT 得到这一脉冲的时域回波行:
s(τ;ηi) = F−1{E(f;ηi)}(τ)(16) s(\tau;\eta_i) \;=\; \mathcal{F}^{-1}\big\{E(f;\eta_i)\big\}(\tau) \tag{16} s(τ;ηi)=F−1{E(f;ηi)}(τ)(16)
把 σk(ηi)\sigma_k(\eta_i)σk(ηi) 记成"天线方向图加权后的有效散射系数":
σk(ηi) = σk⋅Gant(Δθaz,k(ηi), Δθel,k)(17) \sigma_k(\eta_i) \;=\; \sigma_k \cdot G_{\text{ant}}(\Delta\theta_{az,k}(\eta_i),\,\Delta\theta_{el,k}) \tag{17} σk(ηi)=σk⋅Gant(Δθaz,k(ηi),Δθel,k)(17)
SEMUS 风格 sinc² 天线方向图 (area_target.py L337-348):
Gant(θaz,θel) = sinc2 (0.886 θazθbwaz)⋅sinc2 (0.886 θelθbwel)(18) G_{\text{ant}}(\theta_{az},\theta_{el}) \;=\; \mathrm{sinc}^2\!\Big(\tfrac{0.886\,\theta_{az}}{\theta_{\text{bw}}^{az}}\Big) \cdot \mathrm{sinc}^2\!\Big(\tfrac{0.886\,\theta_{el}}{\theta_{\text{bw}}^{el}}\Big) \tag{18} Gant(θaz,θel)=sinc2(θbwaz0.886θaz)⋅sinc2(θbwel0.886θel)(18)
2.5 NUFFT 加速
直接按式 (15) 做 KKK 散射体 × NrN_rNr 频点的外积会是 O(KNr)O(K N_r)O(KNr),W0 场景下 K ≈ 10⁴, N_r=4096,单脉冲要 4×10⁷ 复乘,2048 脉冲则是 8×10¹⁰ --- 不可接受。
观察到 (15) 等价于:
S(fn) = ∑kbk e−jxkn,bk=σke−j2πf0dk, xk=2π dk Δf(19) S(f_n) \;=\; \sum_k b_k\, e^{-j x_k n},\qquad b_k = \sigma_k e^{-j2\pi f_0 d_k},\ \ x_k = 2\pi\,d_k\,\Delta f \tag{19} S(fn)=k∑bke−jxkn,bk=σke−j2πf0dk, xk=2πdkΔf(19)
这是 Type-1 NUFFT :非均匀源点 xk→x_k \toxk→ 均匀频栅 nnn。用 finufft.nufft1d1 把复杂度降到 O(K+NrlogNr)O(K + N_r \log N_r)O(K+NrlogNr),对 K=10⁴ 是 ~100× 加速。area_target.py L412-423 正是这段;L440-462 还有"NUFFT vs brute-force"自一致性校验,跑时打印 rel_err。
2.6 数值例子:W0 的回波生成
- 场景 :8 km × 8 km 散点 patch(±4.4\pm 4.4±4.4 km),5 m × 5 m 间距 → 1600 × 1600 ≈ 2.56×10⁶ 网格点。被 AOI 多边形 inside_mask 过滤后 K ≈ 10⁴ 有效散射体。
- chirp :BBB=56.5 MHz,τ\tauτ=41.75 μs,Kr=56.5 × 106/41.75 × 10−6≈1.35 × 1012K_r = 56.5\!\times\!10^6/41.75\!\times\!10^{-6} \approx 1.35\!\times\!10^{12}Kr=56.5×106/41.75×10−6≈1.35×1012 Hz/s;
- 往返时延范围 :2R0/c≈11.262 R_0/c \approx 11.262R0/c≈11.26 ms(τ0\tau_0τ0),每脉冲 4096 个快时间样本跨 4096/Fs=63.64096/F_s = 63.64096/Fs=63.6 μs,对应斜距厚度 c⋅63.6μs/2≈9.5c\cdot 63.6\mu s / 2 \approx 9.5c⋅63.6μs/2≈9.5 km ------ 覆盖整个 6 km patch 还有余量;
- sinc² 方向图 :在 W0 的 θbwaz=4.0\theta_{\text{bw}}^{\text{az}}=4.0θbwaz=4.0 mrad、θbwel≈0.886λ/0.821≈60\theta_{\text{bw}}^{\text{el}}\approx 0.886\lambda/0.821 \approx 60θbwel≈0.886λ/0.821≈60 mrad 下,中心波束内增益 ≈ 1,边缘衰减到 3% 左右(
_beam_accept=1.5)→ 单脉冲参与相干和的有效散射体 ~10³; - 回波矩阵:shape=(2048, 4096) 复数 → 128 MiB;
- 总耗时 :
area_elapsed_s = 92.11 s(tableA)--- 其中 NUFFT 吃掉大约一半。
预备 C · BP 的哲学:时延求和 + 相位补偿
直接抛出公式 (23) 的学生十有八九会懵。本节从阵列信号处理的最基本想法开始,用一个一维迷你例子把 BP 的全部逻辑走一遍,再映射到 SAR。
C.1 最朴素的问题:延时求和(Delay-and-Sum Beamforming)
想象岸边排着 NaN_aNa 个话筒(传感器),海里有一个点源(声源)发出短脉冲 p(t)p(t)p(t)。第 iii 个话筒的位置是 ri\mathbf{r}_iri,它接收到的信号是源在 p\mathbf{p}p 处发出的 p(t−di)p(t-d_i)p(t−di),di=∥p−ri∥/vd_i = \lVert\mathbf{p}-\mathbf{r}_i\rVert / vdi=∥p−ri∥/v(vvv 是传播速度)。
核心想法 :如果我们知道(或猜测)源的位置 p\mathbf{p}p,就可以对每个话筒把信号往前平移 did_idi,再把所有话筒叠加起来:
I(p) = ∑i=1Nasi (t=di(p))(C.1) I(\mathbf{p}) \;=\; \sum_{i=1}^{N_a} s_i\!\big(t=d_i(\mathbf{p})\big) \tag{C.1} I(p)=i=1∑Nasi(t=di(p))(C.1)
- 如果猜对了 p\mathbf{p}p:每个话筒的 si(di)s_i(d_i)si(di) 都恰好是 p(0)p(0)p(0)(脉冲峰值),叠加后得到 Na⋅p(0)N_a\cdot p(0)Na⋅p(0),信号叠加;
- 如果猜错了:每个话筒的 si(di)s_i(d_i)si(di) 落在 p(Δi)p(\Delta_i)p(Δi) 上,Δi\Delta_iΔi 随 iii 变化,叠加时相互抵消 / 平均到接近零。
这就是 Delay-and-Sum Beamforming 的全部秘密。声呐、医学超声、WiFi 多天线定位,原理一致。
C.2 加一层"相位补偿"------从 DAS 到 BP
如果载波是 f0f_0f0,信号在延迟 did_idi 后除了时间平移,还会乘上 e−j2πf0die^{-j 2\pi f_0 d_i}e−j2πf0di(见式 A.2)。这时仅仅对齐时间 不够,各路信号的载波相位 还会错开 2πf0di2\pi f_0 d_i2πf0di 弧度,相干求和时仍然互相抵消。因此必须在时间对齐的同时,再把这个载频相位乘回去:
I(p) = ∑i=1Nasi (di(p))⋅e+j2πf0⋅di(p)⏟相位补偿(C.2) I(\mathbf{p}) \;=\; \sum_{i=1}^{N_a} s_i\!\big(d_i(\mathbf{p})\big)\cdot \underbrace{e^{+j 2\pi f_0 \cdot d_i(\mathbf{p})}}_{\text{相位补偿}} \tag{C.2} I(p)=i=1∑Nasi(di(p))⋅相位补偿 e+j2πf0⋅di(p)(C.2)
这条公式就是 BP 的灵魂 。把 di=2Ri/cd_i = 2R_i/cdi=2Ri/c 代入、f0/c=1/λf_0/c = 1/\lambdaf0/c=1/λ,得到:
I(p) = ∑isi (2Ri/c)⋅e+j4πRi/λ(C.3) I(\mathbf{p}) \;=\; \sum_i s_i\!\big(2R_i/c\big)\cdot e^{+j 4\pi R_i/\lambda} \tag{C.3} I(p)=i∑si(2Ri/c)⋅e+j4πRi/λ(C.3)
与主文 式 (23) 完全一致。唯一的区别是 SAR 里的 sis_isi 已经是距离压缩后的 e^R\hat e_Re^R,所以单个 sis_isi 在 R=RiR=R_iR=Ri 处已经是 sinc 峰值。
C.3 一维迷你例子:两个传感器聚焦一个点
设定(纯数字):
- 两个传感器 r1=(−50,0)\mathbf{r}_1=(-50,0)r1=(−50,0),r2=(+50,0)\mathbf{r}_2=(+50,0)r2=(+50,0) m;
- 真实点源 p0=(0,100)\mathbf{p}_0 = (0, 100)p0=(0,100) m,发射 f0=10f_0=10f0=10 GHz 的单音(λ=3\lambda=3λ=3 cm);
- 两传感器收到的相位(忽略幅度):
- R1=502+1002=111.80R_1=\sqrt{50^2+100^2}=111.80R1=502+1002 =111.80 m → ϕ1=−2πR1/λ mod 2π\phi_1 = -2\pi R_1/\lambda \bmod 2\piϕ1=−2πR1/λmod2π;
- R2=R_2=R2= 同 R1=111.80R_1=111.80R1=111.80 m → ϕ2=ϕ1\phi_2=\phi_1ϕ2=ϕ1。
尝试聚焦到真实位置 p0\mathbf{p}_0p0:
I(p0)=ejϕ1e+j2πR1/λ+ejϕ2e+j2πR2/λ=1+1=2 I(\mathbf{p}_0) = e^{j\phi_1} e^{+j 2\pi R_1/\lambda} + e^{j\phi_2} e^{+j 2\pi R_2/\lambda} = 1 + 1 = 2 I(p0)=ejϕ1e+j2πR1/λ+ejϕ2e+j2πR2/λ=1+1=2
尝试聚焦到假位置 pf=(10,100)\mathbf{p}_f = (10, 100)pf=(10,100) m:
- R1′=602+1002=116.62R_1' = \sqrt{60^2 + 100^2} = 116.62R1′=602+1002 =116.62 m,R2′=402+1002=107.70R_2' = \sqrt{40^2 + 100^2} = 107.70R2′=402+1002 =107.70 m;
- 第一路增量:ej2π(R1′−R1)/λ=ej2π(4.82)/0.03e^{j 2\pi (R_1'-R_1)/\lambda} = e^{j 2\pi (4.82)/0.03}ej2π(R1′−R1)/λ=ej2π(4.82)/0.03;
- 4.82/0.03≈160.674.82/0.03 \approx 160.674.82/0.03≈160.67,取小数 0.67 → 相位 2π×0.67≈4.212\pi\times 0.67 \approx 4.212π×0.67≈4.21 rad;
- 第二路:(R2′−R2)/λ=−4.10/0.03≈−136.67(R_2'-R_2)/\lambda = -4.10/0.03 \approx -136.67(R2′−R2)/λ=−4.10/0.03≈−136.67,小数 −0.67-0.67−0.67 → 相位 ≈−4.21\approx -4.21≈−4.21 rad;
- 合计:ej4.21+e−j4.21=2cos(4.21)≈−0.99e^{j 4.21} + e^{-j 4.21} = 2\cos(4.21) \approx -0.99ej4.21+e−j4.21=2cos(4.21)≈−0.99。
结论 :真位置幅度 ∣I∣=2|I|=2∣I∣=2,偏离 10 m 的假位置幅度掉到 ∣I∣≈1|I|\approx 1∣I∣≈1 --- 已经下降 6 dB。再偏就继续抵消。这就是 "BP 是一张按假设位置评分的相关图" 这一直觉的最简数值验证。
C.4 驻相原理:BP 为什么正好在真位置聚焦
考虑理想点目标在 p0\mathbf{p}0p0,距离压缩后回波行 e^R(τ;ηi)=sinc(B(τ−2Ri,0/c))⋅e−j4πRi,0/λ\hat e_R(\tau;\eta_i) = \mathrm{sinc}\big(B(\tau - 2R{i,0}/c)\big)\cdot e^{-j 4\pi R_{i,0}/\lambda}e^R(τ;ηi)=sinc(B(τ−2Ri,0/c))⋅e−j4πRi,0/λ,其中 Ri,0=∥p0−rs(i)∥R_{i,0}=\lVert\mathbf{p}_0-\mathbf{r}_s(i)\rVertRi,0=∥p0−rs(i)∥。把它代入 BP (C.3) 对假设像素 p\mathbf{p}p 求和:
I(p) ∝ ∑isinc (B⋅2ΔRic)⋅ejϕi(p)(C.4) I(\mathbf{p}) \;\propto\; \sum_i \mathrm{sinc}\!\big(B\cdot\tfrac{2\Delta R_i}{c}\big)\cdot e^{j \phi_i(\mathbf{p})} \tag{C.4} I(p)∝i∑sinc(B⋅c2ΔRi)⋅ejϕi(p)(C.4)
其中 ΔRi=Ri(p)−Ri,0\Delta R_i = R_i(\mathbf{p}) - R_{i,0}ΔRi=Ri(p)−Ri,0,ϕi(p)=4πΔRi/λ\phi_i(\mathbf{p}) = 4\pi\Delta R_i/\lambdaϕi(p)=4πΔRi/λ。
驻相分析 :∑i\sum_i∑i 的主要贡献来自 ϕi\phi_iϕi 随 iii 变化最慢(驻相点)的区间。
dϕidi∣i=i∗=0⟺dRidi(p)=dRidi(p0)(C.5) \frac{d\phi_i}{di}\bigg|_{i=i^*} = 0 \quad\Longleftrightarrow\quad \frac{dR_i}{di}(\mathbf{p}) = \frac{dR_i}{di}(\mathbf{p}_0) \tag{C.5} didϕi i=i∗=0⟺didRi(p)=didRi(p0)(C.5)
这条"距离变化率相等"的条件,在所有 iii 上同时成立 当且仅当 p=p0\mathbf{p}=\mathbf{p}_0p=p0 ------ 因为不同脉冲的视线方向不同,"距离随时间的导数"是 p\mathbf{p}p 的唯一指纹。其他位置上,驻相只有几个 iii 成立,∑i\sum_i∑i 就会只剩 Na\sqrt{N_a}Na 量级的残渣 (随机相位和的标准差),相对真位置的 NaN_aNa 幅度下降 Na\sqrt{N_a}Na 倍;在 W0 Na=2048N_a=2048Na=2048 下这就是 ~33 dB 的峰背比,对应 PSF 的主瓣-远旁瓣比。
C.5 距离压缩 + BP 的"二阶段聚焦"图解
BP 的一条数据通路可以看成两级"相关匹配":
| 阶段 | 匹配对象 | 效果 |
|---|---|---|
| 距离压缩(预备 A.5) | 发射脉冲 p(t)p(t)p(t) | 压缩为 sinc,分辨率 δr=c/(2B)\delta_r = c/(2B)δr=c/(2B) |
| BP 相干累加(C.3) | 像素 p\mathbf{p}p 的斜距历程 Ri(p)R_i(\mathbf{p})Ri(p) | 方位聚焦为 sinc,分辨率 δaz\delta_{\text{az}}δaz |
两级各自匹配一个约化的一维模板。这就是"SAR = 距离匹配 × 方位匹配"的全部内容。
C.6 BP 为什么天生处理大斜视、曲轨道、地形起伏
频域算法(RDA, CSA, ωK)要求 Ri(p)R_i(\mathbf{p})Ri(p) 可以写成双曲历程(主文式 10)。但 W0 的 LEO 轨道 34 s 跨度、地球曲率让真实 Ri(p)R_i(\mathbf{p})Ri(p) 与双曲模型偏离毫米量级------对 1688 km 的斜距不算啥,但对波长 5.5 cm 的相位就是 ΔR/λ∼0.02\Delta R/\lambda \sim 0.02ΔR/λ∼0.02 rad 每脉冲、累计几十 rad ------ 肉眼就能看出图像散焦。
BP (C.3) 的 Ri(p)R_i(\mathbf{p})Ri(p) 是真真切切的欧氏距离 ,没有任何解析假设。给它一串 SGP4 ECEF 位置 + DEM 高程 + 实测姿态,它都能算。这就是为什么本仓库在轨道感知模式下一律用 BP,不用频域算法。
C.7 时间复杂度(为什么 BP 慢,为什么我们还是用它)
朴素 BP:
TBP=O(Na⋅Nx⋅Ny)(C.6) T_{\mathrm{BP}} = O(N_a \cdot N_x \cdot N_y) \tag{C.6} TBP=O(Na⋅Nx⋅Ny)(C.6)
W0:Na=2048N_a=2048Na=2048, Nx=Ny=400N_x=N_y=400Nx=Ny=400 → 3.3×1083.3\times 10^83.3×108 像素·脉冲对;每对做 1 次线性插值 + 1 次复数乘加 ≈ 10 flop → 3×10⁹ flop / 窗口 ,在 python+numpy 下约 40--80 s。
对比频域算法 (RDA 等):O(NaNrlogNr)O(N_a N_r \log N_r)O(NaNrlogNr),~10× 更快,但不支持任意轨迹 。学术 / 工程上加速 BP 有两类路子:(i) FFBP / multi-look BP 把 O(NaN2)O(N_a N^2)O(NaN2) 降到 O(NaNlogN)O(N_a N \log N)O(NaNlogN);(ii) GPU/并行。本仓库目前选纯 CPU 朴素 BP --- 可读性第一。
第三层 · 算法层(BP 时域后向投影)
3.1 直观:为什么选 BP?
- 频域算法(RDA/CSA/ωK)假设双曲斜距模型在整个场景都成立。但 W0 是 34 s 长的 LEO 观测,地球曲率 + 卫星真实机动让双曲模型有毫米级残差 → 对 PSLR 不友好;
- BP 直接用每个脉冲的真实 ECEF 位置 rs(i)\mathbf{r}s(i)rs(i) 算出到每个输出像素 pxy\mathbf{p}{xy}pxy 的欧氏距离 Ri(x,y)=∥pxy−rs(i)∥R_i(x,y)=\lVert \mathbf{p}_{xy}-\mathbf{r}_s(i)\rVertRi(x,y)=∥pxy−rs(i)∥,然后去查对应的距离压缩行,做相位补偿后累加。它是"暴力但精确"的,天生支持任意轨迹、任意地形 --- 与我们"轨道感知"回波生成器对偶。
3.2 第 1 步:距离压缩(匹配滤波)
对每一行慢时间 ηi\eta_iηi 的回波 s(τ;ηi)s(\tau;\eta_i)s(τ;ηi):
eR(τ;ηi) = F−1 { F{s(τ;ηi)}⋅P∗(f) }(τ)(20) e_R(\tau;\eta_i) \;=\; \mathcal{F}^{-1}\!\Big\{\, \mathcal{F}\{s(\tau;\eta_i)\}\cdot P^{*}(f) \,\Big\}(\tau) \tag{20} eR(τ;ηi)=F−1{F{s(τ;ηi)}⋅P∗(f)}(τ)(20)
(range_compress.py::build_range_matched_filter 提供 P∗P^{*}P∗。)点目标匹配滤波后,回波沿距离方向坍缩为 sinc 函数,峰值 IRW ≈ c/(2B)=2.65c/(2B) = 2.65c/(2B)=2.65 m。
3.3 第 2 步:4× 频域零填充上采样
为了让后面的线性插值足够准(BP 对子像素插值非常敏感,直接四舍五入会把 PSLR 拉到 −15 dB),对距离压缩结果做 4× 频域零填充:
e^R = F−1{zero-pad4× (F{eR})}⋅4(21) \hat e_R \;=\; \mathcal{F}^{-1}\Big\{\text{zero-pad}_{4\times}\!\big(\mathcal{F}\{e_R\}\big)\Big\} \cdot 4 \tag{21} e^R=F−1{zero-pad4×(F{eR})}⋅4(21)
得到距离采样间隔 ΔRup=c/(2Fs⋅4)=0.583\Delta R_{\text{up}} = c/(2F_s\cdot 4) = 0.583ΔRup=c/(2Fs⋅4)=0.583 m,W0 下用这一步把距离插值误差压到 sub-cm 量级。
3.4 第 3 步:构造地面像素网格
在场景中心点 c\mathbf{c}c 建立地面切平面 ENU-like 基:
- u^\hat{\mathbf{u}}u^ = 局部天顶(c/∥c∥\mathbf{c}/\lVert\mathbf{c}\rVertc/∥c∥);
- a^\hat{\mathbf{a}}a^ = 速度方向在水平面内的投影(along-track);
- x^=u^×a^\hat{\mathbf{x}} = \hat{\mathbf{u}}\times\hat{\mathbf{a}}x^=u^×a^(cross-track,指向卫星侧)。
每一个像素的 ECEF 位置:
pij = c+ai a^+xj x^, ai,xj∈[−L2,L2](22) \mathbf{p}_{ij} \;=\; \mathbf{c} + a_i\,\hat{\mathbf{a}} + x_j\,\hat{\mathbf{x}},\ \ a_i,x_j \in \big[-\tfrac{L}{2}, \tfrac{L}{2}\big] \tag{22} pij=c+aia^+xjx^, ai,xj∈[−2L,2L](22)
在 W0 实验里 L=6000L = 6000L=6000 m,Nx=Ny=400N_x = N_y = 400Nx=Ny=400 → 像素步长 15 m/px。对比原生斜距样本 ΔRup=0.583\Delta R_{\text{up}}=0.583ΔRup=0.583 m:BP 像素不是斜距像素,是直接在地面定义的------这就是 BP "无几何失真"的优点来源。
3.5 第 4 步:逐脉冲相干累加(BP 核心)
对每一个脉冲 iii、每一个像素 (i,j)(i,j)(i,j):
- 真实斜距 Ri(x,y)=∥pij−rs(i)∥R_i(x,y) = \lVert \mathbf{p}_{ij}-\mathbf{r}_s(i)\rVertRi(x,y)=∥pij−rs(i)∥;
- 换成上采样样本索引 n⋆=(Ri−Rsr0)/ΔRupn_\star = (R_i - R_{\text{sr}0})/\Delta R{\text{up}}n⋆=(Ri−Rsr0)/ΔRup,线性插值取 e^R\hat e_Re^R;
- 施加相位补偿 exp(j⋅4πRi/λ)\exp(j\cdot 4\pi R_i/\lambda)exp(j⋅4πRi/λ)(把单程相位里被回波延迟带走的载频搬回来,使所有脉冲的复数和在像素处同相叠加);
- 累加到像素。
合起来是 BP 的一行式定义:
I(x,y) = ∑i=0Na−1e^R (2Ri(x,y)/c; ηi)⋅exp (+j 4π Ri(x,y)/λ) (23) \boxed{\; I(x,y) \;=\; \sum_{i=0}^{N_a-1} \hat e_R\!\big(2R_i(x,y)/c;\,\eta_i\big)\cdot \exp\!\big(+j\,4\pi\,R_i(x,y)/\lambda\big) \;} \tag{23} I(x,y)=i=0∑Na−1e^R(2Ri(x,y)/c;ηi)⋅exp(+j4πRi(x,y)/λ)(23)
注意符号:回波生成用 exp(−j 2πdkf0)\exp(-j\,2\pi d_k f_0)exp(−j2πdkf0)(式 15),BP 再乘 exp(+j 4πR/λ)=exp(+j 2πf0d)\exp(+j\,4\pi R/\lambda)=\exp(+j\,2\pi f_0 d)exp(+j4πR/λ)=exp(+j2πf0d),两者相位匹配。
3.6 为什么能聚焦?------ 驻相分析的直观版
把式 (23) 代入一个理想点目标 (x0,y0)(x_0,y_0)(x0,y0) 的回波。距离压缩后 e^R\hat e_Re^R 在 R=Ri(x0,y0)R=R_i(x_0,y_0)R=Ri(x0,y0) 处取到峰值 sinc,剩下的相位因子随 iii 积分:
∑iexp(jϕi)\sum_i \exp(j\phi_i)∑iexp(jϕi),其中 ϕi=−4πRi(x0,y0)/λ+4πRi(x,y)/λ\phi_i = -4\pi R_i(x_0,y_0)/\lambda + 4\pi R_i(x,y)/\lambdaϕi=−4πRi(x0,y0)/λ+4πRi(x,y)/λ。当 (x,y)=(x0,y0)(x,y)=(x_0,y_0)(x,y)=(x0,y0) 时 ϕi≡0\phi_i \equiv 0ϕi≡0 → 所有脉冲同相相加 ,幅度正比于 NaN_aNa;当 (x,y)(x,y)(x,y) 偏离真实位置时 ϕi\phi_iϕi 随 iii 快速变化 → 相位抵消,幅度塌缩到背景水平。这就是 SAR"用相位换分辨率"的本质。
3.7 数值例子:W0 的 BP 参数
| 参数 | W0 取值 | 含义 |
|---|---|---|
| 输入 echo | (2048, 4096) cplx128 | 128 MiB |
| 距离压缩输出 | (2048, 4096) | IRW → 2.65 m |
| 上采样后 | (2048, 16384) | ΔRup=0.583\Delta R_{\text{up}}=0.583ΔRup=0.583 m |
| BP 像素网格 | 400 × 400 | 15 m/px |
| BP 覆盖 | 6 km × 6 km | AREA_BP_EXTENT_M |
| 每脉冲距离次数 | 400×400 = 1.6×10⁵ | 线性插值 |
| 总浮点开销 | 2048 × 1.6×10⁵ ≈ 3.3×10⁸ | O(N_a · N_x · N_y) |
| 测量耗时 | ~40--80 s | 与 _run_log.txt 一致 |
边界余量技巧 :test_area_three_window_bp.py L590--607 还额外做了一个 cos² 渐变 500 m 的 raised-cosine 边界羽化(_TAPER_MARGIN_M)。目的:散射体场的突变边界本身会在 BP 里产生类似 Gibbs 的矩形框亮边伪影,羽化后平滑过渡避免边框污染视觉评估。
第四层 · 评估层
4.1 直观:怎么定义"像得好"?
面目标本身没有"真值"可对比像素级(它是随机散斑场),但我们可以借助两条路径:
- 伴随点目标 :在窗口中心放一个 σ=1 的点目标,同样的轨道/窗口/Na/Nr 跑一次 BP,得到 PSF。用 PSF 度量 IRW/PSLR/ISLR --- 这是频域分辨率 + 旁瓣水平的经典量化;
- 真值重投影 :把输入 σ 场按
_truth_projection重新投影到 BP 的 along/cross 网格上,作为"应该长什么样"的参考 --- 这是几何 + 雷达反射率的眼见为实核对。
4.2 PSF 质量三指标
quality/metrics.py::measure_1d_profile 从 PSF 的一维剖面(过峰的行/列)里测量:
IRW (Impulse Response Width) --- 半功率(−3 dB)主瓣宽度:
IRW = x+−x−,其中 ∣H(x±)∣2=12∣Hmax∣2(24) \mathrm{IRW} \;=\; x_+ - x_-,\quad \text{其中}\ |H(x_\pm)|^2 = \tfrac{1}{2}|H_{\max}|^2 \tag{24} IRW=x+−x−,其中 ∣H(x±)∣2=21∣Hmax∣2(24)
PSLR (Peak-to-Sidelobe Ratio) --- 最高旁瓣峰与主瓣峰之比(dB):
PSLR = 20log10 (maxx∈sidelobe∣H(x)∣ / ∣Hmax∣)(25) \mathrm{PSLR} \;=\; 20\log_{10}\!\Big(\max_{x\in\mathrm{sidelobe}}|H(x)|\,/\,|H_{\max}|\Big) \tag{25} PSLR=20log10(x∈sidelobemax∣H(x)∣/∣Hmax∣)(25)
ISLR (Integrated Sidelobe Ratio) --- 主瓣外总能量与主瓣内之比:
ISLR = 10log10 (∫sidelobe∣H∣2 dx∫mainlobe∣H∣2 dx)(26) \mathrm{ISLR} \;=\; 10\log_{10}\!\Big(\tfrac{\int_{\mathrm{sidelobe}}|H|^2\,dx}{\int_{\mathrm{mainlobe}}|H|^2\,dx}\Big) \tag{26} ISLR=10log10(∫mainlobe∣H∣2dx∫sidelobe∣H∣2dx)(26)
理想无加权 sinc² PSF 理论值:PSLR ≈ −13.3 dB,ISLR ≈ −10.0 dB。我们的 W0 实测是:
| 方向 | IRW (px) | PSLR (dB) | ISLR (dB) |
|---|---|---|---|
| range | 2.24 | −21.5 | −15.2 |
| azimuth | 2.00 | −11.5 | −10.5 |
解读 (课堂风格):距离向 PSLR −21.5 dB 好于理论 sinc,原因是仿真脉冲频谱被 sampling 导致的带边 roll-off 起到了 Hamming-like 加权;方位向 PSLR −11.5 dB 差于理论,原因是 Na_use=2048 < Na_full=59099 的硬截断相当于没有方位加权 + 孔径未照满,留下旁瓣。这是一个经典的"算力-画质"取舍。
4.3 多视(multi-look)与散斑
单视 BP 图像上每个分辨单元的幅度服从 Rayleigh 分布,振幅变异系数 CV=1,肉眼看像"雪花"。SAR 的标准对策是非相干多视平均:
IML(p) = 1L∑k=1L∣Ik(p)∣2,L=N × N(27) I_{\mathrm{ML}}(p) \;=\; \sqrt{\frac{1}{L}\sum_{k=1}^{L}\big|I_k(p)\big|^2},\quad L = N\!\times\! N \tag{27} IML(p)=L1k=1∑L Ik(p) 2 ,L=N×N(27)
理论上变异系数降到 CVML≈1/L\mathrm{CV}_{\mathrm{ML}} \approx 1/\sqrt{L}CVML≈1/L 。W0 的默认 N=3N=3N=3 → L=9, CV ≈ 0.33 --- 颗粒感明显减弱但保留空间细节(test_area_three_window_bp._multi_look L881-891)。
4.4 真值重投影(Truth-σ Reprojection)
_truth_projection(L894-918)把每个散射体的 σk\sigma_kσk 按它的 ECEF 在 BP along/cross-track 网格里做最近邻/均值分桶:
σ~(i,j) = 1nij∑k: bin(k)=(i,j)σk(28) \tilde\sigma(i,j) \;=\; \frac{1}{n_{ij}}\sum_{k:\,\mathrm{bin}(k)=(i,j)} \sigma_k \tag{28} σ~(i,j)=nij1k:bin(k)=(i,j)∑σk(28)
这张 σ~\tilde\sigmaσ~ 地图没有经过任何回波或聚焦,仅仅是输入场按 BP 像素网格的重采样。它是最严格的"干净场景"对照 --- 任何 BP 中出现但真值里没有的特征必然是成像伪影(边框、PSF 旁瓣、散斑、grating lobe);反之任何真值里有但 BP 里没有的特征必然是分辨率或 mask 被吞掉。
4.5 数值例子:W0 实测结论
- 伴随 PT :
tableB_pt_metrics.csv→ range PSLR=−21.5 dB ✓ 通过质量门限; - 真值 vs 单视 BP 的皮尔森相关 (从
_run_log.txt可粗估):单视 ~0.3(因为 speckle 主导),3×3 多视 ~0.7(scene-dominated),符合 SEMUS 对比试验期望; - 边界伪影 :未加
_TAPER_MARGIN_M时矩形 AOI 边缘在 BP 上比内部亮 ~3 dB,加了羽化后消失。
第五层 · 可视化层
5.1 直观:为什么 SAR 图像"不能直接 imshow"?
SAR 反射率幅度是重尾分布:少数金属屋顶的幅度是草地平均幅度的 100×。如果直接 imshow(|I|, vmin=0, vmax=|I|.max()),99% 的场景都塌缩到近黑 --- 这就是原始 SAR raw 看起来全黑的原因。解决办法是百分位拉伸。
5.2 imadjust 百分位拉伸
_imadjust(L921-955)实现:
disp(p) = clip (∣I(p)∣−qploqphi−qplo, 0, 1)(29) \mathrm{disp}(p) \;=\; \mathrm{clip}\!\Big(\frac{|I(p)| - q_{p_{\mathrm{lo}}}}{q_{p_{\mathrm{hi}}} - q_{p_{\mathrm{lo}}}},\,0,\,1\Big) \tag{29} disp(p)=clip(qphi−qplo∣I(p)∣−qplo,0,1)(29)
其中 qplo,qphiq_{p_{\mathrm{lo}}}, q_{p_{\mathrm{hi}}}qplo,qphi 是图像正幅度 的 plo%, phi%p_{\mathrm{lo}}\%,\ p_{\mathrm{hi}}\%plo%, phi% 分位数。默认 plo=2, phi=98p_{\mathrm{lo}}=2,\ p_{\mathrm{hi}}=98plo=2, phi=98。你最近一条建议 ---
SARSIM_IMADJUST_PLO=5 SARSIM_IMADJUST_PHI=99 SARSIM_MULTILOOK=1 python sar_imaging_sim/tests/_replot_figC.py
就是在不重跑回波的情况下(run_artifacts.npz 缓存了 BP 图像),仅调这两个百分位。p_lo=5 把黑底推到更黑,p_hi=99 留下最亮的 1%,图整体对比度拉高。
5.3 可选 log 压缩(dB 显示)
当城/郊对比超过 30 dB 时,线性拉伸仍会把郊区吞没,改用 log:
disp(p) = 20log10 max (∣I(p)∣, ε⋅∣I∣max)(30) \mathrm{disp}(p) \;=\; 20\log_{10}\!\max\!\big(|I(p)|,\,\varepsilon \cdot |I|_{\max}\big) \tag{30} disp(p)=20log10max(∣I(p)∣,ε⋅∣I∣max)(30)
由 SARSIM_DISPLAY_LOG=1 开关。
5.4 Figure A:光学底图 vs 散射系数输入
_figure_A_s2_and_scatter 两栏:
- 左栏:Sentinel-2 B04 原始灰度 + 红虚线标出仿真 patch 边界;
- 右栏:
reflectivity_gray(拉伸后的 σ 图)用pcolormesh画在同一经纬度范围内。
诊断用途:任何"输入 σ 和光学不一致"(比如采样漏洞、inside_mask 误剪)在这张图上立刻可见。
5.5 Figure C:三行三列诊断 triptych
三行三列(_figure_C_area_triptych)是整个面目标流程的"心电图":
| 行 | 内容 | 作用 |
|---|---|---|
| 第 1 行 | 真值 σ 重投影(式 28) | "场景应该长这样" |
| 第 2 行 | 单视 BP | 真正的 SAR 图像,有散斑 |
| 第 3 行 | 3×3 多视 BP | 散斑抑制后的"平滑 SAR" |
三行现在共用同一个 imadjust 百分位区间 (式 29,同一 (qplo,qphi)(q_{p_{\mathrm{lo}}}, q_{p_{\mathrm{hi}}})(qplo,qphi))。这是你刚刚强调的"three rows ... all on the same scale"的关键:可比性第一 。否则第 2 行的 peak 是 2.6 × 1062.6\!\times\!10^62.6×106、第 1 行的 peak 是 ~1,各自归一必然掩盖真实幅度差异。
5.6 Figure D:PT 剖面(机器可读的聚焦质量)
_figure_D_pt_cuts 画每个窗口伴随点目标的 range/azimuth 切片(dB、以峰值归一),叠加 IRW/PSLR 数字标签、−3 dB 虚线、X 轴 ±60 m 范围。这是把 tableB 里的数字可视化--- 审阅者可以一眼判断"这个窗口有没有通过 −13 dB PSLR 门限"。
5.7 缓存 → replot 快迭代
run_experiment(save_npz=True) 末尾保存 run_artifacts.npz,包含每个窗口的 area_image, pt_image, scatter_ecefs, bp_along_hat ... tests/_replot_figC.py 可以只重绘 figC 的单视 + 多视两行,不触碰 ~5 分钟的 echo+BP 链路。这对调显示参数极其关键 --- 把"算法迭代"和"显示迭代"解耦。
全流程数值回顾:一条数据在 W0 里走过的每一步
把 W0 窗口的一条"观测→像素"路径串起来:
- Geometry :TLE → SGP4 算出 rs(t)\mathbf{r}s(t)rs(t),在 t = 2026-04-15T08:36:38Z 达到 Beijing AOI,JSVF+PPTD 把这段 34.359 s 认定为"可见窗 W0" → (R0,H,Vr,θinc,θsq,look)=(1688 km,691 km,7592 m/s,59.1°,0.036°,L)(R_0, H, V_r, \theta{\text{inc}}, \theta_{\text{sq}}, \text{look}) = (1688\ \mathrm{km}, 691\ \mathrm{km}, 7592\ \mathrm{m/s}, 59.1°, 0.036°, \mathrm{L})(R0,H,Vr,θinc,θsq,look)=(1688 km,691 km,7592 m/s,59.1°,0.036°,L).
- Scene:用 Sentinel-2 SAFE 产品 B04 band,在 AOI 窗口内按 5 m × 5 m 采样出 1600×1600 ≈ 2.5×10⁶ 候选点,经 inside_mask 保留 K ≈ 10⁴ 有效散射体。每个点的 σ 由式 (11)(12)(17) 赋值。
- Echo :脉冲 i=0,...,2047i=0,...,2047i=0,...,2047,每个脉冲 SGP4 给 rs(i)\mathbf{r}_s(i)rs(i),向 K ≈ 10⁴ 散射体做式 (10) 算斜距 → 式 (19) NUFFT 得单脉冲频谱 → 式 (16) IFFT → 填入 echo[i, :]。最终 echo.shape = (2048, 4096),耗时 92 s。
- Focus :对每行做式 (20) 距离压缩 → 式 (21) 4× 上采样。建 400×400 地面网格(6 km extent),对每脉冲每像素算真实距离 Ri(x,y)R_i(x,y)Ri(x,y)、线性插值 e^R\hat e_Re^R、乘式 (23) 的相位、累加。耗时 ~40 s,输出 I(x,y)I(x,y)I(x,y), shape (400, 400) 复数;max∣I∣=2.63 × 106\max|I|=2.63\!\times\!10^6max∣I∣=2.63×106.
- Evaluate :对伴随 PT 同样流程,得到 PSF → 式 (24)--(26) 给出 IRW=2.24 px (range) / 2.00 px (azimuth), PSLR=−21.5 / −11.5 dB, ISLR=−15.2 / −10.5 dB;面目标 III 做式 (27) 3×3 多视,与式 (28) 真值 σ 重投影并排。
- Visualize :figA 查 σ 输入一致性 → figC 查像质(三行 SAME scale)→ figD 查聚焦质量数字。任何改显示参数(百分位、多视、log)只需跑
_replot_figC.py,~2 s。
这条链在物理上体现了 SAR 的三个基本方程:
- 几何方程 (1)--(10):卫星在哪 → 斜距是多少;
- 信号方程 (13)--(19):发射什么 + 场景是什么 → 回波是什么;
- 成像方程 (20)--(23):回波是什么 → 图像在哪。
教学小结:五个"你一定要记住"
- 式 (10) 的双曲斜距模型是 RDA/CSA 的假设基础;一旦违反(LEO 长综合/椭球地球/真实机动),BP 才是正解。这解释了为什么我们用 BP 跑 W0。
- 式 (15) 是面目标回波的唯一入口 --- 它是所有点目标回波的相干线性叠加,没有任何近似。这是后面一切"正确性"的源头,也是 NUFFT 加速(式 19)的数学基础。
- 式 (23) 是 BP 的完整定义,相位匹配(+4πR/λ+4\pi R/\lambda+4πR/λ vs 回波的 −2πf0d-2\pi f_0 d−2πf0d)是它能聚焦的唯一数学原因;错一个符号全图归零。
- 式 (27) 的多视与 式 (29) 的百分位拉伸是 SAR 显示的"两个标配";不做这两步的 SAR 图永远会让审阅者以为算法出了 bug。
- 伴随点目标 + 真值重投影组成面目标评估的"双护航":式 (24)--(26) 打分数,式 (28) 给眼见为实。任何 SAR 仿真如果只给一张面目标图,没伴随 PT,没真值,就不是可复现的实验。
附录 A:公式索引(主流程 30 条 + 预备课 22 条 = 52 条)
A.主流程 30 条
| # | 内容 | 出现位置 |
|---|---|---|
| (1) | SGP4 轨道状态 | 几何 |
| (2) | 参考斜距 R0R_0R0 | 几何 |
| (3) | 入射角 | 几何 |
| (4) | 斜视角 | 几何 |
| (5) | 多普勒中心 fDCf_{\text{DC}}fDC | 几何 |
| (6) | 合成孔径时间 TaT_aTa | 几何 |
| (7) | 方位波束宽度 θbwaz\theta_{\text{bw}}^{az}θbwaz | 几何 |
| (8) | 距离分辨率 δr\delta_rδr | 几何 |
| (9) | 方位分辨率 δaz\delta_{\text{az}}δaz | 几何 |
| (10) | 双曲斜距历程 | 几何 |
| (11) | S2 反射率 | 回波 |
| (12) | σ 百分位 + gamma | 回波 |
| (13) | LFM chirp | 回波 |
| (14) | 单点频域回波 | 回波 |
| (15) | 面目标频域回波 | 回波 |
| (16) | 时域回波 IFFT | 回波 |
| (17) | 天线方向图加权 σ | 回波 |
| (18) | sinc² 方向图 | 回波 |
| (19) | NUFFT Type-1 改写 | 回波 |
| (20) | 距离匹配滤波 | 算法 |
| (21) | 4× 频域上采样 | 算法 |
| (22) | 地面像素网格 | 算法 |
| (23) | BP 相干累加 | 算法 |
| (24) | IRW 定义 | 评估 |
| (25) | PSLR 定义 | 评估 |
| (26) | ISLR 定义 | 评估 |
| (27) | 多视(multi-look) | 评估 |
| (28) | 真值重投影 | 评估 |
| (29) | imadjust 百分位拉伸 | 可视化 |
| (30) | log 显示 | 可视化 |
B.预备课 22 条
| # | 内容 | 预备 |
|---|---|---|
| (A.1) | 复指数 = cos + j sin | A |
| (A.2) | 时延 ↔ 频域相位旋转 | A |
| (A.3) | 傅里叶变换对 | A |
| (A.4) | 卷积定理 | A |
| (A.5) | LTI 冲激响应 | A |
| (A.6) | LFM chirp 波形 | A |
| (A.7) | 时间-带宽积 TBP | A |
| (A.8) | 匹配滤波频域形式 | A |
| (A.9) | 匹配滤波输出 = 自相关 | A |
| (A.10) | DFT 定义 | A |
| (B.1) | 标准均匀 DFT | B |
| (B.2) | FFT 分治 | B |
| (B.3) | SAR 频谱(非均匀源) | B |
| (B.4) | Type-1 NUFFT 改写 | B |
| (B.5) | Gridding 散布 | B |
| (B.6) | Deconvolve 谱域修正 | B |
| (C.1) | Delay-and-Sum | C |
| (C.2) | DAS + 载频相位补偿 | C |
| (C.3) | BP 时域形式 | C |
| (C.4) | 驻相积分 | C |
| (C.5) | 驻相条件 | C |
| (C.6) | BP 时间复杂度 | C |
附录 B:关键源码索引(W0 实验沿着的模块)
| 步骤 | 文件 | 函数 | 行号 |
|---|---|---|---|
| 1. 轨道可见窗 | geometry/visibility.py |
compute_observation_windows |
--- |
| 1. 窗口几何 | geometry/visibility.py |
compute_observation_geometry |
--- |
| 2. Sentinel-2 底图 | scene/sentinel2_basemap.py |
load_sentinel2_basemap |
--- |
| 2. 场景采样 | pipeline.py |
build_optical_area_scene |
L145 |
| 2. σ 拉伸 | tests/test_area_three_window_bp.py |
_run_single_window 内内联 |
L448-485 |
| 2. 回波 | echo/area_target.py |
generate_area_echo |
L117 |
| 2. NUFFT | echo/area_target.py |
finufft 调用 | L412-423 |
| 3. 距离压缩 | imaging/range_compress.py |
build_range_matched_filter |
L15 |
| 3. BP 聚焦 | imaging/back_projection.py |
bp_focus |
L62 |
| 4. PT 质量 | quality/metrics.py |
evaluate_point_target |
L105 |
| 4. 真值重投影 | tests/test_area_three_window_bp.py |
_truth_projection |
L894 |
| 4. 多视 | tests/test_area_three_window_bp.py |
_multi_look |
L881 |
| 5. imadjust | tests/test_area_three_window_bp.py |
_imadjust |
L921 |
| 5. 三图绘制 | tests/test_area_three_window_bp.py |
_figure_A/C/D |
L775/958/1054 |
| 5. 缓存 replot | tests/_replot_figC.py |
main |
L28 |
附录 C:一页速查表(W0 的关键数字)
载频 f₀ = 5.405 GHz (λ = 0.0555 m)
带宽 B = 56.5 MHz → δ_r = 2.65 m
脉宽 τ = 41.75 μs → K_r = 1.35 THz/s
PRF = 1720 Hz → PRI = 581 μs
采样率 F_s = 64.35 MHz → Δτ = 15.5 ns
天线 L_az = 12.3 m → θ_bw^az = 4.0 mrad, δ_az = 6.15 m
天线 L_el = 0.821 m → θ_bw^el ≈ 60 mrad
W0 窗口:
斜距 R_0 = 1688.5 km
高度 H = 691.4 km
速度 V_r = 7592 m/s
入射角 = 59.10°
斜视角 = +0.036°
侧视 = 左
窗口时长 = 34.36 s → Na_full=59099, Na_use=2048 (cap)
Nr = 4096
面目标 patch = 8 × 8 km (σ 密集网格 5 m × 5 m)
BP 覆盖 = 6 × 6 km, 400 × 400 pixels (15 m/px)
时耗(tableA_window_geometry.csv):
area_elapsed_s = 92.11 s (echo + BP)
pt_elapsed_s = 27.83 s (伴随 PT)
PSF 质量(tableB_pt_metrics.csv):
IRW = 2.24 / 2.00 px (rg/az)
PSLR = -21.5 / -11.5 dB
ISLR = -15.2 / -10.5 dB
--- 完 ---