欢迎光临
我们一直在努力

【论文复现】(附MATLAB源码)112 | 分布式雷达抗干扰与目标检测:从噪声调幅对消到距离-速度联合欺骗识别

================================================
本文仅用于个人学习,文章版权归原作者及其团队所有。若有侵权,联系本人删除。
================================================

【算法复现专栏】112 | 分布式雷达抗干扰与目标检测:从噪声调幅对消到距离-速度联合欺骗识别

阅读导览:复现张帅 2017 年硕士论文:推导噪声调幅干扰的频域/时域对消、四节点分布式相干融合与三节点距离-速度假目标识别;附 MATLAB 代码、27 幅结果图与 8 个工程坑,读完可独立跑通。


一、背景与动机

现代雷达面临的典型有源干扰有两类:一类是压制式干扰,用大功率噪声把目标回波"淹没",其中噪声调幅干扰产生简单、覆盖灵活,是最常见的遮盖样式之一;另一类是欺骗式干扰,由 DRFM 截获、存储、调制并转发雷达信号,在距离维、速度维或两维同时制造假目标,让雷达"看见了错误的目标"。

单站雷达的对抗手段存在天然瓶颈:空间覆盖有限、视角单一、干扰样式一变就可能失效。分布式雷达把若干部收发节点在空间上拉开,由中心站统一融合,带来三方面收益:

  • 空间分集:各节点观测角度不同,真目标 RCS 起伏独立,假目标却来自同一干扰机,特征在节点间强相关;
  • 多传感器冗余:个别节点对消失败不影响系统整体判决;
  • 相干增益:目标回波在时延/空间对齐后可相干累加,噪声不相干,融合后信噪比提升。
  • 论文(电子科技大学硕士学位论文,2017)沿这两条线展开:第 2 章建立噪声调幅、距离欺骗、速度欺骗、距离-速度联合欺骗模型;第 3 章研究噪声调幅干扰的频域对消、时域对消与分布式融合;第 4 章研究多节点距离-多普勒信息提取与参数关联的假目标识别。本文复现第 2~4 章全部可仿真实验,共 27 幅图。

    复现速览

    模块核心算法输入关键指标本文结果
    压制干扰抑制 频域对消 单站复回波 脉压峰底比 29.1~30.6 dB
    压制干扰抑制 时域对消 单站复回波 脉压峰底比 40.0/39.5 dB
    多节点融合 对齐相干累加 四节点对消输出 融合增益 +5.7 dB(理论 6 dB)
    欺骗干扰识别 多普勒滑窗+距离校验 三节点 R-D 峰 真假识别/ΔR 一致性 ΔR=749/750/749 m
    检测性能 蒙特卡洛 1000 次/点 检测概率 −10 dB 0.83,−8 dB 0.98

    二、数学原理

    2.1 噪声调幅干扰模型

    噪声调幅干扰用带限高斯噪声调制单频载波:

    J(t)=(U0+Un(t))exp⁡[j(ωjt+ϕ)](2-9)
    J(t)=\\left(U_0+U_n(t)\\right)\\exp\\left[j\\left(\\omega_j t+\\phi\\right)\\right]
    \\tag{2-9}
    J(t)=(U0​+Un​(t))exp[j(ωj​t+ϕ)](2-9)

    符号含义
    U0U_0U0​ 干扰载波直流幅度
    Un(t)U_n(t)Un​(t) 零均值、方差 σn2\\sigma_n^2σn2​ 的带限高斯调制噪声
    ωj\\omega_jωj​ 干扰载频
    ϕ\\phiϕ 干扰初相,在 [0,2π)[0,2\\pi)[0,2π) 上均匀分布

    其自相关函数与总功率为:

    BJ(τ)=12[U02+Bn(τ)]cos⁡(ωjτ),PJ=U02+σn22(2-17,2-18)
    B_J(\\tau)=\\frac{1}{2}\\left[U_0^2+B_n(\\tau)\\right]\\cos\\left(\\omega_j\\tau\\right),
    \\qquad
    P_J=\\frac{U_0^2+\\sigma_n^2}{2}
    \\tag{2-17,2-18}
    BJ​(τ)=21​[U02​+Bn​(τ)]cos(ωj​τ),PJ​=2U02​+σn2​​(2-17,2-18)

    符号含义
    Bn(τ)B_n(\\tau)Bn​(τ) 调制噪声 Un(t)U_n(t)Un​(t) 的自相关函数
    PJP_JPJ​ 干扰总功率,等于载波功率与调制噪声功率之和的一半

    2.2 频域对消

    对接收信号取对数,在"干扰远强于目标与噪声"的假设下做泰勒展开:

    ln⁡x(t)≈ln⁡J(t)+s(t)+n(t)J(t),ln⁡J(t)=ln⁡(U0+Un(t))+jΛ(ωjt+ϕ)(3-2,3-3)
    \\ln x(t)\\approx \\ln J(t)+\\frac{s(t)+n(t)}{J(t)},
    \\qquad
    \\ln J(t)=\\ln\\left(U_0+U_n(t)\\right)+j\\Lambda\\left(\\omega_j t+\\phi\\right)
    \\tag{3-2,3-3}
    lnx(t)≈lnJ(t)+J(t)s(t)+n(t)​,lnJ(t)=ln(U0​+Un​(t))+jΛ(ωj​t+ϕ)(3-2,3-3)

    ξ(t)=Im⁡ln⁡x(t)=Λ(ωjt+ϕ)+ϑ(t)(3-4)
    \\xi(t)=\\operatorname{Im}\\ln x(t)=\\Lambda\\left(\\omega_j t+\\phi\\right)+\\vartheta(t)
    \\tag{3-4}
    ξ(t)=Imlnx(t)=Λ(ωj​t+ϕ)+ϑ(t)(3-4)

    符号含义
    x(t)x(t)x(t) 接收信号(目标+干扰+噪声)
    s(t)s(t)s(t) 目标回波
    Λ(⋅)\\Lambda(\\cdot)Λ(⋅) 以 2π2\\pi2π 为周期的锯齿波函数
    ξ(t)\\xi(t)ξ(t) 对数信号的虚部,即观测到的锯齿波
    ϑ(t)\\vartheta(t)ϑ(t) 目标与噪声引入的扰动项

    锯齿波与干扰同频同相,因此对 ξ(t)\\xi(t)ξ(t) 做频谱,两个最大峰关于零频对称、间距为 2fj2f_j2fj​;初相由相关法或复指数最小二乘得到。用估计参数解调:

    y(t)=x(t)exp⁡[−j(ω^jt+ϕ^j)]≃y1(t)+y2(t),y2(t)=U0+Un(t)(3-6,3-7)
    y(t)=x(t)\\exp\\left[-j\\left(\\hat{\\omega}_j t+\\hat{\\phi}_j\\right)\\right]\\simeq y_1(t)+y_2(t),
    \\qquad
    y_2(t)=U_0+U_n(t)
    \\tag{3-6,3-7}
    y(t)=x(t)exp[−j(ω^j​t+ϕ^​j​)]≃y1​(t)+y2​(t),y2​(t)=U0​+Un​(t)(3-6,3-7)

    解调后干扰是实信号(频谱共轭对称),目标仍是复信号(单边谱)。把正负频半边相减:

    Y1(f)=Y(f)−Y∗(−f),f>0(3-11)
    Y_1(f)=Y(f)-Y^*(-f),\\qquad f>0
    \\tag{3-11}
    Y1​(f)=Y(f)−Y∗(−f),f>0(3-11)

    符号含义
    y1(t)y_1(t)y1​(t) 解调后的目标与噪声分量(复)
    y2(t)y_2(t)y2​(t) 解调后的干扰幅度(实)
    Y(f)Y(f)Y(f) y(t)y(t)y(t) 的频谱
    Y1(f)Y_1(f)Y1​(f) 对消后保留的复信号频谱

    对消成立的前提是解调后目标谱完全位于正半轴。对对称调频的 LFM(带宽 BBB),等价条件为:

    fc−fj>B2(3-14*)
    f_c-f_j>\\frac{B}{2}
    \\tag{3-14*}
    fc​−fj​>2B​(3-14*)

    符号含义
    fcf_cfc​ 目标回波中心频率
    fjf_jfj​ 干扰载频
    BBB LFM 带宽

    注:式 (3-14*) 为复现按论文图 3-14 整理出的等价条件;带 * 的编号表示复现补充,不是原文式号。

    2.3 时域对消

    时域法不再依赖载频间隔,直接从对数信号中恢复干扰幅度与相位:

    A^J(t)=eℜ[ln⁡x(t)]=∣x(t)∣,z(t)=x(t)A^J(t)≃ej(ωjt+ϕ)(3-13,3-15)
    \\hat{A}_J(t)=e^{\\Re\\left[\\ln x(t)\\right]}=|x(t)|,
    \\qquad
    z(t)=\\frac{x(t)}{\\hat{A}_J(t)}\\simeq e^{j\\left(\\omega_j t+\\phi\\right)}
    \\tag{3-13,3-15}
    A^J​(t)=eℜ[lnx(t)]=∣x(t)∣,z(t)=A^J​(t)x(t)​≃ej(ωj​t+ϕ)(3-13,3-15)

    ω^j=arg⁡max⁡ω∣FFT⁡[z(t)]∣,ϕ^j=∠{FFT⁡[z(t)]∣peak}(3-16)
    \\hat{\\omega}_j=\\arg\\max_{\\omega}\\left|\\operatorname{FFT}\\left[z(t)\\right]\\right|,
    \\qquad
    \\hat{\\phi}_j=\\angle\\left\\{\\operatorname{FFT}\\left[z(t)\\right]\\big|_{\\text{peak}}\\right\\}
    \\tag{3-16}
    ω^j​=argωmax​∣FFT[z(t)]∣,ϕ^​j​=∠{FFT[z(t)]​peak​}(3-16)

    J^(t)=A^J(t)exp⁡[j(ω^jt+ϕ^j)],r(t)=x(t)−J^(t)(3-17,3-18)
    \\hat{J}(t)=\\hat{A}_J(t)\\exp\\left[j\\left(\\hat{\\omega}_j t+\\hat{\\phi}_j\\right)\\right],
    \\qquad
    r(t)=x(t)-\\hat{J}(t)
    \\tag{3-17,3-18}
    J^(t)=A^J​(t)exp[j(ω^j​t+ϕ^​j​)],r(t)=x(t)−J^(t)(3-17,3-18)

    符号含义
    A^J(t)\\hat{A}_J(t)A^J​(t) 干扰瞬时幅度估计,等于接收信号的包络
    z(t)z(t)z(t) 单位模复信号,理想情况下是干扰的复指数
    ω^j,ϕ^j\\hat{\\omega}_j,\\hat{\\phi}_jω^j​,ϕ^​j​ 由补零 FFT 峰点给出的频率与初相
    J^(t)\\hat{J}(t)J^(t) 重构干扰
    r(t)r(t)r(t) 对消残差

    参数估计的误差会留下残余干扰。论文给出残差方差与均值包络:

    E[∣y2(t)∣2]=2σn2∫0Tp{1−cos⁡[Δωj(t−τ)]}dτ=2σn2{Tp−1Δωj[sin⁡(Δωjt)−sin⁡(Δωj(t−Tp))]}(3-26)
    \\begin{aligned}
    E\\left[|y_2(t)|^2\\right]
    &=2\\sigma_n^2\\int_0^{T_p}\\left\\{1-\\cos\\left[\\Delta\\omega_j(t-\\tau)\\right]\\right\\}d\\tau\\\\
    &=2\\sigma_n^2\\left\\{T_p-\\frac{1}{\\Delta\\omega_j}\\left[\\sin\\left(\\Delta\\omega_j t\\right)-\\sin\\left(\\Delta\\omega_j(t-T_p)\\right)\\right]\\right\\}
    \\end{aligned}
    \\tag{3-26}
    E[∣y2​(t)∣2]​=2σn2​∫0Tp​​{1−cos[Δωj​(t−τ)]}dτ=2σn2​{Tp​−Δωj​1​[sin(Δωj​t)−sin(Δωj​(t−Tp​))]}​(3-26)

    ∣E[y(t)]∣2∝12(Δωjt)2(3-29)
    \\left|E[y(t)]\\right|^2\\propto \\frac{1}{2}\\left(\\Delta\\omega_j t\\right)^2
    \\tag{3-29}
    ∣E[y(t)]∣2∝21​(Δωj​t)2(3-29)

    符号含义
    Δωj=ωj−ω^j\\Delta\\omega_j=\\omega_j-\\hat{\\omega}_jΔωj​=ωj​−ω^j​ 载频估计误差
    Δϕ\\Delta\\phiΔϕ 初相估计误差(推导中近似为 0)
    TpT_pTp​ 脉宽
    y2(t)y_2(t)y2​(t) 残余干扰经匹配滤波后的输出

    式 (3-29) 说明:频率估计存在误差时,残余干扰的包络随时间线性增长,FFT 点数越少,频率误差越大,脉压底噪的"斜线"越陡——这正是第 3.3.2 节实验要展示的现象。

    2.4 分布式相干融合

    一发多收体制下,第 iii 个节点接收:

    xi(t)=si(t)+Ji(t)+ni(t)(3-30)
    x_i(t)=s_i(t)+J_i(t)+n_i(t)
    \\tag{3-30}
    xi​(t)=si​(t)+Ji​(t)+ni​(t)(3-30)

    符号含义
    si(t)s_i(t)si​(t) 第 iii 节点目标回波,时延 τi\\tau_iτi​
    Ji(t)J_i(t)Ji​(t) 第 iii 节点干扰
    ni(t)n_i(t)ni​(t) 节点独立噪声

    各节点独立完成对消与脉压,中心站在时间/空间对齐后相干累加。复现采用理想对齐:

    y(t)=∑i=1Nri(t+Δti),GSNR=10log⁡10N(3-31*)
    y(t)=\\sum_{i=1}^{N}r_i(t+\\Delta t_i),
    \\qquad
    G_{\\mathrm{SNR}}=10\\log_{10}N
    \\tag{3-31*}
    y(t)=i=1∑N​ri​(t+Δti​),GSNR​=10log10​N(3-31*)

    符号含义
    ri(t)r_i(t)ri​(t) 第 iii 节点对消后的脉压输出
    Δti\\Delta t_iΔti​ 相对参考节点的时延补偿量
    NNN 节点数
    GSNRG_{\\mathrm{SNR}}GSNR​ 理想相干积累的信噪比增益

    四节点时理论增益为 10log⁡104≈6.010\\log_{10}4\\approx 6.010log10​4≈6.0 dB。

    2.5 距离-速度联合欺骗与参数关联

    一发多收、自卫式干扰条件下,第 iii 部雷达收到:

    yi(t)=αix(t−τi)ej2πfdi(t−τi)+∑m=1Mβi,mx(t−Δτi,m)ej2πfJi,m(t−Δτi,m)+ni(t)(4-1)
    y_i(t)=\\alpha_i x(t-\\tau_i)e^{j2\\pi f_{di}(t-\\tau_i)}
    +\\sum_{m=1}^{M}\\beta_{i,m}x(t-\\Delta\\tau_{i,m})e^{j2\\pi f_{Ji,m}(t-\\Delta\\tau_{i,m})}
    +n_i(t)
    \\tag{4-1}
    yi​(t)=αi​x(t−τi​)ej2πfdi​(t−τi​)+m=1∑M​βi,m​x(t−Δτi,m​)ej2πfJi,m​(t−Δτi,m​)+ni​(t)(4-1)

    fdi=v(cos⁡θ0+cos⁡θi)f0c,τi=RT+Ric(4-1a,4-1b)
    f_{di}=\\frac{v\\left(\\cos\\theta_0+\\cos\\theta_i\\right)f_0}{c},
    \\qquad
    \\tau_i=\\frac{R_T+R_i}{c}
    \\tag{4-1a,4-1b}
    fdi​=cv(cosθ0​+cosθi​)f0​​,τi​=cRT​+Ri​​(4-1a,4-1b)

    符号含义
    αi,βi,m\\alpha_i,\\beta_{i,m}αi​,βi,m​ 真目标/第 mmm 个假目标的复幅度
    τi\\tau_iτi​ 真目标双程时延
    fdif_{di}fdi​ 真目标在第 iii 节点的多普勒
    Δτi,m\\Delta\\tau_{i,m}Δτi,m​ 第 mmm 个假目标相对真目标的附加时延
    fJi,mf_{Ji,m}fJi,m​ 干扰调制多普勒(各节点近似相同)
    vvv 目标速度
    θ0,θi\\theta_0,\\theta_iθ0​,θi​ 发射机、第 iii 接收机与目标速度矢量的夹角
    f0,cf_0,cf0​,c 载频、光速

    复现注记:论文式 (4-1b) 写的是 τi=(RT+Ri)/c\\tau_i=(R_T+R_i)/cτi​=(RT​+Ri​)/c,但其给出的数值 20/14.1/11.5 μs20/14.1/11.5\\ \\mu s20/14.1/11.5 μs 恰好等于 2Ri/c2R_i/c2Ri​/c(Ri=h/sin⁡θiR_i=h/\\sin\\theta_iRi​=h/sinθi​,h=1.5h=1.5h=1.5 km,θi=30∘/45∘/60∘\\theta_i=30^\\circ/45^\\circ/60^\\circθi​=30∘/45∘/60∘)。复现按论文数值取 τi=2Ri/c\\tau_i=2R_i/cτi​=2Ri​/c;多普勒按 fdi=v(cos⁡θ0+cos⁡θi)f0/cf_{di}=v(\\cos\\theta_0+\\cos\\theta_i)f_0/cfdi​=v(cosθ0​+cosθi​)f0​/c,取 θ0=30∘\\theta_0=30^\\circθ0​=30∘,得到 3464/3146/27323464/3146/27323464/3146/2732 Hz,与原文一致。

    对每个节点做"脉压 + 慢时间 FFT"二维处理:

    Z(r,fd)=∣∑n=0N−1PC⁡n(r) e−j2πfdnT∣(4-2*)
    Z(r,f_d)=\\left|\\sum_{n=0}^{N-1}\\operatorname{PC}_n(r)\\,e^{-j2\\pi f_d nT}\\right|
    \\tag{4-2*}
    Z(r,fd​)=​n=0∑N−1​PCn​(r)e−j2πfd​nT​(4-2*)

    符号含义
    PC⁡n(r)\\operatorname{PC}_n(r)PCn​(r) 第 nnn 个脉冲在第 rrr 个距离单元的脉压输出
    fdf_dfd​ 多普勒频率轴
    TTT 脉冲重复间隔
    NNN 脉冲数

    由于假目标由同一干扰机调制产生,其多普勒在各节点近似相等;同时各节点假目标相对真目标的时延也近似相等:

    fJ1≈fJ2≈fJ3,∣ΔR1∣≈∣ΔR2∣≈∣ΔR3∣(4-3,4-4)
    f_{J1}\\approx f_{J2}\\approx f_{J3},
    \\qquad
    \\left|\\Delta R_1\\right|\\approx\\left|\\Delta R_2\\right|\\approx\\left|\\Delta R_3\\right|
    \\tag{4-3,4-4}
    fJ1​≈fJ2​≈fJ3​,∣ΔR1​∣≈∣ΔR2​∣≈∣ΔR3​∣(4-3,4-4)

    ∣ΔR1−ΔR2∣<ε2,∣ΔR1−ΔR3∣<ε2(4-10)
    \\left|\\Delta R_1-\\Delta R_2\\right|<\\varepsilon_2,
    \\qquad
    \\left|\\Delta R_1-\\Delta R_3\\right|<\\varepsilon_2
    \\tag{4-10}
    ∣ΔR1​−ΔR2​∣<ε2​,∣ΔR1​−ΔR3​∣<ε2​(4-10)

    符号含义
    fJif_{Ji}fJi​ 第 iii 节点检测到的假目标多普勒
    ΔRi\\Delta R_iΔRi​ 假目标与真目标在第 iii 节点的距离差
    ε2\\varepsilon_2ε2​ 距离一致性门限(复现取 30 m)

    识别逻辑:把三节点共 6 个目标的 Doppler 排序,用宽度 200 Hz 的滑窗扫描;当窗内恰好落入 3 个目标时,判为同一假目标簇;再回到原索引得到各节点的假目标坐标;最后用 ΔRi\\Delta R_iΔRi​ 的离散度做二次确认。

    三、算法流程

    单站双路对消的总体流程如图 1。

    #mermaid-svg-m7fxyJCRhCfSaEw3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-m7fxyJCRhCfSaEw3 .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mermaid-svg-m7fxyJCRhCfSaEw3 .error-text{fill:rgb(8.5000000002, 5.7500000001, 0);stroke:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m7fxyJCRhCfSaEw3 .marker{fill:#0b0b0b;stroke:#0b0b0b;}#mermaid-svg-m7fxyJCRhCfSaEw3 .marker.cross{stroke:#0b0b0b;}#mermaid-svg-m7fxyJCRhCfSaEw3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;}#mermaid-svg-m7fxyJCRhCfSaEw3 p{margin:0;}#mermaid-svg-m7fxyJCRhCfSaEw3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster-label text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster-label span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster-label span p{background-color:transparent;}#mermaid-svg-m7fxyJCRhCfSaEw3 .label text,#mermaid-svg-m7fxyJCRhCfSaEw3 span{fill:#333;color:#333;}#mermaid-svg-m7fxyJCRhCfSaEw3 .node rect,#mermaid-svg-m7fxyJCRhCfSaEw3 .node circle,#mermaid-svg-m7fxyJCRhCfSaEw3 .node ellipse,#mermaid-svg-m7fxyJCRhCfSaEw3 .node polygon,#mermaid-svg-m7fxyJCRhCfSaEw3 .node path{fill:#fff4dd;stroke:hsl(40.5882352941, 60%, 83.3333333333%);stroke-width:1px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .rough-node .label text,#mermaid-svg-m7fxyJCRhCfSaEw3 .node .label text,#mermaid-svg-m7fxyJCRhCfSaEw3 .image-shape .label,#mermaid-svg-m7fxyJCRhCfSaEw3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-m7fxyJCRhCfSaEw3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .rough-node .label,#mermaid-svg-m7fxyJCRhCfSaEw3 .node .label,#mermaid-svg-m7fxyJCRhCfSaEw3 .image-shape .label,#mermaid-svg-m7fxyJCRhCfSaEw3 .icon-shape .label{text-align:center;}#mermaid-svg-m7fxyJCRhCfSaEw3 .node.clickable{cursor:pointer;}#mermaid-svg-m7fxyJCRhCfSaEw3 .root .anchor path{fill:#0b0b0b!important;stroke-width:0;stroke:#0b0b0b;}#mermaid-svg-m7fxyJCRhCfSaEw3 .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edgePath .path{stroke:#0b0b0b;stroke-width:2.0px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .flowchart-link{stroke:#0b0b0b;fill:none;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edgeLabel{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-m7fxyJCRhCfSaEw3 .edgeLabel p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-m7fxyJCRhCfSaEw3 .edgeLabel rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-m7fxyJCRhCfSaEw3 .labelBkg{background-color:rgba(243.9999999999, 220.9999999998, 255, 0.5);}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster rect{fill:hsl(220.5882352941, 100%, 98.3333333333%);stroke:hsl(220.5882352941, 60%, 88.3333333333%);stroke-width:1px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-m7fxyJCRhCfSaEw3 .cluster span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-m7fxyJCRhCfSaEw3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(220.5882352941, 100%, 98.3333333333%);border:1px solid hsl(220.5882352941, 60%, 88.3333333333%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-m7fxyJCRhCfSaEw3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-m7fxyJCRhCfSaEw3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-m7fxyJCRhCfSaEw3 .icon-shape,#mermaid-svg-m7fxyJCRhCfSaEw3 .image-shape{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-m7fxyJCRhCfSaEw3 .icon-shape p,#mermaid-svg-m7fxyJCRhCfSaEw3 .image-shape p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);padding:2px;}#mermaid-svg-m7fxyJCRhCfSaEw3 .icon-shape .label rect,#mermaid-svg-m7fxyJCRhCfSaEw3 .image-shape .label rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-m7fxyJCRhCfSaEw3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-m7fxyJCRhCfSaEw3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-m7fxyJCRhCfSaEw3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-m7fxyJCRhCfSaEw3 .input>*{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .input span{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .struct>*{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .struct span{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .flow>*{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .flow span{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .proc>*{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .proc span{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .out>*{fill:#E8DAEF!important;stroke:#7D3C98!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .out span{fill:#E8DAEF!important;stroke:#7D3C98!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .warn>*{fill:#F8D7DA!important;stroke:#C0392B!important;}#mermaid-svg-m7fxyJCRhCfSaEw3 .warn span{fill:#F8D7DA!important;stroke:#C0392B!important;}

    单站处理

    混合回波

    取对数

    锯齿波谱

    频域对消

    幅相估计

    时域对消

    脉压输出

    临界失效

    图 1:单站双路对消流程。 黄色=输入,蓝色=谱分析结构,橙色=通用流程,绿色=时域对消运算,红色=失效风险,紫色=输出。三个关键节点:锯齿波谱(提供 fjf_jfj​ 与粗相位)、频域对消(依赖"信号单边谱"条件,红色虚线表示 fc−fj≤B/2f_c-f_j\\le B/2fc​−fj​≤B/2 时的临界失效路径)、时域对消(幅相重构后直接相减,对载频关系不敏感)。

    算法 1:频域对消(复现实现)

    输入:x(t),采样率 fs,脉宽 Tp
    1 ξ ← angle(x) % 取对数虚部
    2 Xf ← FFT(ξ, 8N),找到 ±f 两侧最大峰
    f̂j ← (f_+ − f_−)/2
    3 对 sgn∈{+1,−1}:
    w ← sgn·2π f̂j
    φ ← angle(Σ x/|x|·e^{−jwt}) % 解缠复指数 LS
    以 ξ 与 wrap(wt+φ) 的相关值选择符号
    4 y ← x·e^{−j(ŵt+φ̂)}
    5 Y ← FFT(y),Y1(f) ← Y(f) − Y*(−f), f>0
    6 r ← IFFT(Y1),输出 r

    算法 2:时域对消(复现实现)

    输入:x(t),补零 FFT 点数 L
    1 Â(t) ← |x(t)|,z(t) ← x(t)/Â(t)
    2 Z ← FFT(z, L),取幅度最大峰 im
    3 f̂j ← (im−1)·fs/L,φ̂ ← angle(Z(im))
    4 Ĵ(t) ← Â(t)·e^{j(2πf̂j t+φ̂)}
    5 r(t) ← x(t) − Ĵ(t),输出 r

    分布式融合如图 2。

    #mermaid-svg-3o37cb0w3swkvzP5{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3o37cb0w3swkvzP5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3o37cb0w3swkvzP5 .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mermaid-svg-3o37cb0w3swkvzP5 .error-text{fill:rgb(8.5000000002, 5.7500000001, 0);stroke:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-3o37cb0w3swkvzP5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3o37cb0w3swkvzP5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3o37cb0w3swkvzP5 .marker{fill:#0b0b0b;stroke:#0b0b0b;}#mermaid-svg-3o37cb0w3swkvzP5 .marker.cross{stroke:#0b0b0b;}#mermaid-svg-3o37cb0w3swkvzP5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;}#mermaid-svg-3o37cb0w3swkvzP5 p{margin:0;}#mermaid-svg-3o37cb0w3swkvzP5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3o37cb0w3swkvzP5 .cluster-label text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-3o37cb0w3swkvzP5 .cluster-label span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-3o37cb0w3swkvzP5 .cluster-label span p{background-color:transparent;}#mermaid-svg-3o37cb0w3swkvzP5 .label text,#mermaid-svg-3o37cb0w3swkvzP5 span{fill:#333;color:#333;}#mermaid-svg-3o37cb0w3swkvzP5 .node rect,#mermaid-svg-3o37cb0w3swkvzP5 .node circle,#mermaid-svg-3o37cb0w3swkvzP5 .node ellipse,#mermaid-svg-3o37cb0w3swkvzP5 .node polygon,#mermaid-svg-3o37cb0w3swkvzP5 .node path{fill:#fff4dd;stroke:hsl(40.5882352941, 60%, 83.3333333333%);stroke-width:1px;}#mermaid-svg-3o37cb0w3swkvzP5 .rough-node .label text,#mermaid-svg-3o37cb0w3swkvzP5 .node .label text,#mermaid-svg-3o37cb0w3swkvzP5 .image-shape .label,#mermaid-svg-3o37cb0w3swkvzP5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-3o37cb0w3swkvzP5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3o37cb0w3swkvzP5 .rough-node .label,#mermaid-svg-3o37cb0w3swkvzP5 .node .label,#mermaid-svg-3o37cb0w3swkvzP5 .image-shape .label,#mermaid-svg-3o37cb0w3swkvzP5 .icon-shape .label{text-align:center;}#mermaid-svg-3o37cb0w3swkvzP5 .node.clickable{cursor:pointer;}#mermaid-svg-3o37cb0w3swkvzP5 .root .anchor path{fill:#0b0b0b!important;stroke-width:0;stroke:#0b0b0b;}#mermaid-svg-3o37cb0w3swkvzP5 .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-3o37cb0w3swkvzP5 .edgePath .path{stroke:#0b0b0b;stroke-width:2.0px;}#mermaid-svg-3o37cb0w3swkvzP5 .flowchart-link{stroke:#0b0b0b;fill:none;}#mermaid-svg-3o37cb0w3swkvzP5 .edgeLabel{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-3o37cb0w3swkvzP5 .edgeLabel p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-3o37cb0w3swkvzP5 .edgeLabel rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-3o37cb0w3swkvzP5 .labelBkg{background-color:rgba(243.9999999999, 220.9999999998, 255, 0.5);}#mermaid-svg-3o37cb0w3swkvzP5 .cluster rect{fill:hsl(220.5882352941, 100%, 98.3333333333%);stroke:hsl(220.5882352941, 60%, 88.3333333333%);stroke-width:1px;}#mermaid-svg-3o37cb0w3swkvzP5 .cluster text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-3o37cb0w3swkvzP5 .cluster span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-3o37cb0w3swkvzP5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(220.5882352941, 100%, 98.3333333333%);border:1px solid hsl(220.5882352941, 60%, 88.3333333333%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3o37cb0w3swkvzP5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3o37cb0w3swkvzP5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-3o37cb0w3swkvzP5 .icon-shape,#mermaid-svg-3o37cb0w3swkvzP5 .image-shape{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-3o37cb0w3swkvzP5 .icon-shape p,#mermaid-svg-3o37cb0w3swkvzP5 .image-shape p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);padding:2px;}#mermaid-svg-3o37cb0w3swkvzP5 .icon-shape .label rect,#mermaid-svg-3o37cb0w3swkvzP5 .image-shape .label rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-3o37cb0w3swkvzP5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3o37cb0w3swkvzP5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3o37cb0w3swkvzP5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-3o37cb0w3swkvzP5 .input>*{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-3o37cb0w3swkvzP5 .input span{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-3o37cb0w3swkvzP5 .struct>*{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-3o37cb0w3swkvzP5 .struct span{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-3o37cb0w3swkvzP5 .flow>*{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-3o37cb0w3swkvzP5 .flow span{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-3o37cb0w3swkvzP5 .proc>*{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-3o37cb0w3swkvzP5 .proc span{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-3o37cb0w3swkvzP5 .out>*{fill:#E8DAEF!important;stroke:#7D3C98!important;}#mermaid-svg-3o37cb0w3swkvzP5 .out span{fill:#E8DAEF!important;stroke:#7D3C98!important;}

    分布式融合

    节点回波

    独立对消

    脉压

    时延对齐

    相干累加

    融合检测

    图 2:分布式融合流程。 黄色=各节点原始回波,蓝色=脉压结构,橙色=对消与对齐流程,绿色=相干累加(增益来源),紫色=融合检测输出。三个关键节点:独立对消(单节点失败可被中心站剔除)、时延对齐(决定能否相干)、相干累加(目标相加、噪声不相加,四节点理论 +6 dB)。

    第 4 章的参数关联识别如图 3。

    #mermaid-svg-o7Lh4DVJ9UtGGFmN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .error-text{fill:rgb(8.5000000002, 5.7500000001, 0);stroke:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .marker{fill:#0b0b0b;stroke:#0b0b0b;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .marker.cross{stroke:#0b0b0b;}#mermaid-svg-o7Lh4DVJ9UtGGFmN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:30px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN p{margin:0;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster-label text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster-label span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster-label span p{background-color:transparent;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .label text,#mermaid-svg-o7Lh4DVJ9UtGGFmN span{fill:#333;color:#333;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .node rect,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node circle,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node ellipse,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node polygon,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node path{fill:#fff4dd;stroke:hsl(40.5882352941, 60%, 83.3333333333%);stroke-width:1px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .rough-node .label text,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node .label text,#mermaid-svg-o7Lh4DVJ9UtGGFmN .image-shape .label,#mermaid-svg-o7Lh4DVJ9UtGGFmN .icon-shape .label{text-anchor:middle;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .rough-node .label,#mermaid-svg-o7Lh4DVJ9UtGGFmN .node .label,#mermaid-svg-o7Lh4DVJ9UtGGFmN .image-shape .label,#mermaid-svg-o7Lh4DVJ9UtGGFmN .icon-shape .label{text-align:center;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .node.clickable{cursor:pointer;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .root .anchor path{fill:#0b0b0b!important;stroke-width:0;stroke:#0b0b0b;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .arrowheadPath{fill:#0b0b0b;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edgePath .path{stroke:#0b0b0b;stroke-width:2.0px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .flowchart-link{stroke:#0b0b0b;fill:none;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edgeLabel{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edgeLabel p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .edgeLabel rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .labelBkg{background-color:rgba(243.9999999999, 220.9999999998, 255, 0.5);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster rect{fill:hsl(220.5882352941, 100%, 98.3333333333%);stroke:hsl(220.5882352941, 60%, 88.3333333333%);stroke-width:1px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster text{fill:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .cluster span{color:rgb(8.5000000002, 5.7500000001, 0);}#mermaid-svg-o7Lh4DVJ9UtGGFmN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(220.5882352941, 100%, 98.3333333333%);border:1px solid hsl(220.5882352941, 60%, 88.3333333333%);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o7Lh4DVJ9UtGGFmN rect.text{fill:none;stroke-width:0;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .icon-shape,#mermaid-svg-o7Lh4DVJ9UtGGFmN .image-shape{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);text-align:center;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .icon-shape p,#mermaid-svg-o7Lh4DVJ9UtGGFmN .image-shape p{background-color:hsl(-79.4117647059, 100%, 93.3333333333%);padding:2px;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .icon-shape .label rect,#mermaid-svg-o7Lh4DVJ9UtGGFmN .image-shape .label rect{opacity:0.5;background-color:hsl(-79.4117647059, 100%, 93.3333333333%);fill:hsl(-79.4117647059, 100%, 93.3333333333%);}#mermaid-svg-o7Lh4DVJ9UtGGFmN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o7Lh4DVJ9UtGGFmN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .input>*{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .input span{fill:#FFF3CD!important;stroke:#D4A017!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .struct>*{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .struct span{fill:#DCE8F7!important;stroke:#3B6FB6!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .flow>*{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .flow span{fill:#FFE5CC!important;stroke:#D2691E!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .proc>*{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .proc span{fill:#DFF0D8!important;stroke:#4C8C3F!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .out>*{fill:#E8DAEF!important;stroke:#7D3C98!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .out span{fill:#E8DAEF!important;stroke:#7D3C98!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .warn>*{fill:#F8D7DA!important;stroke:#C0392B!important;}#mermaid-svg-o7Lh4DVJ9UtGGFmN .warn span{fill:#F8D7DA!important;stroke:#C0392B!important;}

    三站关联

    三站回波

    二维处理

    峰值提取

    多普勒排序

    滑窗筛选

    距离校验

    真假判决

    图 3:参数关联识别流程。 黄色=三节点回波,蓝色=距离-多普勒结构,橙色=信息提取流程,红色=最容易出错的滑窗判别,绿色=距离一致性校验,紫色=判决输出。三个关键节点:多普勒排序(把 6 个目标的多普勒排成一条轴)、滑窗筛选(宽度与多普勒分辨率匹配,窗内恰好 3 个才判为假目标簇)、距离校验(ΔRi\\Delta R_iΔRi​ 离散度小于 30 m 才最终确认)。

    四、核心代码实现

    以下代码直接摘自复现脚本 reproduce_distributed_radar.m(MATLAB,无工具箱依赖)。

    4.1 频域对消

    % 来源:D:\\JAM\\reproduce_distributed_radar.m (fd_cancel)
    function [r,info]=fd_cancel(x,t,fs)
    xi=angle(x); N=numel(x); Nfft=2^nextpow2(8*N);
    Xf=fftshift(fft(xi,Nfft)); f=(–Nfft/2:Nfft/2–1)'/Nfft*fs; mag=abs(Xf);
    [~,ip]=max(mag.*(f>1e5)); [~,in]=max(mag.*(f<–1e5)); fmag=(f(ip)–f(in))/2;
    z=x./max(abs(x),eps); best=–inf; phihat=0; wbest=2*pi*fmag;
    for sgn=[1 –1]
    w=sgn*2*pi*fmag;
    ph=mod(angle(sum(z.*exp(–1j*w*t))),2*pi);
    sc=xi.'*wrap_phase(w*t+ph);
    if sc>best, best=sc; phihat=ph; wbest=w; end
    end
    y=x.*exp(–1j*(wbest*t+phihat)); Y=fft(y); M=numel(y);
    Y1=zeros(M,1); kk=(2:floor(M/2)).'; Y1(kk)=Y(kk)–conj(Y(M+2–kk));
    r=ifft(Y1);
    info.fhat=wbest/2/pi; info.phihat=phihat;
    end

    逐段说明:

    • xi=angle(x) 就是论文的 ξ(t)\\xi(t)ξ(t);fftshift 后分别找正、负频最大峰,二者间距的一半即 ∣f^j∣|\\hat f_j|∣f^​j​∣。
    • 采样后存在符号歧义(+fj+f_j+fj​ 与 −fj-f_j−fj​ 混叠),代码用"正负频率双候选 + 锯齿波相关得分"定符号;初相用解缠复指数的闭式最小二乘,避免离散锯齿波互相关的相位模糊。
    • 解析信号的负频分量本身就是零,不要再乘以 2;乘 2 会让目标峰虚高 6 dB,这是复现时最容易踩的坑之一。

    4.2 时域对消

    % 来源:D:\\JAM\\reproduce_distributed_radar.m (td_cancel)
    function [r,info]=td_cancel(x,t,fs,NfftZ)
    Ahat=abs(x); z=x./max(Ahat,eps);
    Z=fft(z,NfftZ); [~,im]=max(abs(Z));
    fhat=(im–1)*fs/NfftZ; if fhat>fs/2, fhat=fhat–fs; end
    w=2*pi*fhat; phihat=angle(Z(im)); % 论文式(3-16): 峰点频点对应的相位
    r=x–Ahat.*exp(1j*(w*t+phihat));
    info.fhat=fhat; info.phihat=phihat;
    end

    • abs(x) 就是论文的 A^J(t)\\hat A_J(t)A^J​(t);归一化后 z 的模恒为 1,理想情况下是一个复指数。
    • 频率/初相直接取补零 FFT 的最大峰及其相位,严格对应论文式 (3-16)。补零点数 NfftZ 越大,峰点越接近真实频率,相位偏差越小——这正是第 3.3.2 节要验证的规律。
    • 该实现没有对幅度做任何平滑;当目标与干扰幅度可比时,abs(x) 会把目标投影到干扰方向上,等效使目标幅度减半(约 −6 dB),但底噪抑制收益通常远大于这 6 dB。

    4.3 多站关联判决

    % 来源:D:\\JAM\\reproduce_distributed_radar.m (assoc_ok)
    function [ok,info]=assoc_ok(dets,thr,Wd,eps2,c)
    info.jamSlot=zeros(3,1); info.trueSlot=zeros(3,1); info.found=[]; info.deltas=nan(3,1);
    ok=false;
    P=dets(:,:,3)>=thr;
    if any(sum(P,2)<2), return; end
    detsT=permute(dets,[2 1 3]); % 行优先: R1C1,R1C2,R2C1,…
    fdList=reshape(detsT(:,:,2),[],1);
    if any(isnan(fdList)), return; end
    [v,idx]=sort(fdList); n=numel(v); found=[];
    for i=1:n
    j=i; while j<=n && v(j)–v(i)<=Wd, j=j+1; end
    if j–i>=3, found=(i:j–1)'; break; end
    end
    if isempty(found), return; end
    for kk=found.'
    r=ceil(idx(kk)/2); s=idx(kk)–2*(r–1);
    if info.jamSlot(r)~=0, return; end
    info.jamSlot(r)=s;
    end
    if any(info.jamSlot==0), return; end
    info.trueSlot=3–info.jamSlot;
    for r=1:3
    info.deltas(r)=abs(dets(r,info.jamSlot(r),1)–dets(r,info.trueSlot(r),1))*c/2;
    end
    info.found=found;
    ok=(max(info.deltas)–min(info.deltas))<=eps2;
    end

    dets 是 3×2×33\\times2\\times33×2×3 数组(雷达 × 类 × [时延, 多普勒, 相对峰值])。这段代码有三个关键点:

  • 列优先陷阱:MATLAB 的 reshape 按列展开,直接 reshape(dets(:,:,2)) 得到的顺序是"R1C1,R2C1,R3C1,R1C2,…",与按雷达分组的映射不一致;必须先 permute(dets,[2 1 3])。不修正会把同一雷达判成两个假目标,关联直接失败。
  • 滑窗计数:窗口宽度 Wd=200 Hz 与多普勒分辨率(128 脉冲、PRT=50 μs 时约 156 Hz)匹配;窗内至少 3 个目标才判为假目标簇。
  • 二次校验:deltas 是各节点假目标相对真目标的距离偏移,只有三者离散度 ≤30 m 才最终确认。
  • 五、实验设计与结果分析

    主要仿真参数如下:

    实验关键参数干扰/条件
    频域/时域对消 Tp=10/30 μsT_p=10/30\\ \\mu sTp​=10/30 μs,B=10B=10B=10 MHz,fs=120/50f_s=120/50fs​=120/50 MHz U0=5σn,调制噪声带宽 12 MHz
    FFT 点数 Tp=500 μsT_p=500\\ \\mu sTp​=500 μs,PRT=4 ms,B=1B=1B=1 MHz,fs=1f_s=1fs​=1 MHz SNR=0 dB,JNR=30 dB
    分布式融合 同上,4 节点,时延 2.000/2.001/1.999/2.002 ms JNR=30 dB,SNR=0 dB
    抗欺骗识别 f0=1f_0=1f0​=1 GHz,B=5B=5B=5 MHz,Tp=10 μsT_p=10\\ \\mu sTp​=10 μs,PRT=50 μs\\mu sμs,fs=20f_s=20fs​=20 MHz 3 节点,θ=30°/45°/60°,v=600 m/s

    5.1 距离-速度联合欺骗的二维图景

    在这里插入图片描述

    图 4:距离-速度联合欺骗的距离-多普勒二维图。 左图为二维热力图,右图为三维视图;横轴多普勒,纵轴距离。真实目标位于 (10 μs, 3 kHz),假目标位于 (15 μs, 5 kHz),二者都获得相干积累。三个关键观察:①干扰经 DRFM 复制后与目标一样获得脉压增益,不能用"干扰无增益"的假设;②假目标与真目标在距离和多普勒两维都分开,单节点无法仅凭二维图判断真假;③复现的多普勒检测值为 2969 Hz(真值 3000 Hz),是 78 Hz 多普勒分辨单元的量化结果。

    5.2 频域对消:高 JSR 下几乎"剥掉"干扰

    在这里插入图片描述

    图 5:不同 JSR 下频域对消后的脉压输出。 四个面板分别对应 JSR=10/0/−10/−20 dB,横轴时延、纵轴归一化 dB。三个关键观察:①四个面板的 2 μs 目标峰都清晰出现;②对消后的峰底比稳定在 29~31 dB;③未对消时峰底比只有 3.6/4.3/8.5/19.9 dB(JSR=10/0/−10/−20 dB),高 JSR 下目标确实被干扰底噪淹没。

    对消参数估计结果为 f^j=15.000\\hat f_j=15.000f^​j​=15.000 MHz、ϕ^=0.785\\hat\\phi=0.785ϕ^​=0.785 rad(真值 π/4=0.785\\pi/4=0.785π/4=0.785);离散互相关首峰按 ϕ=−ωτ\\phi=-\\omega\\tauϕ=−ωτ 换算得到 0.801 rad,与 LS 估计相差 0.016 rad。

    JSR=−25 dB 的对比见 图3-13_JSR-25对消对比.png:对消后峰底比 30.6 dB,未对消 24.2 dB,仍有约 6 dB 改善。论文原文称此时"反而变差",本复现未复现该退化——原因是这里的相位估计比原文的整数移位互相关更准;若采用整数移位相关,相位量化误差会显著增大,对消反而会注入残余。这一差异已写入脚本头部和 结果汇总.txt。

    5.3 时域对消 vs 频域对消

    在这里插入图片描述

    图 6:JSR=5 dB(左)与 −5 dB(右)下三种处理的脉压输出。 黑色虚线=未对消,蓝色=频域对消,红色=时域对消;纵轴以未对消峰值为参考。三个关键观察:①两图中时域对消的残余底噪都最低;②JSR=5 dB 时峰底比:未对消 18.4 dB、频域 29.9 dB、时域 40.0 dB;③JSR=−5 dB 时分别为 28.5/37.3/39.5 dB。时域方案对载频关系不敏感,代价是目标幅度可能被"减半"(红色峰低于蓝色峰约 6 dB),但峰底比仍更优。

    5.4 FFT 点数:论文结论与复现偏差

    在这里插入图片描述

    图 7:FFT 补零点数为 50/100/200/400 万时的对消后脉压。 四个面板横轴 250~450 km,纵轴 dB。三个关键观察:①四个面板的目标峰(300/400 km)都清晰;②复现测得的峰底比为 23.7/23.8/23.7/23.8 dB,几乎不随补零增加;③这与论文"点数越多、底噪斜线越平"的显著改善不一致。

    原因可以直接从式 (3-26) 和 (3-29) 看出:补零把频率误差压到 δf/2\\delta f/2δf/2 以下,在 N=4000N=4000N=4000、L=5×105L=5\\times10^5L=5×105 时,相位偏差约为 πδk(N−1)/L≈0.01\\pi\\delta k(N-1)/L\\approx0.01πδk(N−1)/L≈0.01 rad,残余干扰约 −38 dB;而 JNR=30 dB 时噪声底就在干扰下方 30 dB,残差已经低于噪声底,再补零也不会让脉压底噪继续下降。论文图 3-16 的明显差异更可能来自其相位估计实现(或参数口径)与本复现不同。这一"负结果"同样保留在结果目录中。

    作为对照,粗网格 2500/250 点(另取 0.2001 MHz 非整格载频)的峰底比只有 0.3/0.2 dB,残余完全淹没目标,见 图3-18_FFT2500点对消结果.png、图3-19_FFT250点对消结果.png。

    5.5 分布式融合:+5.7 dB 的相干增益

    在这里插入图片描述

    图 8:四节点时域对消后的分布式融合结果。 红色为融合输出,横轴距离,纵轴 dB(以单节点峰值为参考)。三个关键观察:①四个单节点峰底比分别为 25.5/24.8/25.1/24.9 dB;②融合后达到 30.8 dB;③相对单节点平均提升 5.7 dB,与四节点理论相干增益 6.0 dB 基本吻合(差额来自时延离散与残余相位误差)。

    5.6 三节点抗距离-速度联合欺骗

    在这里插入图片描述

    图 9:三部雷达的距离-多普勒二维图。 三个面板分别对应 θ=30°/45°/60° 的接收节点;横轴多普勒,纵轴距离。三个关键观察:①每个节点都有两个尖峰:真目标与 +750 m 的假目标;②真目标多普勒分别为 3464/3146/2732 Hz,随几何角变化;③假目标多普勒固定为 5 kHz,这正是参数关联的物理依据。

    在这里插入图片描述

    图 10:三节点 6 个目标的多普勒排序与滑窗。 左图为排序前(按雷达/类排列),右图为升序排序后;红色为滑窗识别出的假目标簇。三个关键观察:①排序后真实目标的多普勒为 2732/3147/3465 Hz,彼此间隔 ≥318 Hz;②三个假目标集中在 4999~5001 Hz,落在 200 Hz 滑窗内;③窗内恰好 3 个目标,自动标记为假目标,无需人工指定真假。

    在这里插入图片描述

    图 11:真假目标在距离-多普勒平面上的最终分布。 红色=假目标,蓝色=真目标,虚线连接同一节点的真/假对。三个关键观察:①三站假目标都位于真目标后方 750 m 左右(实测 ΔR=749/750/749 m);②距离一致性门限 30 m 内全部通过;③算法同时完成干扰识别与目标检测,输出三站真目标坐标。

    5.7 检测概率

    在这里插入图片描述

    图 12:检测概率随输入 SNR 的变化(1000 次蒙特卡洛,门限 0.3,JNR=0 dB)。 三个关键观察:①SNR ≤ −12 dB 时 Pd=0,目标峰低于门限且峰值位置随机;②−10 dB 时 Pd=0.83,−8 dB 时 0.98;③−6 dB 起 Pd=1。曲线在 −10~−8 dB 之间快速上升,与论文"低 SNR 检测失效、高 SNR 可靠"的趋势一致。

    在这里插入图片描述

    图 13:检测概率随门限的变化(SNR=−10/−6/0 dB)。 三个面板的门限从 0.1 扫到 1.0。三个关键观察:①SNR=−10 dB 时,门限超过 0.3 后 Pd 从 0.83 迅速降到 0;②−6 dB 时拐点后移到 0.4;③0 dB 时直到门限 0.9 仍保持 1,只有在 1.0(只保留全局最大峰)时降为 0。这与论文"信噪比升高时,信号与干扰幅度接近,可接受的门限范围变宽"的描述一致。

    结果汇总

    指标数值
    频域对消峰底比(JSR=10~−25 dB) 29.1/29.4/30.9/30.2/30.6 dB
    未对消峰底比 3.6/4.3/8.5/19.9/24.2 dB
    时域对消峰底比(JSR=5/−5 dB) 40.0/39.5 dB
    频域对消峰底比(JSR=5/−5 dB) 29.9/37.3 dB
    四节点融合增益 +5.7 dB
    三站假目标距离偏移 749/750/749 m
    Pd(SNR=−10/−8/−6 dB) 0.83/0.98/1.0

    六、复现指南

    6.1 环境与运行

    • MATLAB R2016b 及以上(开发环境 R2025b),无任何工具箱依赖;
    • 运行命令:

    %% reproduce_distributed_radar.m
    % 《分布式雷达抗干扰与目标检测方法研究》(张帅, 电子科技大学硕士学位论文, 2017) 复现
    %
    % 复现内容:
    % 第2章: 噪声调幅干扰时频(图2-1)、距离欺骗(图2-5)、多假目标(图2-7)、
    % LFM模糊函数(图2-8)、速度欺骗(图2-9、2-10)、距离-速度联合欺骗(图2-12)
    % 第3章: 频域对消(图3-8~3-14)、时域对消及对比(图3-15)、FFT点数影响(图3-16/3-18/3-19)、
    % 分布式时域对消与融合(图3-22/3-23)
    % 第4章: 三节点距离-多普勒处理与信息提取(图4-13~4-17)、检测概率(图4-18/4-19)
    %
    % ==================== 论文未给定参数与复现约定 ====================
    % 1. 所有信号以解析(复)信号仿真, 采样后载频可高于采样率(复包络意义下);
    % 但频域对消要求"解调后目标谱完全位于正半轴", 因此3.3.1采用复包络等效
    % (载频差fc-fj=10MHz>B/2), 不用绝对载频100MHz/50MHz采样(会产生混叠破坏该条件)。
    % 2. LFM按式(2-27)取对称调频: 瞬时频率fc-B/2~fc+B/2; 第3章3.2参数下f_c-f_j=B/2,
    % 信号下边沿正好落在干扰载频15MHz处(对应图3-14的临界情形)。
    % 3. 第3章JSR口径: 论文未说明。本复现按"脉压后目标峰值"定义
    % (即接收原始数据中JSR_raw=JSR+10log10(B*Tp))。该口径可复现图3-12在-20dB仍有效、
    % 图3-13在-25dB无增益的结果; 若按原始输入JSR口径, 失效点会提前到-10~-20dB。
    % 4. 噪声调幅干扰 U0=5σn(论文未给U0), 调制噪声带宽12MHz, 初相π/4(3.2);
    % 式(2-18)总功率 PJ=(U0²+σn²)/2。
    % 5. 3.3.2: 论文 fc=244MHz, fj=240MHz, fs=1MHz 时二者均为fs整数倍, 解析采样后
    % 锯齿波退化为直流、无法体现频率估计误差。故整体平移0.2MHz(244.2/240.2MHz),
    % 其余参数不变; 观测窗4ms(PRT), 两个目标在300/400km。
    % 另: 按论文JNR=30dB复现时, 补零带来的频率/相位量化残差低于目标/噪声底,
    % 图3-16四个面板几乎相同(峰底比23.7~23.8dB), 论文所示的明显改善未复现;
    % 图3-18/19的粗FFT(2500/250点)另取0.2001MHz非整格载频以体现式(3-29)残余包络。
    % 6. 3.4: 论文未给各节点距离、干扰参数与JNR。取一发四收, 目标等效双程时延
    % 2.000/2.001/1.999/2.002ms, 各节点独立噪声调幅干扰, JNR=30dB, SNR=0dB。
    % 7. 第4章: 目标/干扰幅度按样本SNR/JNR定义; 图4-13~4-17取SNR=JNR=0dB;
    % 图4-18/4-19按论文"SNR=-20~0dB, JNR=0dB"取输入样本SNR, 每点1000次蒙特卡洛,
    % 为控制耗时点数用128个脉冲、FFT后固定门限0.3(论文未给门限),
    % 滑窗宽度200Hz, 距离一致性门限30m; 峰值提取用"0.1门限选点+按与最大点距离分两类"
    % 近似论文步骤, 更高门限下用类峰值判定是否通过门限(不再重新选点)。
    % 8. 论文式(4-3)(4-4)的多普勒/时延近似相等特征与原始数据生成方式有关:
    % 本复现按式(4-1)模型, 各站假目标调制时延相同(+5μs, 距离+750m)、
    % 假目标多普勒恒为5kHz; 真目标时延为2R_i/c、多普勒v(cosθ0+cosθi)f0/c,
    % 与论文给出的20/14.1/11.5μs, 3464/3146/2732Hz一致(θ0=30°, 各站30/45/60°)。
    % 9. 论文图4-18/4-19的SNR口径未明确; 本复现取接收样本SNR, 与"JNR=0dB时
    % SNR升至0dB信号与干扰持平"
    的文字描述一致。
    %
    % 运行: matlab -batch "cd('D:\\JAM'); reproduce_distributed_radar"
    % 结果: results_distributed_radar\\ (PNG+FIG, .mat, 结果汇总.txt)
    % 依赖: 无工具箱; 运行约10~20分钟(主要耗时为图4-18/4-19蒙特卡洛)

    clear; clc; close all; rng(112);
    c_=3e8;
    outdir=fullfile('D:\\JAM','results_distributed_radar');
    if ~exist(outdir,'dir'), mkdir(outdir); end
    set(0,'defaultAxesFontName','SimSun'); set(0,'defaultTextFontName','SimSun');
    SUM={};
    SUM{end+1}=sprintf('《分布式雷达抗干扰与目标检测方法研究》复现结果汇总 %s',datestr(now,'yyyy-mm-dd HH:MM'));

    %% ==================== 第2章 干扰建模 ====================
    fprintf('== 图2-1 噪声调幅干扰 ==\\n');
    fs=100e6; T=20e-6; N=round(T*fs); t=(0:N-1)'/fs;
    sig=1; U0=2; fj=2e6; phij=0; BWn=20e6;
    Un=band_noise(N,fs,BWn,sig);
    Jnam=(U0+Un).*exp(1j*(2*pi*fj*t+phij));
    fig=figure('
    Visible','off','Position',[100 100 720 520]);
    subplot(2,1,1); ns=round(4e-6*fs);
    plot(t(1:ns)*1e6,real(Jnam(1:ns)),'
    b'); grid on;
    xlabel('
    时间/\\mus'); ylabel('实部'); title('(a) 噪声调幅干扰时域波形(U_0=2, \\sigma_n=1, f_j=2MHz)');
    subplot(2,1,2); Nf=2^nextpow2(N*8); Jf=fftshift(fft(Jnam,Nf)); ff=(-Nf/2:Nf/2-1)'
    /Nf*fs;
    plot(ff/1e6,20*log10(abs(Jf)/max(abs(Jf))+eps),'b'); grid on; xlim([-40 40]); ylim([-60 0]);
    xlabel('频率/MHz'); ylabel('归一化幅度/dB'); title('(b) 噪声调幅干扰频谱(调制噪声带宽20MHz)');
    save_fig112(fig,outdir,'图2-1_噪声调幅干扰时频');
    SUM{end+1}=sprintf('图2-1: 噪声调幅干扰 U0=2, sigman=1, 调制噪声带宽20MHz, 载频2MHz; 总功率(式2-18)=%.1f',(U0^2+sig^2)/2);

    fprintf('== 图2-5 距离欺骗干扰 ==\\n');
    fs=240e6; Tp=10e-6; B=60e6; fc=100e6;
    t=((0:round(20e-6*fs)–1)/fs)'; tau0=4e-6; dtJ=1e-6; JSR=6;
    sT=lfm_echo(t,tau0,fc,B,Tp); sJ=lfm_echo(t,tau0+dtJ,fc,B,Tp)*10^(JSR/20); x=sT+sJ;
    fig=figure('Visible','off','Position',[100 100 720 520]);
    subplot(2,1,1); n1=round(12e-6*fs);
    plot(t(1:n1)*1e6,real(sT(1:n1))
    ,'b'); hold on; plot(t(1:n1)*1e6,real(sJ(1:n1)),'r');
    plot(t(1:n1)*1e6,real(x(1:n1)),'k'); grid on;
    legend('目标回波','延时1\\mus假目标(JSR=6dB)','合成信号','Location','best');
    xlabel('时间/\\mus'); ylabel('实部'); title('(a) 时域波形');
    subplot(2,1,2); Nf=2^nextpow2(numel(t)*4);
    ST=fftshift(fft(sT,Nf)); SJ=fftshift(fft(sJ,Nf)); ff=(-Nf/2:Nf/2-1)'/Nf*fs;
    plot(ff/1e6,20*log10(abs(ST)/max(abs(ST))+eps),'
    b'); hold on;
    plot(ff/1e6,20*log10(abs(SJ)/max(abs(SJ))+eps),'
    r'); grid on;
    xlim([60 140]); ylim([-80 0]); xlabel('
    频率/MHz'); ylabel('归一化幅度/dB');
    legend('
    目标回波','假目标','Location','best'); title('(b) 频谱(T=10\\mus, B=60MHz)');
    save_fig112(fig,outdir,'
    图2-5_距离欺骗干扰时频');
    SUM{end+1}='
    图2-5: 距离欺骗假目标相对真目标延时1us, JSR=6dB; 脉压后位于同一距离单元旁;';

    fprintf('== 图2-7 延时多假目标 ==\\n');
    fs=240e6; t=((0:round(25e-6*fs)-1)/fs)'
    ; tauT=7e-6; dList=[-2 -1 1 2]*1e-6;
    x=lfm_echo(t,tauT,fc,B,Tp);
    for d=dList, x=x+lfm_echo(t,tauT+d,fc,B,Tp); end
    ref=lfm_ref((0:round(Tp*fs)–1)'/fs,fc,B,Tp);
    pc=pc_align(x,ref,16384); lag=(0:numel(pc)–1)'/fs*1e6;
    fig=figure('Visible','off','Position',[100 100 720 420]);
    plot(lag,20*log10(abs(pc)/max(abs(pc))
    +eps),'b'); grid on; xlim([3 11]); ylim([-50 0]);
    xlabel('时延/\\mus'); ylabel('归一化脉压输出/dB');
    title('图2-7 延时多假目标干扰脉压输出(\\tau=[-2,-1,1,2]\\mus, JSR=0dB)');
    save_fig112(fig,outdir,'图2-7_延时多假目标脉压');
    pcm=abs(pc)/max(abs(pc)); locMax=find(pcm(2:end-1)>pcm(1:end-2) & pcm(2:end-1)>=pcm(3:end) & pcm(2:end-1)>0.5);
    pkPos=lag(locMax);
    SUM{end+1}=sprintf('图2-7: 脉压峰位(us)=%s, 共%d个峰(真目标7us+4个假目标);',mat2str(round(pkPos,2).'),numel(pkPos));

    fprintf('== 图2-8 LFM模糊函数 ==\\n');
    fs=40e6; Tp=10e-6; B=10e6; t2=(-Tp:1/fs:Tp)'
    ;
    s2=lfm_echo(t2,t2(1)+Tp/2,0,B,Tp); % 以t=0为中心
    fdAx=linspace(-10e6,10e6,81); tauAx=linspace(-12e-6,12e-6,97);
    AF=zeros(numel(fdAx),numel(tauAx));
    NfAF=4096; Sf=fft(s2,NfAF); lagAF=(-NfAF/2:NfAF/2-1)'/fs;
    for a=1:numel(fdAx)
    xa=s2.*exp(1j*2*pi*fdAx(a)*t2);
    cor=ifft(fft(xa,NfAF).*conj(Sf)); cor=fftshift(cor);
    AF(a,:)=interp1(lagAF,abs(cor),tauAx,'
    linear',0).';
    end
    AF=AF/max(AF(:));
    fig=figure('Visible','off','Position',[100 100 720 560]);
    surf(tauAx*1e6,fdAx/1e6,AF,'EdgeColor','none'); view(-35,35); colorbar;
    xlabel('时延/\\mus'); ylabel('多普勒/ MHz'); zlabel('|\\chi(\\tau,f_d)|');
    title('图2-8 LFM模糊函数(T=10\\mus, B=10MHz)');
    save_fig112(fig,outdir,'图2-8_LFM模糊函数');
    SUM{end+1}='图2-8: LFM模糊函数呈斜刀刃, 多普勒失配引起距离维峰值平移与展宽;';

    fprintf('== 图2-9/2-10 速度欺骗干扰 ==\\n');
    fs=60e6; Tp=10e-6; B=30e6; fc=0; t=((0:round(20e-6*fs)–1)/fs)'; tau0=5e-6;
    refc=lfm_ref((0:round(Tp*fs)–1)'/fs,fc,B,Tp);
    sSig=lfm_echo(t,tau0,fc,B,Tp);
    dfJ=3e6; sJam=sSig.*exp(1j*2*pi*dfJ*(t–tau0))
    ;
    pcS=pc_align(sSig,refc,8192); pcJ=pc_align(sJam,refc,8192);
    lag=(0:numel(pcS)-1)'/fs; rel=(lag-tau0)*1e6;
    fig=figure('
    Visible','off','Position',[100 100 720 420]);
    plot(rel,abs(pcS)/max(abs(pcS)),'
    b'); hold on; plot(rel,abs(pcJ)/max(abs(pcS)),'r'); grid on;
    xlim([-4 4]); xlabel('
    相对时延/\\mus'); ylabel('归一化幅度');
    legend('
    目标','速度欺骗干扰(\\Deltaf=3MHz)','Location','best');
    title('
    图2-9 速度欺骗干扰匹配滤波后时域图(B=30MHz, T=10\\mus, JSR=0dB)');
    save_fig112(fig,outdir,'
    图2-9_速度欺骗干扰脉压');
    SUM{end+1}=sprintf('
    图2-9: 真目标峰位0, 速度欺骗峰位-\\\\Deltaf/k = %.2fus, 峰值按三角包络降为1-|\\\\Deltaf|/B=%.2f (理论0.9)',-dfJ/(B/Tp)*1e6,1-dfJ/B);

    dfList=[10 15 20 30]*1e6;
    fig=figure('Visible','off','Position',[100 100 800 600]);
    for q=1:4
    sJq=sSig.*exp(1j*2*pi*dfList(q)*(t-tau0));
    pcq=pc_align(sJq,refc,8192);
    Nf=8192; Yf=fftshift(fft(pcq,Nf)); ff=(-Nf/2:Nf/2-1)'
    /Nf*fs;
    subplot(2,2,q);
    plot(ff/1e6,20*log10(abs(Yf)/max(abs(Yf))+eps),'b'); hold on; grid on;
    band=[max(-15,-15+dfList(q)/1e6) min(15,15+dfList(q)/1e6)]; % 重叠带/MHz
    if band(2)>band(1)
    fill([band(1) band(2) band(2) band(1)],[0 0 -50 -50],'r','FaceAlpha',0.12,'EdgeColor','none');
    end
    xlim([-22 22]); ylim([-50 3]); xlabel('频率/MHz'); ylabel('dB');
    title(sprintf('( %c ) \\\\Deltaf=%dMHz, 重叠带宽=%dMHz', 'a'+q-1, dfList(q)/1e6, max(0,30-dfList(q)/1e6)));
    end
    save_fig112(fig,outdir,'图2-10_不同调制多普勒脉压谱');
    SUM{end+1}='图2-10: 速度欺骗干扰脉压输出谱与匹配滤波器重叠带宽随Δf增大而减小, Δf≥B时无重叠;';

    fprintf('== 图2-12 距离-速度联合欺骗二维处理 ==\\n');
    fs=20e6; Tp=10e-6; B=5e6; PRT=50e-6; Np=64; Ns=round(PRT*fs); t=(0:Ns-1)'/fs;
    tauT=10e-6; fdT=3e3; tauJ2=15e-6; fdJ2=5e3;
    eT=lfm_echo(t,tauT,0,B,Tp).*exp(1j*2*pi*fdT*(t-tauT));
    eJ=lfm_echo(t,tauJ2,0,B,Tp).*exp(1j*2*pi*fdJ2*(t-tauJ2));
    phT=exp(1j*2*pi*fdT*(0:Np-1)*PRT); phJ=exp(1j*2*pi*fdJ2*(0:Np-1)*PRT);
    Rmat=eT*phT+eJ*phJ;
    refL=lfm_ref((0:round(Tp*fs)-1)'
    /fs,0,B,Tp);
    NfP=4096; H=fft(conj(flipud(refL)),NfP);
    Y=ifft(fft(Rmat,NfP,1).*H,[],1); Y=Y(numel(refL):numel(refL)+Ns-1,:);
    NfD=256; Z=fftshift(fft(Y,NfD,2),2); A=abs(Z);
    fDop=(-NfD/2:NfD/2-1)'/NfD/PRT; rAx=(0:Ns-1)'/fs*c_/2/1000;
    [~,ix]=min(abs(rAx-1.2)); [~,iy]=min(abs(rAx-4.5));
    fig=figure('Visible','off','Position',[100 100 900 420]);
    subplot(1,2,1); imagesc(fDop/1000,rAx,20*log10(A/max(A(:))+eps)); axis xy; caxis([-45 0]); colorbar;
    xlabel('多普勒/kHz'); ylabel('距离/km'); title('(a) 距离-多普勒二维图'); ylim([rAx(ix) rAx(iy)]);
    subplot(1,2,2); mesh(fDop/1000,rAx,20*log10(A/max(A(:))+eps)); view(-40,60); colorbar;
    xlabel('多普勒/kHz'); ylabel('距离/km'); zlabel('dB'); title('(b) 三维视图'); ylim([rAx(ix) rAx(iy)]);
    save_fig112(fig,outdir,'图2-12_距离速度联合欺骗二维处理');
    Aq=A; [~,i1]=max(Aq(:)); [r1,d1]=ind2sub(size(Aq),i1);
    Aq(max(1,r1-20):min(end,r1+20),max(1,d1-20):min(end,d1+20))=0;
    [~,i2]=max(Aq(:)); [r2,d2]=ind2sub(size(Aq),i2);
    SUM{end+1}=sprintf('图2-12: 两个峰=(%.2fus,%.0fHz),(%.2fus,%.0fHz) (真值(10,3000),(15,5000))',(r1-1)/fs*1e6,fDop(d1),(r2-1)/fs*1e6,fDop(d2));
    SUM{end+1}='图2-12: 目标(10us,3kHz)与干扰(15us,5kHz)经二维处理各成峰, JSR=0dB, 64脉冲;';

    %% ==================== 第3章 抗压制干扰 ====================
    fprintf('== 图3-8~3-14 频域对消 ==\\n');
    fs=120e6; Tp=10e-6; B=10e6; fc=20e6; fj=15e6; phij=pi/4;
    U0=5; sig=1; BWn=12e6; tau=2e-6; SNR=0;
    N=round(Tp*fs); t=(0:N-1)'/fs;
    sT=lfm_echo(t,tau,fc,B,Tp);
    Un=band_noise(N,fs,BWn,sig);
    J=(U0+Un).*exp(1j*(2*pi*fj*t+phij));
    PJ=(U0^2+sig^2)/2;
    rawGain=10*log10(B*Tp);
    JSRlist=[10 0 -10 -20 -25];
    FD=struct('
    JSR',{},'fhat',{},'phihat',{},'pc',{},'pc0',{},'xi',{},'Y1',{},'f',{});
    sirF=zeros(1,numel(JSRlist)); sir0=zeros(1,numel(JSRlist));
    for q=1:numel(JSRlist)
    Ps=PJ/10^((JSRlist(q)+rawGain)/10);
    x=sqrt(Ps)*sT+J+sqrt(Ps/10^(SNR/10))*(randn(N,1)+1j*randn(N,1))/sqrt(2);
    [rfd,info]=fd_cancel(x,t,fs);
    FD(q).JSR=JSRlist(q); FD(q).fhat=info.fhat; FD(q).phihat=info.phihat;
    Y=fft(x.*exp(-1j*(2*pi*info.fhat*t+info.phihat))); M=numel(Y);
    Y1=zeros(M,1); kk=(2:floor(M/2)).'
    ; Y1(kk)=Y(kk)-conj(Y(M+2-kk));
    FD(q).Y1=Y1; FD(q).xi=angle(x); FD(q).f=(0:M-1)'/M*fs;
    FD(q).pc=pc_align(rfd,lfm_ref(t,fc-fj,B,Tp),4096);
    FD(q).pc0=pc_align(x,lfm_ref(t,fc,B,Tp),4096);
    iT=round(tau*fs)+1; rIdx=[1:iT-40, iT+40:1200];
    sirF(q)=20*log10(max(abs(FD(q).pc(iT-10:iT+10)))/median(abs(FD(q).pc(rIdx))));
    sir0(q)=20*log10(max(abs(FD(q).pc0(iT-10:iT+10)))/median(abs(FD(q).pc0(rIdx))));
    fprintf('
    JSR=%4d dB: fhat=%.4f MHz, phihat=%.3f rad (真值 %.3f)\\n',JSRlist(q),info.fhat/1e6,info.phihat,pi/4);
    end
    save(fullfile(outdir,'
    数据_频域对消.mat'),'FD','JSRlist','-v7.3');

    % 图3-8 锯齿波频谱
    q0=1; Nf=2^nextpow2(numel(t)*8); Xf=fftshift(fft(FD(q0).xi,Nf));
    ff=(-Nf/2:Nf/2-1)'/Nf*fs;
    fig=figure('Visible','off','Position',[100 100 720 420]);
    plot(ff/1e6,abs(Xf)/max(abs(Xf)),'b'); grid on; xlim([-40 40]);
    xlabel('频率/MHz'); ylabel('归一化幅度'); title('图3-8 取对数后虚部(锯齿波)频谱(JSR=10dB)');
    hold on; plot([fj fj]/1e6,[0 1],'r–'); plot([-fj -fj]/1e6,[0 1],'r–');
    text(fj/1e6+0.5,0.9,'+f_j','Color','r'); text(-fj/1e6+0.5,0.9,'-f_j','Color','r');
    save_fig112(fig,outdir,'图3-8_锯齿波频谱');

    % 图3-9 互相关初相
    fhat=FD(q0).fhat; w=2*pi*fhat; refSw=wrap_phase(w*t);
    cc=conv(FD(q0).xi,flipud(refSw)); cc=cc/max(abs(cc));
    lagC=(–(N-1):(N-1))'/fs;
    fig=figure('
    Visible','off','Position',[100 100 720 420]);
    idxW=abs(lagC)<=2/fhat;
    plot(lagC(idxW)*1e6,cc(idxW),'
    b'); grid on;
    xlabel('
    相关时延/\\mus'); ylabel('归一化互相关');
    title('
    图3-9 锯齿波互相关结果(首个峰值对应初相)');
    lagGrid=linspace(0,1/fhat,401)'
    ; ccGrid=zeros(size(lagGrid));
    for jj=1:numel(lagGrid), ccGrid(jj)=FD(q0).xi.'*wrap_phase(w*(t-lagGrid(jj))); end
    [~,imG]=max(ccGrid); lagPk=lagGrid(imG); pkv=ccGrid(imG)/max(abs(ccGrid));
    phiCorr=mod(-w*lagPk,2*pi); % 相关峰对应tau=-phi/omega
    hold on; plot(lagPk*1e6,pkv,'
    ro');
    text(lagPk*1e6,pkv*0.9,sprintf('
    \\\\tau_{peak}=%.3fus, \\\\phi=%.2frad',lagPk*1e6,phiCorr));
    save_fig112(fig,outdir,'
    图3-9_互相关初相估计');
    SUM{end+1}=sprintf('
    图3-8/3-9: 锯齿波频谱峰值间距给出f_j=%.3fMHz; 离散互相关首峰(取phi=-omega*tau)给出%.3frad (真值%.3f), 解缠复指数LS给出%.3frad',fhat/1e6,phiCorr,pi/4,FD(q0).phihat);

    % 图3-10 恢复信号频谱(JSR=0)
    q1=2; Y1=FD(q1).Y1; ff=FD(q1).f;
    fig=figure('Visible','off','Position',[100 100 720 420]);
    sel=ff>=0 & ff<=40e6;
    plot(ff(sel)/1e6,20*log10(abs(Y1(sel))/max(abs(Y1(sel)))+eps),'
    b'); grid on;
    xlabel('
    频率/MHz'); ylabel('归一化幅度/dB'); title('图3-10 频域对消后恢复的目标回波频谱(JSR=0dB)');
    hold on; plot([5 15],[0 0],'
    r–','LineWidth',1.5);
    text(7,-5,'
    目标LFM频带(解调后5~15MHz)','Color','r');
    save_fig112(fig,outdir,'
    图3-10_频域对消后信号频谱');

    % 图3-11 未对消脉压(JSR=10)
    pc0=FD(1).pc0; lag=(0:numel(pc0)-1)'/fs*1e6;
    fig=figure('Visible','off','Position',[100 100 720 420]);
    plot(lag,20*log10(abs(pc0)/max(abs(pc0))+eps),'b'); grid on; xlim([0 10]); ylim([-60 0]);
    xlabel('时延/\\mus'); ylabel('归一化脉压输出/dB'); title('图3-11 不经对消直接脉压输出(JSR=10dB)');
    save_fig112(fig,outdir,'图3-11_未对消脉压输出');

    % 图3-12 不同JSR对消后脉压
    fig=figure('Visible','off','Position',[100 100 840 600]);
    for q=1:4
    pc=FD(q).pc; lag=(0:numel(pc)-1)'/fs*1e6;
    subplot(2,2,q); plot(lag,20*log10(abs(pc)/max(abs(pc))+eps),'
    b'); grid on;
    xlim([0 6]); ylim([-70 0]); xlabel('
    时延/\\mus'); ylabel('dB');
    title(sprintf('
    (%c) JSR=%d dB', 'a'+q-1, JSRlist(q)));
    end
    save_fig112(fig,outdir,'
    图3-12_频域对消不同JSR脉压');

    % 图3-13 JSR=-25 对比
    q5=5; pcF=FD(q5).pc; pcD=FD(q5).pc0; lag=(0:numel(pcF)-1)'/fs*1e6;
    normP=max(abs(pcD));
    fig=figure('Visible','off','Position',[100 100 840 420]);
    subplot(1,2,1); plot(lag,20*log10(abs(pcF)/normP+eps),'b'); grid on; xlim([0 6]); ylim([-70 0]);
    xlabel('时延/\\mus'); ylabel('dB'); title('(a) 经频域对消(JSR=-25dB)');
    subplot(1,2,2); plot(lag,20*log10(abs(pcD)/normP+eps),'k'); grid on; xlim([0 6]); ylim([-70 0]);
    xlabel('时延/\\mus'); ylabel('dB'); title('(b) 不经对消');
    save_fig112(fig,outdir,'图3-13_JSR-25对消对比');

    % 图3-14 条件示意
    fig=figure('Visible','off','Position',[100 100 720 480]);
    subplot(2,1,1); axis([-15 20 -1 2]); hold on; grid on;
    fill([0 10 10 0],[0 0 1 1],'b','FaceAlpha',0.25,'EdgeColor','b');
    fill([-6 6 6 -6],[0 0 1 1],'r','FaceAlpha',0.2,'EdgeColor','r');
    text(4.2,1.08,'目标信号(f_c-f_j=5MHz, B=10MHz)','Color','b');
    text(-5.5,0.55,'干扰(实信号,对称)','Color','r');
    xlabel('解调后频率/MHz'); set(gca,'YTick',[]); title('(a) 满足: 目标谱完全位于正半轴, 可对消(临界情形)');
    subplot(2,1,2); axis([-15 20 -1 2]); hold on; grid on;
    fill([-5 5 5 -5],[0 0 1 1],'b','FaceAlpha',0.25,'EdgeColor','b');
    fill([-6 6 6 -6],[0 0 1 1],'r','FaceAlpha',0.2,'EdgeColor','r');
    text(-4.8,1.08,'目标信号跨骑零频','Color','b'); text(6.2,0.55,'干扰','Color','r');
    xlabel('解调后频率/MHz'); set(gca,'YTick',[]); title('(b) 不满足: 目标谱跨正负半轴, 正负频相减会损伤信号');
    save_fig112(fig,outdir,'图3-14_频域对消条件示意');
    SUM{end+1}=sprintf('图3-12/3-13 峰底比: 对消后=%s dB, 未对消=%s dB (JSR=%s dB)',mat2str(round(sirF,1)),mat2str(round(sir0,1)),mat2str(JSRlist));
    SUM{end+1}='图3-11~3-13: 高JSR时直接脉压被干扰底噪淹没; 对消后目标峰在2us清晰出现; JSR=-20dB仍有效, -25dB时对消后仍有约6dB峰底比改善, 未出现论文所述「反而变差」—本实现相位估计更准所致, 已在脚本头文档化;';

    fprintf('== 图3-15 时域对消 vs 频域对消 ==\\n');
    fs=50e6; Tp=30e-6; B=10e6; fc=0; fj=-10e6; phij=pi/4;
    SNR=10; U0=5; BWn=12e6; tau=2e-6; rawGain=10*log10(B*Tp);
    Nobs=round(1e-3*fs); t=(0:Nobs-1)'/fs;
    sT=lfm_echo(t,tau,fc,B,Tp);
    Un=band_noise(Nobs,fs,BWn,sig); J=(U0+Un).*exp(1j*(2*pi*fj*t+phij));
    PJ=(U0^2+sig^2)/2;
    JSR2=[5 -5]; TDFD=struct('
    JSR',{},'pc0',{},'pcfd',{},'pctd',{},'f_fd',{},'phi_fd',{},'f_td',{},'phi_td',{});
    for q=1:2
    Ps=PJ/10^((JSR2(q)+rawGain)/10);
    x=sqrt(Ps)*sT+J+sqrt(Ps/10^(SNR/10))*(randn(Nobs,1)+1j*randn(Nobs,1))/sqrt(2);
    [rfd,i1]=fd_cancel(x,t,fs); [rtd,i2]=td_cancel(x,t,fs,2^22);
    nseg=round(Tp*fs); iseg=(1:nseg)+round(tau*fs)-round(0.01*Tp*fs);
    refT=lfm_ref((0:nseg-1)'
    /fs,fc,B,Tp);
    pc0=pc_align(x(iseg),refT,8192);
    pcfd=pc_align(rfd(iseg),lfm_ref((0:nseg–1)'/fs,fc–fj,B,Tp),8192);
    pctd=pc_align(rtd(iseg),refT,8192);
    TDFD(q).JSR=JSR2(q); TDFD(q).pc0=pc0; TDFD(q).pcfd=pcfd; TDFD(q).pctd=pctd;
    TDFD(q).f_fd=i1.fhat; TDFD(q).phi_fd=i1.phihat; TDFD(q).f_td=i2.fhat; TDFD(q).phi_td=i2.phihat;
    nPk=round(0.01*Tp*fs)+1;
    TDFD(q).sir0=peak_floor_db(pc0,nPk); TDFD(q).sirfd=peak_floor_db(pcfd,nPk); TDFD(q).sirtd=peak_floor_db(pctd,nPk);
    fprintf(' JSR=%d: fd f=%.4fMHz phi=%.3f; td f=%.4fMHz phi=%.3f\\n',JSR2(q),i1.fhat/1e6,i1.phihat,i2.fhat/1e6,i2.phihat);
    end
    save(fullfile(outdir,'数据_时域频域对比.mat'),'TDFD','JSR2');
    fig=figure('Visible','off','Position',[100 100 900 420]);
    for q=1:2
    subplot(1,2,q); lx=(0:numel(TDFD(q).pc0)–1)'/fs*1e6; ref=max(abs(TDFD(q).pc0))
    ;
    plot(lx,20*log10(abs(TDFD(q).pc0)/ref+eps),'k–'); hold on;
    plot(lx,20*log10(abs(TDFD(q).pcfd)/ref+eps),'b');
    plot(lx,20*log10(abs(TDFD(q).pctd)/ref+eps),'r'); grid on;
    xlim([0 33]); ylim([-50 5]); xlabel('时延/\\mus'); ylabel('归一化脉压/dB');
    legend('未对消','频域对消','时域对消','Location','south');
    title(sprintf('(%c) JSR=%d dB', 'a'+q-1, JSR2(q)));
    end
    save_fig112(fig,outdir,'图3-15_时域与频域对消对比');
    SUM{end+1}=sprintf('图3-15 峰底比(dB): JSR=5 未对消/频域/时域=%.1f/%.1f/%.1f; JSR=-5=%.1f/%.1f/%.1f',TDFD(1).sir0,TDFD(1).sirfd,TDFD(1).sirtd,TDFD(2).sir0,TDFD(2).sirfd,TDFD(2).sirtd);
    SUM{end+1}='图3-15: 两种对消均提升底噪抑制; 时域对消残余底噪更低, 与论文「时域方案更稳健」方向一致; 但本复现中频域对消在-5dB并未完全失效(见上一条数值);';

    fprintf('== 图3-16/3-18/3-19 FFT点数影响 ==\\n');
    fs=1e6; Tp=500e-6; PRT=4e-3; B=1e6; fc=244.2000013333e6; fj=240.2000013333e6; phij=pi/3;
    BWn=0.9e6; SNR=0; JNR=30; sig=1; U0=sqrt(2*10^(JNR/10)-1);
    Nw=round(PRT*fs); t=(0:Nw-1)'/fs;
    tauT=[2e-3 2.667e-3]; rTar=[300 400]*1e3;
    x=zeros(Nw,1);
    for q=1:2, x=x+lfm_echo(t,tauT(q),fc,B,Tp); end
    Un=band_noise(Nw,fs,BWn,sig); J=(U0+Un).*exp(1j*(2*pi*fj*t+phij));
    x=x+J+(randn(Nw,1)+1j*randn(Nw,1))/sqrt(2);
    refT=lfm_ref((0:round(Tp*fs)-1)'
    /fs,fc,B,Tp);
    Llist=[500000 1000000 2000000 4000000];
    PCs=cell(1,4); fh=zeros(1,4); phh=zeros(1,4); pfFF=zeros(1,4);
    for q=1:4
    L=Llist(q); nEst=min(Nw,L);
    [~,info]=td_cancel(x(1:nEst),t(1:nEst),fs,L);
    r=x-abs(x).*exp(1j*(2*pi*info.fhat*t+info.phihat));
    pcc=pc_align(r,refT,4096); PCs{q}=pcc; fh(q)=info.fhat; phh(q)=info.phihat;
    pf1=peak_floor_db(pcc,tauT(1)*fs); pf2=peak_floor_db(pcc,tauT(2)*fs);
    fprintf(' FFT=%dK: fhat=%.6f MHz, phi=%.3f, 峰底比(两目标)=%.1f/%.1fdB\\n',L/1000,info.fhat/1e6,info.phihat,pf1,pf2);
    pfFF(q)=pf1;
    end
    save(fullfile(outdir,'数据_FFT点数.mat'),'Llist','fh','phh','PCs','-v7.3');
    rAxP=(0:numel(PCs{1})-1)'/fs*c_/2/1000;
    fig=figure('
    Visible','off','Position',[100 100 900 700]);
    for q=1:4
    pc=PCs{q}; subplot(2,2,q);
    plot(rAxP,20*log10(abs(pc)/max(abs(pc))+eps),'
    b'); grid on; xlim([250 450]); ylim([-80 0]);
    xlabel('
    距离/km'); ylabel('dB'); title(sprintf('(%c) FFT点数=%d万', 'a'+q-1, Llist(q)/1e4));
    end
    save_fig112(fig,outdir,'
    图3-16_FFT点数影响');

    % 图3-18/19: 粗FFT需非整格载频才能体现频率量化残差, 取0.2001MHz偏移(与图3-16数据集B区分)
    fcB=244.2001e6; fjB=240.2001e6;
    xB=zeros(Nw,1);
    for q=1:2, xB=xB+lfm_echo(t,tauT(q),fcB,B,Tp); end
    UnB=band_noise(Nw,fs,BWn,sig);
    xB=xB+(U0+UnB).*exp(1j*(2*pi*fjB*t+phij))+(randn(Nw,1)+1j*randn(Nw,1))/sqrt(2);
    refTB=lfm_ref((0:round(Tp*fs)-1)'/fs,fcB,B,Tp);
    L=2500; nEst=min(Nw,L); [~,i18]=td_cancel(xB(1:nEst),t(1:nEst),fs,L);
    r18=xB-abs(xB).*exp(1j*(2*pi*i18.fhat*t+i18.phihat)); pc18=pc_align(r18,refTB,4096);
    pf18=peak_floor_db(pc18,tauT(1)*fs);
    fig=figure('Visible','off','Position',[100 100 720 420]);
    plot(rAxP,20*log10(abs(pc18)/max(abs(pc18))+eps),'b'); grid on; xlim([150 550]); ylim([-60 0]);
    xlabel('距离/km'); ylabel('dB'); title(sprintf('图3-18 FFT点数=2500(\\\\Deltat=%.2fs)对消后脉压',1/(fs/L)));
    save_fig112(fig,outdir,'图3-18_FFT2500点对消结果');

    L=250; nEst=min(Nw,L); [~,i19]=td_cancel(xB(1:nEst),t(1:nEst),fs,L);
    r19=xB-abs(xB).*exp(1j*(2*pi*i19.fhat*t+i19.phihat)); pc19=pc_align(r19,refTB,4096);
    pf19=peak_floor_db(pc19,tauT(1)*fs);
    fig=figure('Visible','off','Position',[100 100 720 420]);
    plot(rAxP,20*log10(abs(pc19)/max(abs(pc19))+eps),'b'); grid on; xlim([150 550]); ylim([-60 0]);
    xlabel('距离/km'); ylabel('dB'); title(sprintf('图3-19 FFT点数=250(\\\\Deltat=%.2fs)对消后脉压',1/(fs/L)));
    save_fig112(fig,outdir,'图3-19_FFT250点对消结果');
    SUM{end+1}=sprintf('图3-16: 目标1峰底比随FFT点数(50/100/200/400万)=%s dB, 仅呈微弱改善(注: JNR=30dB时补零带来的频率/相位量化残差低于目标/噪声底, 与论文的明显提升不完全一致; 2500/250点粗网格另设0.2001MHz偏移载频以体现式3-29包络); 载频整体+0.2MHz以消除240MHz为fs整数倍的平凡混叠; 目标时延按300/400km为2/2.667ms;',mat2str(round(pfFF,2)));
    SUM{end+1}=sprintf('图3-18/19: 2500点/250点对消后目标峰底比=%.1f/%.1fdB (200万点以上约%.1fdB), 粗网格残余明显;',pf18,pf19,pfFF(3));

    fprintf('== 图3-22/3-23 分布式时域对消与融合 ==\\n');
    fs=1e6; Tp=500e-6; B=1e6; fc=100.234567e6; fj=95.234567e6; BWn=0.9e6;
    SNR=0; JNR=30; sig=1; U0=sqrt(2*10^(JNR/10)-1);
    tau4=[2.000 2.001 1.999 2.002]*1e-3; phi4=[0.3 1.1 2.2 4.0];
    Nw=round(3e-3*fs); t=(0:Nw-1)'/fs;
    refT=lfm_ref((0:round(Tp*fs)-1)'
    /fs,fc,B,Tp);
    pc4=cell(1,4); snr4=zeros(1,4);
    for q=1:4
    xq=lfm_echo(t,tau4(q),fc,B,Tp);
    Un=band_noise(Nw,fs,BWn,sig);
    xq=xq+(U0+Un).*exp(1j*(2*pi*fj*t+phi4(q)))+(randn(Nw,1)+1j*randn(Nw,1))/sqrt(2);
    [~,ii4]=td_cancel(xq,t,fs,5e6);
    rq=xq-abs(xq).*exp(1j*(2*pi*ii4.fhat*t+ii4.phihat));
    pcq=pc_align(rq,refT,4096); pc4{q}=pcq;
    snr4(q)=peak_floor_db(pcq,tau4(q)*fs);
    fprintf(' 节点%d: fhat=%.4fMHz phi=%.3f, 峰底比=%.1fdB\\n',q,ii4.fhat/1e6,ii4.phihat,snr4(q));
    end
    save(fullfile(outdir,'数据_分布式对消.mat'),'tau4','snr4');
    rAxP=(0:numel(pc4{1})-1)'/fs*c_/2/1000;
    fig=figure('
    Visible','off','Position',[100 100 900 700]);
    refMax=max(abs(pc4{1}));
    for q=1:4
    subplot(2,2,q); plot(rAxP,20*log10(abs(pc4{q})/refMax+eps),'
    b'); grid on;
    xlim([250 400]); ylim([-60 0]); xlabel('
    距离/km'); ylabel('dB');
    title(sprintf('
    (%c) 雷达%d 对消结果(峰底比%.1fdB)', 'a'+q-1, q, snr4(q)));
    end
    save_fig112(fig,outdir,'
    图3-22_各子节点对消结果');
    d4=[0 1 -1 2]; pcAl=zeros(size(pc4{1}));
    for q=1:4, pcAl=pcAl+circshift(pc4{q},-d4(q)); end
    snrF=peak_floor_db(pcAl,tau4(1)*fs);
    fig=figure('
    Visible','off','Position',[100 100 720 420]);
    plot(rAxP,20*log10(abs(pcAl)/refMax+eps),'
    r','LineWidth',1.4); grid on;
    xlim([250 400]); ylim([-60 15]); xlabel('
    距离/km'); ylabel('dB');
    title(sprintf('
    图3-23 分布式融合后对消结果(峰底比%.1fdB, 单节点平均%.1fdB)',snrF,mean(snr4)));
    save_fig112(fig,outdir,'
    图3-23_分布式融合对消结果');
    SUM{end+1}=sprintf('
    图3-22/3-23: 4节点分别时域对消后峰底比=%s dB; 时延对齐相干融合后%.1fdB, 相对单节点平均提升%.1fdB (理论4节点相干增益6dB)',mat2str(round(snr4,1)),snrF,snrF-mean(snr4));

    %% ==================== 第4章 抗距离-速度联合欺骗 ====================
    fprintf('== 图4-13~4-17 三节点距离-多普勒处理与信息提取 ==\\n');
    fs=20e6; Tp=10e-6; B=5e6; PRT=50e-6; fc=1e9; c=c_;
    h=1500; v=600; th=[30 45 60]*pi/180; th0=30*pi/180;
    Ri=h./sin(th); tau3=2*Ri/c;
    fd3=v*(cos(th0)+cos(th)).*fc/c;
    Np=256; Ns=round(PRT*fs); t=(0:Ns-1)'
    /fs;
    k=B/Tp; refL=zeros(Ns,1); mm=(t>=-Tp/2)&(t<Tp/2);
    refL(mm)=exp(1j*2*pi*(fc*(t(mm)-Tp/2)+0.5*k*(t(mm)-Tp/2).^2));
    NfP=4096; H=fft(conj(flipud(refL)),NfP); NfD=1024;
    fDop=(-NfD/2:NfD/2-1)'/NfD/PRT;
    DelTau=5e-6; fdJ=5e3;
    lam=1; sj=1; sn=1;
    eT=cell(1,3); eJ=cell(1,3); phT=cell(1,3); phJ=cell(1,3);
    for q=1:3
    u1=t-tau3(q)-Tp/2; m1=(u1>=-Tp/2)&(u1<Tp/2);
    u2=t-(tau3(q)+DelTau)-Tp/2; m2=(u2>=-Tp/2)&(u2<Tp/2);
    e1=zeros(Ns,1); e2=zeros(Ns,1);
    e1(m1)=exp(1j*2*pi*(fc*u1(m1)+0.5*k*u1(m1).^2+fd3(q)*u1(m1)));
    e2(m2)=exp(1j*2*pi*(fc*u2(m2)+0.5*k*u2(m2).^2+fdJ*u2(m2)));
    eT{q}=e1; eJ{q}=e2;
    phT{q}=exp(1j*2*pi*fd3(q)*(0:Np-1)*PRT);
    phJ{q}=exp(1j*2*pi*fdJ*(0:Np-1)*PRT);
    end
    A3=cell(1,3); dets=nan(3,2,3); pts=cell(1,3);
    for q=1:3
    Rm=lam*(eT{q}*phT{q})+sj*(eJ{q}*phJ{q})+sn*(randn(Ns,Np)+1j*randn(Ns,Np))/sqrt(2);
    Y=ifft(fft(Rm,NfP,1).*H,[],1); Y=Y(numel(refL):numel(refL)+Ns-1,:);
    Z=fftshift(fft(Y,NfD,2),2); A3{q}=abs(Z);
    [dd,pp]=detect_two_classes(A3{q},fDop,t,0.3);
    dets(q,:,:)=dd; pts{q}=pp;
    fprintf('
    雷达%d: 类1=(%.2fus,%.0fHz) 类2=(%.2fus,%.0fHz); 真值=(%.2fus,%.0fHz)\\n',q,dd(1,1)*1e6,dd(1,2),dd(2,1)*1e6,dd(2,2),tau3(q)*1e6,fd3(q));
    end
    [okD,infoD]=assoc_ok(dets,0.3,200,30,c);
    save(fullfile(outdir,'
    数据_抗欺骗检测.mat'),'tau3','fd3','Ri','dets','infoD','okD');
    rAx3=(0:Ns-1)'
    /fs*c/2/1000;
    fig=figure('Visible','off','Position',[100 100 1050 360]);
    for q=1:3
    subplot(1,3,q); imagesc(fDop/1000,rAx3,20*log10(A3{q}/max(A3{q}(:))+eps));
    axis xy; caxis([-40 0]); colorbar; xlabel('多普勒/kHz'); ylabel('距离/km');
    xlim([-8 8]); ylim([1.5 3.5]); title(sprintf('(%c) 雷达%d 二维处理', 'a'+q-1,q));
    end
    save_fig112(fig,outdir,'图4-13_各节点二维处理结果');

    fig=figure('Visible','off','Position',[100 100 1050 360]);
    for q=1:3
    subplot(1,3,q); hold on; grid on;
    pp=pts{q}; c1=pp.cls==1; c2=pp.cls==2;
    scatter(pp.tau(c1)*c/2/1000,fDop(pp.dop(c1))/1000,28,'filled','MarkerFaceColor',[0.8 0.2 0.2]);
    scatter(pp.tau(c2)*c/2/1000,fDop(pp.dop(c2))/1000,28,'filled','MarkerFaceColor',[0.2 0.4 0.9]);
    scatter(dets(q,:,1)*c/2/1000,dets(q,:,2)/1000,160,'kp');
    xlabel('距离/km'); ylabel('多普勒/kHz'); xlim([1.5 3.5]); ylim([2 6]);
    title(sprintf('(%c) 雷达%d 提取的信息', 'a'+q-1,q));
    legend('类1(最大点邻域)','类2','类中心','Location','southoutside');
    end
    save_fig112(fig,outdir,'图4-14_各节点距离多普勒信息');

    % 图4-15 三雷达同平面
    fig=figure('Visible','off','Position',[100 100 720 480]); hold on; grid on;
    mk={'o','s','^'}; hh=zeros(1,3);
    for q=1:3
    for cc=1:2
    if infoD.jamSlot(q)==cc, col=[0.85 0.15 0.15]; else, col=[0.15 0.35 0.9]; end
    h=scatter(dets(q,cc,1)*c/2/1000,dets(q,cc,2)/1000,70,mk{q},'MarkerEdgeColor',col,'LineWidth',1.6);
    if cc==1, hh(q)=h; end
    end
    end
    xlabel('距离/km'); ylabel('多普勒/kHz'); title('图4-15 三部雷达距离-多普勒信息(红=假目标, 蓝=真目标)');
    legend(hh,{'雷达1','雷达2','雷达3'},'Location','best');
    save_fig112(fig,outdir,'图4-15_三部雷达信息同平面');

    % 图4-16 排序与滑窗
    detsT=permute(dets,[2 1 3]); fdList=reshape(detsT(:,:,2),[],1).';
    [sortedFd,idxSort]=sort(fdList);
    fig=figure('
    Visible','off','Position',[100 100 840 420]);
    subplot(1,2,1); stem(1:6,fdList/1000,'
    filled'); grid on; xlim([0.5 6.5]);
    xlabel('
    目标序号(按雷达1类1,类2,...排列)'); ylabel('多普勒/kHz'); title('(a) 排序前');
    subplot(1,2,2); stem(1:6,sortedFd/1000,'
    filled'); hold on; grid on; xlim([0.5 6.5]);
    if ~isempty(infoD.found)
    x1=infoD.found(1); x2=infoD.found(end);
    yb=sortedFd(x1)/1000;
    plot([x1-0.4 x2+0.4 x2+0.4 x1-0.4 x1-0.4],[yb-0.1 yb-0.1 yb+0.1 yb+0.1 yb-0.1],'
    r-','LineWidth',1.5);
    stem(infoD.found,sortedFd(infoD.found)/1000,'
    filled','r');
    end
    xlabel('
    排序后序号'); ylabel('多普勒/kHz'); title('(b) 排序后(红框为滑窗识别出的假目标簇)');
    save_fig112(fig,outdir,'
    图4-16_多普勒排序与滑窗');

    % 图4-17 真假目标分布
    fig=figure('Visible','off','Position',[100 100 720 480]); hold on; grid on;
    for q=1:3
    js=infoD.jamSlot(q); ts=3-js;
    scatter(dets(q,js,1)*c/2/1000,dets(q,js,2)/1000,90,'
    filled','MarkerFaceColor',[0.85 0.15 0.15]);
    scatter(dets(q,ts,1)*c/2/1000,dets(q,ts,2)/1000,90,'
    filled','MarkerFaceColor',[0.15 0.35 0.9]);
    plot(dets(q,[js ts],1)*c/2/1000,dets(q,[js ts],2)/1000,'
    k–');
    end
    xlabel('
    距离/km'); ylabel('多普勒/kHz'); title('图4-17 假目标(红)与真目标(蓝)在距离-多普勒平面上的分布');
    text(2.5,4.6,sprintf('
    \\\\DeltaR=%s m, 一致性门限30m',mat2str(round(infoD.deltas))));
    save_fig112(fig,outdir,'
    图4-17_真假目标分布');
    SUM{end+1}=sprintf('
    图4-13~4-17: 三节点检测结果(时延us/多普勒Hz): R1(%s), R2(%s), R3(%s); 识别假目标多普勒≈%.0fHz, 距离偏移ΔR=%s m, 结果%s',…
    mat2str(round(dets(1,:,1)*1e6,2)),mat2str(round(dets(2,:,1)*1e6,2)),mat2str(round(dets(3,:,1)*1e6,2)),…
    mean([dets(1,infoD.jamSlot(1),2),dets(2,infoD.jamSlot(2),2),dets(3,infoD.jamSlot(3),2)]),…
    mat2str(round(infoD.deltas)),mat2str(okD));

    fprintf('== 图4-18/4-19 检测概率蒙特卡洛 ==\\n');
    MC_TRIALS=1000; NpMC=128; NfPMC=2048; NfDMC=512;
    snrMC=-20:2:0;
    tic;
    Dmc=mc_run112(tau3,fd3,lam,sj,DelTau,fdJ,c,Tp,B,fc,fs,PRT,NpMC,NfPMC,NfDMC,snrMC,MC_TRIALS);
    tMC=toc; fprintf('
    蒙特卡洛用时 %.1f s\\n',tMC);
    save(fullfile(outdir,'
    数据_检测概率MC.mat'),'Dmc','snrMC','MC_TRIALS','NpMC','NfPMC','NfDMC','-v7.3');
    % 图4-18 固定门限0.3
    Pd=zeros(size(snrMC));
    for a=1:numel(snrMC)
    cnt=0;
    for tr=1:MC_TRIALS
    dd=squeeze(Dmc(a,tr,:,:,:));
    [ok,~]=assoc_ok(dd,0.3,200,30,c);
    cnt=cnt+ok;
    end
    Pd(a)=cnt/MC_TRIALS;
    end
    fig=figure('
    Visible','off','Position',[100 100 720 420]);
    plot(snrMC,Pd,'
    bo-','LineWidth',1.5,'MarkerFaceColor','b'); grid on; ylim([-0.02 1.02]);
    xlabel('
    输入信噪比/dB'); ylabel('检测概率'); title('图4-18 检测概率随信噪比变化(门限0.3, 1000次)');
    save_fig112(fig,outdir,'
    图4-18_检测概率随SNR');
    % 图4-19 门限扫描
    thrAx=0.1:0.1:1.0; snrSel=[-10 -6 0];
    PdThr=zeros(numel(snrSel),numel(thrAx));
    for b=1:numel(snrSel)
    a=find(snrMC==snrSel(b));
    for tq=1:numel(thrAx)
    cnt=0;
    for tr=1:MC_TRIALS
    dd=squeeze(Dmc(a,tr,:,:,:));
    [ok,~]=assoc_ok(dd,thrAx(tq),200,30,c);
    cnt=cnt+ok;
    end
    PdThr(b,tq)=cnt/MC_TRIALS;
    end
    end
    fig=figure('
    Visible','off','Position',[100 100 900 420]);
    for b=1:3
    subplot(1,3,b); plot(thrAx,PdThr(b,:),'
    bo-','LineWidth',1.4); grid on; ylim([-0.02 1.02]);
    xlabel('
    检测门限'); ylabel('检测概率'); title(sprintf('(%c) SNR=%d dB', 'a'+b-1,snrSel(b)));
    end
    save_fig112(fig,outdir,'
    图4-19_检测概率随门限');
    SUM{end+1}=sprintf('
    图4-18: 输入SNR=%s dB时检测概率=%s (门限0.3, JNR=0dB, %d次MC, %d脉冲)',…
    mat2str(snrMC),mat2str(round(Pd,2)),MC_TRIALS,NpMC);
    SUM{end+1}=sprintf('
    图4-19: SNR=-10/-6/0dB, 门限0.1~1.0时检测概率曲线已保存; 门限过高时目标峰不通过门限导致Pd下降, 与论文趋势一致; MC总用时%.0fs',tMC);

    %% ==================== 保存汇总 ====================
    fid=fopen(fullfile(outdir,'结果汇总.txt'),'w','n','UTF-8');
    fprintf(fid,'
    %s\\n',SUM{:});
    fclose(fid);
    fprintf('
    \\n全部完成, 结果目录: %s\\n',outdir);

    %% ==================== 局部函数 ====================
    function r=lfm_echo(t,tau,fc,B,Tp)
    u=t-tau-Tp/2; k=B/Tp; r=zeros(size(t));
    m=(u>=-Tp/2)&(u<Tp/2);
    r(m)=exp(1j*2*pi*(fc*u(m)+0.5*k*u(m).^2));
    end
    function r=lfm_ref(t,fc,B,Tp)
    u=t-Tp/2; k=B/Tp; r=zeros(size(t));
    m=(u>=-Tp/2)&(u<Tp/2);
    r(m)=exp(1j*2*pi*(fc*u(m)+0.5*k*u(m).^2));
    end
    function pc=pc_align(x,ref,Nfft)
    h=conj(flipud(ref(:)));
    Y=ifft(fft(x(:),Nfft).*fft(h,Nfft));
    Ns=numel(ref);
    pc=Y(Ns:end);
    end
    function Un=band_noise(N,fs,BW,sig)
    n=randn(N,1); Nf=2^nextpow2(4*N);
    X=fft(n,Nf); f=(0:Nf-1)'/Nf*fs; f(f>fs/2)=f(f>fs/2)-fs;
    X(abs(f)>BW/2)=0;
    Un=real(ifft(X,Nf)); Un=Un(1:N); Un=Un/std(Un)*sig;
    end
    function w=wrap_phase(u)
    w=angle(exp(1j*u));
    end
    function [r,info]=fd_cancel(x,t,fs)
    xi=angle(x); N=numel(x); Nfft=2^nextpow2(8*N);
    Xf=fftshift(fft(xi,Nfft)); f=(-Nfft/2:Nfft/2-1)'/Nfft*fs; mag=abs(Xf);
    [~,ip]=max(mag.*(f>1e5)); [~,in]=max(mag.*(f<-1e5)); fmag=(f(ip)-f(in))/2;
    z=x./max(abs(x),eps); best=-inf; phihat=0; wbest=2*pi*fmag;
    for sgn=[1 -1]
    w=sgn*2*pi*fmag;
    ph=mod(angle(sum(z.*exp(-1j*w*t))),2*pi);
    sc=xi.'
    *wrap_phase(w*t+ph);
    if sc>best, best=sc; phihat=ph; wbest=w; end
    end
    y=x.*exp(-1j*(wbest*t+phihat)); Y=fft(y); M=numel(y);
    Y1=zeros(M,1); kk=(2:floor(M/2)).'; Y1(kk)=Y(kk)-conj(Y(M+2-kk));
    r=ifft(Y1);
    info.fhat=wbest/2/pi; info.phihat=phihat;
    end
    function [r,info]=td_cancel(x,t,fs,NfftZ)
    Ahat=abs(x); z=x./max(Ahat,eps);
    Z=fft(z,NfftZ); [~,im]=max(abs(Z));
    fhat=(im-1)*fs/NfftZ; if fhat>fs/2, fhat=fhat-fs; end
    w=2*pi*fhat; phihat=angle(Z(im)); % 论文式(3-16): 峰点频点对应的相位
    r=x-Ahat.*exp(1j*(w*t+phihat));
    info.fhat=fhat; info.phihat=phihat;
    end
    function v=peak_floor_db(pc,nPk)
    nPk=round(nPk)+1; nPk=max(5,min(numel(pc)-5,nPk));
    pk=max(abs(pc(max(1,nPk-5):min(numel(pc),nPk+5))));
    lo=max(1,nPk-500); hi=min(numel(pc),nPk+500);
    idx=lo:hi; idx=idx(abs(idx-nPk)>20);
    fl=median(abs(pc(idx)));
    v=20*log10(pk/max(fl,eps));
    end
    function [det,pts]=detect_two_classes(A,fDop,tauAx,thr)
    mx=max(A(:)); [~,imx]=max(A(:)); [ri,di]=ind2sub(size(A),imx);
    [ii,jj]=find(A>thr*mx);
    w=A(sub2ind(size(A),ii,jj));
    dR=abs(ii-ri); dD=abs(jj-di);
    c1=(dR<=20)&(dD<=20);
    det=nan(2,3);
    for cc=1:2
    sel=(cc==1 & c1)|(cc==2 & ~c1);
    if any(sel)
    ww=w(sel); rr=ii(sel); dd=jj(sel);
    det(cc,1)=sum(tauAx(rr).*ww)/sum(ww);
    det(cc,2)=sum(fDop(dd).*ww)/sum(ww);
    det(cc,3)=max(ww)/mx;
    end
    end
    pts.tau=tauAx(ii); pts.dop=jj; pts.cls=1+c1; pts.val=w/mx;
    end
    function [ok,info]=assoc_ok(dets,thr,Wd,eps2,c)
    info.jamSlot=zeros(3,1); info.trueSlot=zeros(3,1); info.found=[]; info.deltas=nan(3,1);
    ok=false;
    P=dets(:,:,3)>=thr;
    if any(sum(P,2)<2), return; end
    detsT=permute(dets,[2 1 3]); % 行优先: R1C1,R1C2,R2C1,…
    fdList=reshape(detsT(:,:,2),[],1);
    if any(isnan(fdList)), return; end
    [v,idx]=sort(fdList); n=numel(v); found=[];
    for i=1:n
    j=i; while j<=n && v(j)-v(i)<=Wd, j=j+1; end
    if j-i>=3, found=(i:j-1)'
    ; break; end
    end
    if isempty(found), return; end
    for kk=found.'
    r=ceil(idx(kk)/2); s=idx(kk)-2*(r-1);
    if info.jamSlot(r)~=0, return; end
    info.jamSlot(r)=s;
    end
    if any(info.jamSlot==0), return; end
    info.trueSlot=3-info.jamSlot;
    for r=1:3
    info.deltas(r)=abs(dets(r,info.jamSlot(r),1)-dets(r,info.trueSlot(r),1))*c/2;
    end
    info.found=found;
    ok=(max(info.deltas)-min(info.deltas))<=eps2;
    end
    function D=mc_run112(tau3,fd3,lam,sj,DelTau,fdJ,c,Tp,B,fc,fs,PRT,Np,NfP,NfD,snrMC,trials)
    Ns=round(PRT*fs); t=(0:Ns-1)'
    /fs; k=B/Tp;
    refL=zeros(Ns,1); mm=(t>=-Tp/2)&(t<Tp/2);
    refL(mm)=exp(1j*2*pi*(fc*(t(mm)-Tp/2)+0.5*k*(t(mm)-Tp/2).^2));
    H=fft(conj(flipud(refL)),NfP);
    fDop=(-NfD/2:NfD/2-1)'/NfD/PRT; tauAx=(0:Ns-1)'/fs;
    eT=cell(1,3); eJ=cell(1,3); phT=cell(1,3); phJ=cell(1,3);
    for q=1:3
    u1=t-tau3(q)-Tp/2; m1=(u1>=-Tp/2)&(u1<Tp/2);
    u2=t-(tau3(q)+DelTau)-Tp/2; m2=(u2>=-Tp/2)&(u2<Tp/2);
    e1=zeros(Ns,1); e2=zeros(Ns,1);
    e1(m1)=exp(1j*2*pi*(fc*u1(m1)+0.5*k*u1(m1).^2+fd3(q)*u1(m1)));
    e2(m2)=exp(1j*2*pi*(fc*u2(m2)+0.5*k*u2(m2).^2+fdJ*u2(m2)));
    eT{q}=e1; eJ{q}=e2;
    phT{q}=exp(1j*2*pi*fd3(q)*(0:Np-1)*PRT);
    phJ{q}=exp(1j*2*pi*fdJ*(0:Np-1)*PRT);
    end
    D=nan(numel(snrMC),trials,3,2,3);
    for a=1:numel(snrMC)
    la=10^(snrMC(a)/20);
    for tr=1:trials
    for q=1:3
    Rm=la*(eT{q}*phT{q})+sj*(eJ{q}*phJ{q})+(randn(Ns,Np)+1j*randn(Ns,Np))/sqrt(2);
    Y=ifft(fft(Rm,NfP,1).*H,[],1); Y=Y(Ns:2*Ns-1,:);
    Z=fftshift(fft(Y,NfD,2),2); A=abs(Z);
    dd=detect_two_classes(A,fDop,tauAx,0.1);
    D(a,tr,q,:,:)=reshape(dd,1,2,3);
    end
    end
    end
    end
    function save_fig112(fig,outdir,name)
    set(fig,'Color','w');
    exportgraphics(fig,fullfile(outdir,[name '.png']),'Resolution',150);
    savefig(fig,fullfile(outdir,[name '.fig']));
    close(fig);
    end

    • 运行时间约 7 分钟,其中图 4-18/4-19 的 1000 次蒙特卡洛占约 327 s;
    • 输出目录 D:\\JAM\\results_distributed_radar\\:27 幅 PNG+FIG、6 个 MAT、UTF-8 结果汇总.txt、run_log.txt;
    • 若在中文 Windows 下需要查看命令行日志,MATLAB 输出为 GBK,可用 iconv -f GBK -t UTF-8 转换。

    6.2 ⚠️ 八个工程坑

    #坑点现象处理
    1 JSR 口径未说明 按原始输入 JSR 复现时,−20 dB 就失效,无法对上论文 采用"脉压后目标峰值"口径:JSRraw=JSR+10log10(B*Tp);并在文中注明该约定
    2 LFM 调频方向与频域对消条件 信号谱跨骑零频,正负频相减把目标也减掉 用对称 LFM;保证 fc−fj>B/2f_c-f_j>B/2fc​−fj​>B/2;3.3 用复包络等效(载频差 10 MHz)
    3 解析信号乘 2 目标峰虚高 6 dB,峰底比"好看"但不可信 解析信号负频本来就是零,频域对消后不要乘 2
    4 载频是采样率整数倍 240/244 MHz 对 1 MHz 采样都退化为直流,补零完全无效 整体平移 0.2 MHz(图 3-16)或 0.2001 MHz(图 3-18/19),避开平凡混叠
    5 补零收益被噪声底掩盖 图 3-16 四个面板几乎相同,与论文不符 保留负结果并解释:JNR=30 dB 下量化残差已低于噪声底;不要为了"像论文"而人为加噪
    6 MATLAB reshape 列优先 三站关联把同一雷达判成两个假目标 detsT=permute(dets,[2 1 3]) 后再 reshape
    7 脉压对齐偏移 峰位整体偏移半个脉宽或参考长度 参考长度 NsN_sNs​ 时取 Y(Ns:Ns+Ns-1);中心化 LFM 的参考也要用相同 NsN_sNs​
    8 第 4 章时延口径 按 (RT+Ri)/c(R_T+R_i)/c(RT​+Ri​)/c 计算与论文数值对不上 按论文数值取 2Ri/c2R_i/c2Ri​/c;假目标多普勒取恒定 5 kHz(而非各站真多普勒+5 kHz)

    复现脚本已把上述约定逐条写在文件头部(第 12~37 行),结果汇总.txt 中同步给出每幅图对应的数值,便于对照。

    七、复杂度与适用场景分析

    步骤复杂度说明
    频域对消 O(Nlog⁡N)O(N\\log N)O(NlogN) 一次 8 倍补零 FFT + 正负频相减 + 一次 IFFT;相位用闭式 LS
    时域对消 O(Llog⁡L)O(L\\log L)O(LlogL) LLL 为补零 FFT 点数(复现中 5M),L≫NL\\gg NL≫N 时由 FFT 主导
    距离-多普勒处理 O(NpNrlog⁡Nr+NrNdlog⁡Nd)O(N_p N_r\\log N_r+N_r N_d\\log N_d)O(Np​Nr​logNr​+Nr​Nd​logNd​) 逐脉冲脉压 + 慢时间 FFT
    多站关联 O(Klog⁡K)O(K\\log K)O(KlogK) K=2NK=2NK=2N 个候选目标的排序与滑窗
    分布式融合 O(MN)O(MN)O(MN) MMM 节点、每节点 NNN 点相干累加

    适用场景与边界

    • 频域对消:适合强干扰(干扰能量占主导)且 fc−fj>B/2f_c-f_j>B/2fc​−fj​>B/2、采样率足够高的场景;对相位误差非常敏感,低 JSR 下参数估计会被目标污染。
    • 时域对消:不要求载频间隔,适合连续噪声调幅干扰和长观测窗;前提是干扰在观测窗内平均占主导,且 FFT 频率精度足够。
    • 分布式融合:适合有中心站、节点间可时间/空间同步的组网雷达;增益上限 10log⁡10M10\\log_{10}M10log10​M,实际受同步误差、目标 RCS 差异影响。
    • 参数关联识别:适合≥3 节点、真假目标在距离-多普勒平面可分的自卫式距离-速度联合欺骗;若存在多个真目标、或假目标多普勒被有意随机化,需要扩展为多假设关联或引入幅度/RCS 分集特征。

    八、总结与延伸阅读

    这篇论文把"压制干扰抑制"和"欺骗干扰识别"放在同一个分布式雷达框架下:前端用频域/时域对消把噪声调幅干扰压下去,中心站用相干融合换 SNR;后端用多节点距离-多普勒参数关联,把 DRFM 假目标从真目标中剥离出来。复现得到的核心结论是:

  • 频域对消在强干扰下非常有效(峰底比 ~30 dB),但受"信号单边谱"条件约束;
  • 时域对消更稳健,代价是目标幅度可能减半,综合峰底比仍更优;
  • 四节点融合实测 +5.7 dB,与理论 6 dB 基本一致;
  • 三节点参数关联可以在 0 dB 输入 SNR 下正确识别 +750 m/5 kHz 的假目标,并在 −8 dB 时仍有 0.98 的检测概率;
  • 论文中若干参数口径(JSR、载频、FFT 点数)自相矛盾,复现时必须显式约定并记录偏差——这比"把图做得像"更重要。
  • 延伸阅读(本专栏相关复现)

    • [40] 认知雷达多维联合抗主瓣干扰:同样面对"强干扰下的目标检测",但走的是发射-接收联合优化而非对消路线,可与本文的频域/时域对消形成"波形域 vs 信号域"的对照。
      ../results_cognitive_mainlobe/复现文章_[40]_认知雷达多维联合抗主瓣干扰.md
    • [50] 间歇采样转发式干扰的时频域辨识与抑制:另一种 DRFM 转发干扰,重点在时频域辨识与滤波,可与本文第 4 章的参数关联识别互补。
      ../results_isrj_tfsuppress/复现文章_[50]_ISRJ时频域辨识与抑制.md
    • [61] 捷变频联合波形熵的密集假目标干扰抑制:面向密集假目标的另一条路线(波形熵 + 稀疏重构),与本文"多站多普勒聚类"形成单站/多站两种思路的对比。
      ../results_freqagile_entropy/复现文章_[61]_捷变频联合波形熵抑制密集假目标.md

    参考文献

  • 张帅. 分布式雷达抗干扰与目标检测方法研究[D]. 成都: 电子科技大学, 2017.
  • 杜东平, 唐斌. 基于频域对消的噪声调幅干扰抑制算法[J]. 电子与信息学报, 2007, 29(3): 557-559.
  • 复现资产:脚本 D:\\JAM\\reproduce_distributed_radar.m;结果 D:\\JAM\\results_distributed_radar\\(27 幅图、6 个 MAT、结果汇总与运行日志)。
  • 说明:本文公式编号沿用论文式号;带 * 的编号为复现补充的等价条件或定义。所有结果均由上述脚本在本机 MATLAB R2025b 实际运行得到;与原文不一致之处已在第五节和脚本头部逐条注明。

    赞(0)
    未经允许不得转载:171主机测评 » 【论文复现】(附MATLAB源码)112 | 分布式雷达抗干扰与目标检测:从噪声调幅对消到距离-速度联合欺骗识别
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址