固定频率移频干扰的Matlab实现:让线性调频雷达产生假目标

发布时间:2026/10/3 10:34:02
固定频率移频干扰的Matlab实现:让线性调频雷达产生假目标 简介一份面向MATLAB算法学习与信号干扰仿真研究者的移频干扰实现资源聚焦固定频率灵巧噪声仪的建模与频率偏移实验可用于电子对抗教学、设备抗干扰性能验证等场景。压缩包内仅三个文件大小约1KB包含核心MATLAB脚本、TXT说明文档及HTML参考文件其中脚本覆盖信号生成、频率偏移、干扰叠加与频谱分析等关键步骤结构轻量、步骤清晰便于快速理解移频干扰原理。已有二百三十五人学习适合作为干扰对抗、系统鲁棒性测试等课题的入门样例。通过阅读核心脚本可掌握固定频率正弦波生成、频率调制或直接频率合成等移频实现思路并能按需调整偏移量观察干扰效果配套文本与网页补充了项目背景和理论细节有助于延伸学习信号处理工具箱的应用。1. 固定频率移频干扰为什么灵巧噪声里最“省料”的一种能骗过雷达做雷达对抗的人都知道灵巧噪声干扰比纯噪声压制更费心思它要在截获的雷达信号上叠加噪声调制还要控制转发时延和频率才能既欺骗测距又干扰检测。而固定频率移频干扰是这里面最“省料”的一种——它不逐脉冲调整调制方式只把截获信号整体搬移一个固定频偏再转发。就这么一个动作线性调频雷达的脉冲压缩峰值就会在距离维上整体偏移甚至在被保护目标附近制造出多个假目标。这篇笔记从一个可运行的 Matlab 实现出发讲清楚固定频移的数学原理、代码搭建、参数边界和五个实操坑。适合正在做雷达干扰仿真、DRFM 算法验证或者电子对抗课程设计的工程师。2. 信号链与数学模型从 LFM 发射到移频转发参数先立住2.1 从雷达发射到干扰机截获参数怎么定固定频率移频干扰的仿真对象通常是一部线性调频LFM雷达。LFM 信号在复基带下的表达式是s(t) exp(jπKt²)0 ≤ t ≤ Tp其中 K B/Tp 是调频斜率B 是带宽Tp 是脉冲宽度。为什么用复基带而不是射频因为移频干扰本质上是频谱搬移在复基带下用一个复指数相乘就能实现频率搬移射频上则需要混频器而且仿真复杂度高。做算法验证时基带建模足够说明问题。参数选择直接影响后续干扰效果。我一般先用一组雷达教学里常见的参数脉宽 Tp10μs带宽 B10MHz那么调频斜率 K1×10¹² Hz/s。采样率 fs 这里取 100MHz是带宽的 10 倍不是常用的 2 倍。为什么刻意留这么多余量因为移频干扰会给信号额外增加一个频偏 fj如果采样率只有 2B那么移频后信号最高频率会立刻超过奈奎斯特频率产生混叠。这一点在第 4 章会专门讲这里先把余量留足。接收窗长度也要提前设计。我习惯设成 3 个脉宽以上比如 30μs这样既能容纳目标回波也能容纳干扰机转发信号。目标双程延时 τd 设为 5μs对应距离 750m干扰机双程延时 τj 设为 3μs对应距离 450m。注意这里的“双程延时”是从雷达发射到干扰机接收、再转发回雷达的总延时所以距离 τ·c/2。下表是把初始参数固定下来后面代码里的变量都和这张表对应参数符号数值说明采样率fs100 MHz满足移频后奈奎斯特余量脉冲宽度Tp10 μs雷达发射信号脉宽带宽B10 MHzLFM 扫频范围调频斜率K1e12 Hz/sB/Tp目标双程延时τd5 μs目标距离 750m干扰机双程延时τj3 μs干扰机距离 450m固定频移fj1 MHz初始值可扫参干扰机截获雷达信号后标准流程是DRFM 采样存储然后做固定频移再叠加噪声最后延迟转发。本文实现的重点在“固定频移”这一步其余部分做理想化处理转发延时直接用 τj 控制存储和重建的幅度失真暂时忽略。2.2 固定移频的实现时域乘复指数与频域搬移的区别固定频移最直接的做法是时域乘法。设干扰机在本地时间 t_r 转发信号转发的是它截获到的雷达脉冲在 t_r - τj 时刻的值乘上一个复指数j(t_r) s(t_r - τj) · exp(j2πfj(t_r - τj))这里指数中的时间是 (t_r - τj) 而不是 t_r这是相位连续性的关键。如果直接用 exp(j2πfj·t_r)相当于每次转发时复指数的初相位都重新从 0 开始在脉冲之间存在相位跳变干扰频谱会像梳子一样出现杂散线影响干扰效果。频域搬移是另一种思路把截获信号做 FFT把整个频谱平移 fj再做 IFFT。这种做法在理论上和时域乘复指数等价但在离散有限长序列里会引入循环移位效应信号边缘的数据会绕到另一端产生时间上的拖尾。除非 FFT 点数取得非常大且配合窗函数否则时域乘复指数更干净。DRFM 干扰机在工程上通常也是用 DDS 或 NCO 产生复指数和截获信号相乘所以代码里我采用时域方法。固定频移对脉冲压缩的影响可以推导得很干净。雷达匹配滤波器的冲激响应是 h(t) s*(Tp - t)干扰信号经过匹配滤波后输出峰值时刻相对于干扰机延时 τj 的偏移量约为τ_shift -fj/K换算成距离偏移ΔR -c·fj/(2K)注意负号当 fj 为正时假目标距离比干扰机位置更近fj 为负时假目标更远。这也是为什么固定频移能“骗”距离——雷达认为峰值出现的时刻对应回波延时而频率搬移直接把这个时刻改变了。这里的线性关系就是后面做扫参验证的理论依据。2.3 灵巧噪声的叠加信噪比与干扰带宽控制固定频移本身产生的是单个假目标还称不上“灵巧噪声”。灵巧噪声的关键是在转发信号上叠加噪声调制让假目标在距离维上展宽既有欺骗性又有压制性。最简单的叠加方式是加性高斯白噪声但控制好干噪比JNR很重要。JNR 定义是干扰信号功率与接收机噪声功率之比。我常用的初始值是 20dB噪声功率比干扰信号功率低两个数量级这样脉冲压缩后假目标还能压住噪底不至于被埋掉。JNR 如果开到 40dB接收信号噪底抬得很高真实目标和假目标都超过不了检测门限雷达直接处于“饱和”状态这其实偏离了“欺骗”目的。反过来说 JNR 太低比如 5dB假目标混在噪声里CFAR 检测可能根本发现不了。经验上 15~25dB 是一个能同时看到真假目标的窗口。关于噪声带宽真正的灵巧噪声要求噪声频谱覆盖雷达信号带宽 B。在仿真里直接用高斯白噪声叠加噪声带宽天然就是接收机带宽是理想情况。如果要做更接近实物的仿真可以用一个带通滤波器把噪声限制在 B 到 1.2B 内避免噪声带外部分被雷达窄带滤波滤掉。但初版验证阶段我一般先用白噪声这样省去滤波器的群延时影响更便于检查移频逻辑是否正确。3. Matlab 实现主程序、干扰函数与脉冲压缩输出3.1 主程序结构与初始化参数我把完整脚本拆成主程序和独立干扰函数。主程序负责参数设置、生成发射信号、构造回波和干扰、做脉冲压缩最后输出峰值距离。先看初始化部分% main.m clear; clc; close all; rng(2024); % 固定随机种子保证结果可复现 % 雷达信号参数 fs 100e6; % 采样率 100MHz Tp 10e-6; % 脉宽 10us B 10e6; % 带宽 10MHz K B / Tp; % 调频斜率 1e12 Hz/s N round(Tp * fs); % 发射信号采样点数 t (0:N-1) / fs; % 发射信号时间轴 % 发射信号复基带 LFM幅度归一化 s_tx exp(1j * pi * K * t.^2);这里rng(2024)是让每次跑出来的噪声序列一致否则扫参时两次结果之间会夹杂随机波动。雷达信号参数全部用国际单位制避免后面算时间、距离时出错。s_tx是 1×N 的复向量代表一个完整的 LFM 脉冲。接下来构造接收窗和目标回波。接收窗长度是 3 个脉宽也就是 30μs% 接收窗长度3倍脉宽留足回波和干扰 rec_len round(3 * Tp * fs); t_r (0:rec_len-1) / fs; % 接收窗时间轴 % 目标回波双程延时 5us对应 750m td 5e-6; nd round(td * fs); s_rx zeros(1, rec_len); s_rx(nd1 : ndN) s_tx; % 把发射信号“按时”放到回波窗里注意s_rx里发射信号从 nd1 开始放满 N 个点超出接收窗的部分截断。因为 ndN 5001000 1500小于 rec_len3000所以没有越界。这个写法简单但没有模拟回波幅度衰减真实场景里回波功率和距离四次方成反比不过干扰仿真里更关心脉冲压缩后的位置幅度可以用归一化处理。3.2 核心函数固定频移干扰生成干扰生成我封装成一个函数用循环读取发射信号的对应采样点再乘复指数。这样逻辑最直观function J fixed_freq_jammer(s_tx, fs, tau_j, fj, Tp, rec_len) % 固定频率移频干扰信号生成 % s_tx: 截获的发射LFM信号复基带 % fs: 采样率 % tau_j: 干扰机双程时延 % fj: 固定频移量 % Tp: 脉宽 % rec_len: 接收窗长度 % % 返回 J: 移频干扰信号复合时间轴 J zeros(1, rec_len); t_r (0:rec_len-1) / fs; N length(s_tx); for k 1:rec_len tt t_r(k) - tau_j; % 转发信号对应的发射时刻 if tt 0 tt Tp idx round(tt * fs) 1; % 对应 s_tx 的下标 if idx N % 核心截获信号 × 复指数实现频率搬移 J(k) s_tx(idx) * exp(1j * 2 * pi * fj * (t_r(k) - tau_j)); end end end end这个函数的逻辑是接收窗内任意一个时刻 t_r干扰机转发的是发射信号在 t_r - tau_j 时刻的状态。先判断这个“发射时刻”是否落在有效脉宽内若是则取出 s_tx 的对应采样值再乘复指数 exp(j2πfj·(t_r - tau_j))。复指数里的 (t_r - tau_j) 就是干扰信号的“本地时间”。为什么要减掉 tau_j因为干扰机的时钟是从它收到信号那一刻开始走的它输出的正弦波相位也应该从转发起点开始累积。如果忘了减等于每个采样点都强行引入一个固定相位偏移不同频率拍频叠加后会出现随机相位噪声谱。在调用方注意这里设置干扰机延时为 3μs频移 1MHz% 干扰机参数 tau_j 3e-6; % 干扰机双程时延 3us对应450m fj 1e6; % 固定频移 1MHz % 生成移频干扰信号 J fixed_freq_jammer(s_tx, fs, tau_j, fj, Tp, rec_len); % 叠加高斯白噪声干噪比 20dB JNR_dB 20; Pj mean(abs(J).^2); % 干扰平均功率 Pn Pj / (10^(JNR_dB/10)); % 噪声功率 noise sqrt(Pn/2) * (randn(1, rec_len) 1j*randn(1, rec_len)); % 接收机总信号 目标回波 干扰 噪声 s_rec s_rx J noise;干噪比 20dB 时噪声幅度只有干扰幅度的十分之一。sqrt(Pn/2)是因为复噪声的实部和虚部各占一半功率乘以randn后叠加出来的噪声功率才是 Pn。3.3 脉冲压缩与峰值检测脉冲压缩用匹配滤波实现。匹配滤波器的系数就是发射信号的时间翻转共轭% 匹配滤波器系数 h conj(fliplr(s_tx)); % 脉冲压缩 y_clean abs(conv(s_rx, h)); % 纯目标回波无干扰 y_jam abs(conv(s_rec, h)); % 含干扰和噪声 % 卷积结果长度是 rec_lenN-1截取前 rec_len 与接收窗对齐 y_clean y_clean(1:rec_len); y_jam y_jam(1:rec_len); % 归一化 y_clean y_clean / max(y_clean); y_jam y_jam / max(y_jam);为什么取前 rec_len 而不是完整卷积因为卷积输出包含脉冲压缩后超过接收窗末端的拖尾可能使峰值定位偏移。只取接收窗内的部分回波和干扰的位置才是真实的时延位置。峰值检测我不用max而是找局部最大值并排序这样可以同时看到真假目标% 找出所有局部峰值并按幅度排序 ispeak islocalmax(y_jam, MinProminence, 0.1); peak_idx find(ispeak); [~, sort_idx] sort(y_jam(peak_idx), descend); top2 peak_idx(sort_idx(1:min(2,length(sort_idx)))); top2 sort(top2); % 按距离从小到大排列 fprintf(检测到的峰值距离\n); for k 1:length(top2) d (top2(k)-1) / fs * 3e8 / 2; fprintf(峰值%d: %.1f m (幅度 %.3f)\n, k, d, y_jam(top2(k))); end这里islocalmax需要 R2017b 以上版本MinProminence是峰值的显著度阈值用来滤掉小毛刺。距离换算用双程时延公式注意索引减 1 是因为 t_r(0) 对应 0 时刻。理论上干扰机在 3μs即 450m移频 1MHz 后距离偏移 ΔR -c·fj/(2K) -3e8×1e6/(2e12) -150m所以假目标应该出现在 450-150300m。真目标在 750m。最终输出应当能看到 300m 和 750m 两个峰值。如果幅度归一化后第二个峰值小于 0.1MinProminence可能漏检可以适当降低到 0.05。4. 参数调优与常见问题排查五个必踩的坑及解决4.1 频移量超出距离窗导致假目标“消失”现象把 fj 改成 5MHz 后脉冲压缩输出只剩下真目标峰找不到假目标。原因根据距离偏移公式 ΔR -c·fj/(2K)5MHz 对应距离偏移 -750m。干扰机在 450m那么假目标应该在 -300m也就是“负距离”位置已经超出了接收窗覆盖范围。在接收窗里这个峰落在 t_r 为负的区域当然看不到。另一个可能是偏移后的位置在接收窗之外被截断。解决先算一遍理论偏移范围确保符合作图窗口。接收窗长度是 30μs 对应 4500m 范围干扰机在 450m允许的偏移量应满足 -450m ΔR 4050m所以 |fj| 2K·450/c 2×1e12×450/3e8 3MHz。超过 3MHz 就要把接收窗加长或者把 tau_j 加大。我一般保留 20% 余量最大扫频不超过 ±2.4MHz。4.2 复指数初相位不一致导致跨脉冲出现乱码现象多脉冲仿真比如做距离-多普勒图时干扰脉冲之间出现随机相位跳变频谱上有杂散线脉冲压缩后假目标分裂成多个毛刺。原因复指数exp(j2πfj·t_r)的初相位每一帧重新从 0 开始。由于接收窗起点并不一定和脉冲重复周期对齐不同帧在同一 t_r 处的相位不连续等于对干扰信号做了相位调制产生大量边带。解决正确写法是使用转发时刻的本地时间t_r - tau_j作为指数参数。函数里已经这么做了。如果你从别处借鉴代码看到指数里只写了 t_r 而没有减 tau_j基本可以判断会有这个问题。检查方法是连续跑两个脉冲把干扰信号叠加起来看频谱如果存在频率间隔等于 PRF 的边带就要检查相位连续性。4.3 采样率不足导致移频后频谱混叠现象fs20MHz、B10MHz、fj5MHz 时脉冲压缩结果里出现多个虚假峰峰值位置完全没有规律。原因LFM 信号本身占 0~10MHz移频 5MHz 后最高频率到 15MHz超过 fs/210MHz 的奈奎斯特频率高频成分折叠到低频形成混叠。混叠后干扰信号的频谱不再是干净的搬移而是和自身重叠相当于产生了多个不同频移的干扰分量。解决确保 fs/2 ≥ B |fj|。以 B10MHz、fj5MHz 为例fs 至少 30MHz但工程上建议留 1.5 倍余量取 50MHz。如果采样率受硬件限制不能提高就用带通采样把信号频带选在某个中频上再在数字域做正交混频。仿真中最省事的办法就是提高 fs改成 100MHz 后这个问题自动消失。4.4 噪声功率过大淹没真实目标现象JNR 设成 40dB结果脉冲压缩后噪底抬高真实目标峰值淹没在噪声里islocalmax找不到 750m 的峰。原因干扰功率比噪声功率高 40dB而噪声是直接叠加在接收信号上的等于是用高强度噪声把信号砸糊涂了。虽然干扰机目的是压制雷达但完全淹没后雷达会切换模式或提高门限反而察觉有源干扰达不到“欺骗”效果。解决灵巧噪声制胜点在于真假并存JNR 控制在 15~25dB。如果为了压制可以用噪声调相而不是加性白噪声噪声不改变信号幅度只调制相位这样干扰功率可以做得很大但不完全抬高噪底。加性白噪声模型适合验证信号链真正工程化要换调相器模型。4.5 未加窗导致脉冲压缩副瓣抬高现象不加窗时干扰峰附近出现一串间距均匀的旁瓣幅度达到主瓣的 -13dB 左右导致islocalmax检测出多个假目标。原因LFM 脉冲压缩的固有旁瓣约 -13dB这是矩形脉冲频谱的 sinc 旁瓣结构。固定移频干扰产生一个强假目标它的旁瓣完全可能超过检测门限雷达会把一个目标报成一串目标。解决在匹配滤波器上加窗比如汉宁窗、海明窗或泰勒窗。加窗后主瓣展宽约 1.5 倍距离分辨率稍微下降但旁瓣能压到 -30dB 以下。仿真中修改 h 的生成win hanning(N).; h win .* conj(fliplr(s_tx)); % 加汉宁窗后匹配滤波注意加窗会降低主瓣幅度输出归一化不受影响。工程上雷达一般自己做窗干扰机为了增加欺骗性也可以故意让假目标附近产生一些真实感的旁瓣这是另一个话题。5. 验证与进阶把单频移参数扫成曲线再扩展多假目标5.1 用理论曲线验证固定频移与距离偏移的关系单频点仿真跑通后最重要的验证是确认距离偏移量和频移量成线性关系且斜率等于理论值。我习惯扫一组 fj对每个 fj 只对干扰信号做脉冲压缩记录峰值偏移再和理论公式对比。代码如下fj_list linspace(-2e6, 2e6, 9); % 9个频移点从-2MHz到2MHz offset zeros(size(fj_list)); for m 1:length(fj_list) J fixed_freq_jammer(s_tx, fs, tau_j, fj_list(m), Tp, rec_len); yj abs(conv(J, h)); yj yj(1:rec_len); % 只搜索干扰机位置附近 ±2us 的窗口避免被窗边界影响 win_range round(tau_j*fs - 2e-6*fs : tau_j*fs 2e-6*fs); win_range win_range(win_range 0 win_range rec_len); [~, max_idx] max(yj(win_range)); peak_abs win_range(max_idx); offset(m) (peak_abs - tau_j*fs) / fs * 3e8/2; end theoretical -3e8/2 * fj_list / K; % ΔR -c·fj/(2K) figure; plot(fj_list/1e6, offset/1e3, o, LineWidth, 1.5); hold on; plot(fj_list/1e6, theoretical/1e3, -, LineWidth, 1.2); xlabel(固定频移 fj (MHz)); ylabel(距离偏移 ΔR (km)); legend(仿真结果, 理论公式); grid on;这里搜索窗口设为干扰机位置附近 ±2μs是因为频移较大时假目标可能跑到离干扰机很远的位置但为了单独测量仿真偏移用窗口限制范围可以避免捕获到其他杂散峰。如果每个 fj 都只在窗口内找最大峰那么理论偏移在 ±2μs 内对应的 fj 范围是 2e6 Hz这里最大 2MHz 正好在范围内。跑出来仿真点和理论线应当基本重合误差不超过一两个采样周期。如果偏差超过 2 个采样点在 fs100MHz 时对应 30m就要回查复指数相位写法或匹配滤波器方向。这个验证做完固定频移干扰的传递函数就立住了。5.2 从固定频移扩展到多假目标多假目标在代码上只需叠加多个不同频移或不同延时的干扰信号。比如保护一个目标可以在目标附近制造两前一后三个假目标fj_set [-1.5e6, -0.5e6, 1.5e6]; % 三个频移产生不同偏移 J_multi zeros(1, rec_len); for m 1:length(fj_set) J_multi J_multi fixed_freq_jammer(s_tx, fs, tau_j, fj_set(m), Tp, rec_len); end % 叠加到总信号里注意总功率比单个干扰放大了 10*log10(3) ≈ 4.8dB JNR_dB_multi 20; Pj_multi mean(abs(J_multi).^2); Pn_multi Pj_multi / (10^(JNR_dB_multi/10)); s_rec_multi s_rx J_multi sqrt(Pn_multi/2) * (randn(1, rec_len) 1j*randn(1, rec_len));多个干扰叠加时总功率按平方和增长。如果你希望干噪比保持不变需要重新算 Pn而不是沿用单干扰的噪声功率。多假目标会让雷达 CFAR 检测时产生多个过门限单元干扰机端的代价是发射总功率上升。这种多频移叠加的方式比单纯做大单频移更接近真实灵巧噪声因为假目标之间的距离是可设计的。5.3 一个工程习惯每次改参数先跑混叠检查到现在为止这个流程已经覆盖了固定频率移频干扰的核心。但我最后想分享一个踩过多次的教训每次改参数尤其是改 fs、B、fj 三者的关系我都会强制自己先跑一遍下面这个检查if B/2 abs(fj) fs/2 warning(移频后最高频率 %.1f MHz 超过奈奎斯特频率 %.1f MHz, ... (B/2abs(fj))/1e6, fs/2/1e6); end这个检查放在主程序参数区之后跑任务之前。从那以后我每次改完频移参数都强制先跑一遍混叠检查确保 fs 和距离窗匹配再谈后面的干扰效果。别小看这半行判断第 4 章里那种假目标乱飞的翻车多半是这一步没堵住。希望帮到你。本文还有配套的精品资源点击获取