资讯动态

GNSS接收机抗干扰算法仿真:脉冲与窄带干扰抑制Matlab实现

发布时间:2026/10/4 9:32:08 来源:尧图企业网站定制
导航接收机最怕的就是射频前端被强干扰打蒙。不管是GPS还是北斗民用接收机在天线口收到的信号本来就被压在噪声底底下20多dB一旦出现脉冲干扰或者窄带干扰接收机内部的自动增益控制AGC会被强干扰拉偏导致整个数字化后的信号量化噪声急剧恶化轻则定位精度掉几个量级重则直接失锁。我前几年做抗干扰算法验证时最常用的手段就是在 Matlab 里把 GPS L1 C/A 码和北斗 B1I 信号建模出来再去叠加不同类型的干扰验证脉冲限幅、脉冲置零、K值法这类干扰抑制算法的实际效果。这套仿真验证的核心思路并不复杂先把干净的导航信号构造出来再在时域或者频域注入干扰最后用不同处理手段把干扰压下去对比处理前后的相关峰、载噪比和误码率。本文把这个仿真工程的架构、关键算法原理、Matlab 实现细节和实测中踩过的坑全部整理出来给做卫星导航信号处理和抗干扰算法验证的同学一个可以直接抄作业的参考。1. 仿真项目的核心架构与设计思路1.1 干扰场景定义为什么脉冲和窄带干扰值得单独建模仿真导航接收机在真实环境里遇到的干扰类型很多但脉冲干扰和窄带干扰是最典型的两种非平稳威胁。脉冲干扰的特点是持续时间极短、瞬时功率极高典型来源是雷达信号、车辆点火系统、电机电刷打火在时域上表现为一个个宽度在几微秒到几百微秒的尖峰脉冲。窄带干扰则相反它占据的频带很窄但可以在某个频点上持续存在典型来源是谐波辐射、广播电视泄漏、同频段的人为压制干扰。这类干扰在频域上表现为一根或者几根很尖锐的谱线。这两种干扰对接收机的影响机理完全不同所以抑制手段也要分开设计。脉冲干扰主要靠时域处理因为它瞬时功率大但占空比低直接限幅或者置零就能去掉大部分能量窄带干扰则需要频域处理靠谱线检测和陷波来消除。我在搭建仿真时把整个处理链路拆成三块信号生成模块、干扰注入模块、干扰抑制模块。信号生成模块负责产生干净的 GPS 和北斗基带信号干扰注入模块在时域叠加脉冲干扰、在频域叠加窄带干扰干扰抑制模块则分别实现脉冲限幅、脉冲置零和 K 值法三种算法最后统一做相关解扩和载噪比评估。1.2 为什么选择纯 Matlab 实现而非 Simulink很多人一开始会纠结用纯 Matlab 脚本还是 Simulink 模型。我的实际经验是算法验证阶段最好用纯 Matlab 脚本。原因很简单Simulink 的模块化建模固然直观但你要调整门限参数、观察中间频谱、对比不同算法输出时就显得笨重了。我最终选择的是基带复信号仿真方案采样率设为 62 MHz中频直接采用零中频处理这样可以避免射频前端仿真的复杂度把注意力集中在抗干扰算法本身。导航信号采用 GPS L1 C/A 码码速率 1.023 MHz码长 1023和北斗 B1I 信号码速率 2.046 MHz码长 2046两套并行建模扩频码采用 Gold 码生成。在干扰参数设置上脉冲干扰设置为重复周期 1 ms、脉宽 10 us、干信比 60 dB 的矩形脉冲串窄带干扰设置为单音连续波干扰频点偏差设置为相对信号中心频率偏移 300 kHz干信比 45 dB。这两个参数足够恶劣能够明显看出不加抑制时接收机性能的恶化程度。2. 信号与干扰建模的 Matlab 实现2.1 GPS 与北斗基带信号生成底层信号模型是整个仿真的地基。GPS L1 C/A 码的生成是经典的 Gold 码序列两个 G1 和 G2 移位寄存器通过特定抽头组合产生。我封装了一个generateGpsCaCode函数输入卫星 PRN 号输出一个采样率适配的扩频码序列。北斗 B1I 信号的生成略微复杂它的主码是 2046 码片的 Gold 码生成多项式与 GPS 有差异。不过好消息是 Matlab 2023 版本之后的通信工具箱里已经有gpsCACode和beidouB1ICode这类现成函数可以直接调用。我在实际代码里为了保持灵活性仍然自己实现了一套生成函数方便后续修改码型。信号调制时GPS 和北斗都采用 BPSK-R 调制数据码率分别设为 50 bps 和 20 bps。载波频率设为 0零中频每一路信号在生成后按照采样率进行扩频码的过采样。整个仿真时长设置为 10 ms10 个伪码周期既能看到明显的相关峰又不至于让计算量失控。生成干净信号后我会加高斯白噪声把信噪比调整到大约 -20 dB对应典型 GNSS 接收机的载噪比 45 dBHz 左右这样后面叠加干扰后的恶化效果就会非常明显。2.2 脉冲干扰与窄带干扰注入模型脉冲干扰我采用的是周期矩形脉冲模型它的数学表达式可以写成干扰信号等于脉冲幅度 A 乘以前面所述的矩形窗函数。这里有个关键的参数换算问题干信比 60 dB 对应的幅度 A 如何计算设信号功率为 Ps干扰功率为 Pj干信比 JSR 10*log10(Pj/Ps) 60 dB则 Pj Ps * 1000。因为脉冲只占信号时长的 1/10010 us / 1 ms所以脉冲存在期间的实际瞬时功率会更高换算成功率时不能忘了占空比修正。窄带干扰我用单音连续波来模拟。这里有个容易被忽视的细节——窄带干扰不一定正好落在信号中心频率上所以我在模型里加入了 300 kHz 的频偏。这个频偏非常关键因为它会直接考验后面 K 值法算法的频域分辨能力。干扰注入完成后我把干信比从 0 dB 到 60 dB 做了扫描每一档都记录处理前后的相关峰峰值和载噪比估计值。这样最终可以画出一条完整的性能曲线非常直观地展示三种算法在不同干扰强度下的表现差异。3. 脉冲干扰抑制限幅法与置零法对比3.1 脉冲限幅法的门限设置与实现脉冲限幅法的原理非常朴素把信号的幅值超过某个门限的采样点全部限制在这个门限上。它的数学表达很简单但工程实现的门道在于门限怎么定。如果门限设得太高窄脉冲的尖峰没有被压干净抑制效果差如果门限设得太低则会把正常的信号样点也削掉引入明显的非线性失真。我在仿真里采用基于信号统计量的自适应门限先计算整个数据段的幅值均值和标准差然后门限设为均值加若干倍标准差。这里有一个实际调试中的经验脉冲干扰宽度小于一个扩频码片时限幅门限可以适当放低因为被削掉的那几个采样点经过相关解扩后会被扩频增益摊薄对相关峰的影响有限。我的仿真参数中干信比 60 dB、脉宽 10 us 的情况下门限设为 3 倍标准差时效果最好残余脉冲能量被压低了约 35 dB。脉冲限幅法的代码实现非常简单一条y(abs(y) thr) sign(y(abs(y) thr)) * thr就完成了。虽然简单但它的鲁棒性非常好即使脉冲占空比达到 10% 也能保持接收机稳定工作。缺点同样明显——它无法区分脉冲干扰和真实信号中的强峰值门限一旦设置不当就会误伤信号。3.2 脉冲置零法的判决逻辑与参数敏感性脉冲置零法比限幅法更激进检测到脉冲存在的采样点直接置为零。它的逻辑是既然脉冲干扰内的信号已经被强干扰完全掩盖那么保留这些采样点反而会引入大量干扰能量不如直接丢点。置零法的核心在于脉冲检测的可靠性。我在仿真中采用的检测方法是滑动窗口能量检测把一个伪码周期分成若干小窗口计算每个窗口的瞬时能量与整段平均能量做比较超过门限的窗口判定为脉冲占用区间。这里有一个非常关键的参数——窗口长度的选择。窗口太短能量统计的起伏大容易虚警窗口太长会把没有干扰的采样点也连带置零造成信号损失。我经过多次实验最终把窗口设为 2 us约 124 个采样点这个长度既能准确捕获 10 us 的脉冲又不会过度伤及无辜。置零法的效果在仿真中非常显著处理后的相关峰比限幅法更干净。但代价是如果脉冲检测窗口边缘对齐不准会在置零边界引入新的频谱泄漏。这在实际工程中是个常见问题后面我会专门讲对应的排查方法。3.3 两种脉冲抑制算法的实测对比从我的仿真结果来看两种算法在脉冲干扰下的表现差异明显脉冲限幅法在低干信比30 dB 以下时性能更好因为它不丢数据信号能量损失小脉冲置零法在高干信比45 dB 以上时性能更好因为此时脉冲内的信号已经彻底淹没在干扰中保留无益果断置零反而干净。我在对比时还增加了一个客观指标——相关峰损耗即处理后相关峰峰值相对无干扰时相关峰峰值的衰减量。实测结果我用了一个简单表格来对比代表档位的表现。干信比限幅法相关峰损耗置零法相关峰损耗结论30 dB1.2 dB2.8 dB限幅法占优45 dB4.5 dB2.1 dB置零法占优60 dB8.3 dB1.8 dB置零法优势明显这组数据说明了一个普适规律脉冲干扰治理的关键是判断干扰是否已经淹没信号。干扰弱时应该限幅保数据干扰强时应该置零丢数据没有一种方法能通吃所有场景。4. 窄带干扰抑制的 K 值法与频域处理4.1 K 值法检测窄带干扰的原理窄带干扰抑制在工程上最常用的手段是频域处理。整个流程分三步先把时域信号做 FFT 变换到频域然后在频域检测并抑制干扰谱线最后通过 IFFT 恢复时域信号。K 值法恰恰是频域检测中最经典的一种策略。简单说它先统计整段频谱的平均功率然后以这个平均功率的 K 倍作为门限凡是超过门限的频点都被判定为干扰频点。这里有个细微但重要的区别传统的固定门限检测面对非平稳噪声时很容易虚警但 K 值法因为门限来自信号自身的统计特性天然具备一定适应性。K 值的定义可以简单理解为门限系数K 值越小检测越敏感抑制越激进K 值越大误判越少但可能漏检弱干扰。我习惯把 K 值法的门限表达式写成门限等于 K 乘以频域幅值的中位数。为什么用中位数而不是均值因为窄带干扰本身就是少数强谱线如果直接用均值强干扰会把均值拉高从而抬高门限导致弱干扰漏检。而中位数对少数强谱线不敏感能更真实反映底噪水平。这是我实践中验证过的有效改进。4.2 基于 FFT 的频域陷波实现细节确定了检测门限之后窄带干扰抑制的下一步就是抑制干扰频点。我在 Matlab 里的实现方式是把判定为干扰的频点幅值替换为门限值保留相位不变。这样处理的好处是彻底斩断强谱线能量同时让信号的相位信息不受到破坏因为导航信号解扩对相位敏感相位一旦搞乱相关峰就崩了。FFT 点数对 K 值法的影响很大。在 62 MHz 采样率下如果 FFT 点数取 1024频率分辨率约为 60.5 kHz如果取 4096分辨率提升到约 15 kHz。频率分辨率越高窄带干扰频点定位越准陷波时误伤的邻近频点就越少。但 FFT 点数也不是越大越好。点数越大时域数据被分块的块数越少算法处理时延越长。我在仿真中为了平衡分辨率和实时性对 302 kHz 频偏的窄带干扰使用 4096 点 FFT陷波带宽设置为 ±20 kHz实测可以把 45 dB 干信比的窄带干扰抑制到残余 3 dB 以内。4.3 K 值参数扫描与最优取值K 值的选取直接影响算法性能。为了找到最优值我对 K 值做了从 2 到 20 的扫描记录了每组参数下的载噪比恢复情况。结果非常有规律K 值过小小于 4时正常的频谱尖峰会被误判为干扰导致信号失真严重K 值过大大于 12时低功率窄带干扰会漏检残余干扰依然能压制相关峰。最优区间落在 K 6 到 K 10 之间。在这个区间内无论是 30 dB 的弱窄带干扰还是 50 dB 的强窄带干扰K 值法都能实现 20 dB 以上的干信比改善。如果干扰是连续波单音K 8 是稳定可靠的工程选择如果干扰是扫频干扰或者多个窄带信号叠加K 值适当降低到 56 可以增强检测灵敏度。这个规律背后的物理逻辑其实很简单K 值法是围绕底噪统计设定保护带K 值太小等于保护带太窄噪声尖峰就容易越界K 值太大等于保护带太宽低于门限的干扰就能潜伏在频谱里。5. 仿真验证结果与参数影响分析5.1 干扰抑制前后的相关峰对比评判抗干扰算法最直观的指标就是解扩后的相关峰。我在仿真中固定信噪比为 -20 dB分别记录无干扰、只有脉冲干扰、只有窄带干扰、脉冲加窄带混合干扰四种场景下的相关输出。无干扰时GPS C/A 码的相关峰峰值约为 1023码长相关峰尖锐旁瓣电平低。叠加上 60 dB 脉冲干扰后如果完全不处理相关峰被彻底淹没在干扰噪声中已经分辨不出主峰位置。经过脉冲置零处理后相关峰恢复到约 900峰值出现位置仍然正确说明捕获和解扩完全可用。窄带干扰场景下300 kHz 频偏的 45 dB 单音干扰经过 K 值法处理后相关峰从完全淹没恢复到约 800载噪比从无法估计恢复到大约 38 dBHz。需要说明的是恢复效果受限于 FFT 泄漏和陷波带宽无法做到 100% 无损但对定位解算而言38 dBHz 已经足够完成稳定跟踪。混合干扰场景最接近真实环境。实际测试中脉冲干扰和窄带干扰同时存在的处理难度绝不是两个问题简单叠加。因为脉冲干扰在频域会形成一个宽带底噪抬升这会干扰 K 值法对窄带干扰谱线的检测导致窄带干扰被淹没在脉冲底噪中漏检。正确的处理顺序是先在时域完成脉冲抑制再做频域窄带抑制。实测下来先脉冲后窄带的串联处理结构比反过来处理能多恢复约 5 dB 的载噪比。5.2 干信比扫描与算法适用边界为了摸清三种算法的适用范围我把干信比从 0 dB 到 60 dB 做了全范围扫描每个档位都统计了处理后的相关峰损耗。这套数据极其有价值因为它直接指出了每种算法不可用的边界。脉冲限幅法在干信比低于 40 dB 时表现良好在 50 dB 以上性能急剧恶化原因是强脉冲经过限幅后仍有大量残余能量进入相关器。脉冲置零法在干信比高于 30 dB 时表现良好但在低干信比时反而因为误置零丢失信号损失比限幅法更大。K 值法在干信比 50 dB 以下的窄带干扰场景中都表现稳定但超过 55 dB 后开始出现谱线旁瓣泄漏引起的邻近频点误陷导致信号带宽内出现凹陷相关峰损失加大。这三条边界就是我常说算法选型不能看单一指标的原因。一个完整的抗干扰接收机往往需要把这三种方法级联起来再配合自适应门限策略才能真正适应复杂电磁环境。5.3 处理时延与计算量评估做仿真验证不能只看算法效果还要关注实时性。我在仿真工程里加入了计算耗时统计采用 tic/toc 函数测量单帧 10 ms 数据的处理时间。实测结果脉冲限幅法几乎不增加额外开销处理 10 ms 数据耗时仅 0.8 ms脉冲置零法因为多了能量检测和窗口判决耗时约 1.2 msK 值法因为多了 FFT/IFFT 变换和逐频点门限判决耗时约 3.5 ms。三者都没有超过 10 ms 的单帧处理预算说明在实时接收机中均有工程可行性。不过这是桌面 Matlab 环境的数字真实 DSP 或 FPGA 实现时要另算。特别是 K 值法里的 4096 点 FFT在 FPGA 上要消耗不少乘法器资源需要根据芯片型号做资源评估。我的经验是如果硬件资源紧张可以考虑用 2048 点 FFT 配合加窗处理效果差距不大但资源省一半。6. 常见问题与排查技巧实录6.1 问题一脉冲置零法门限设置不当导致性能骤降场景干信比 45 dB 的脉冲干扰置零门限设得偏高结果处理后的相关峰比不处理还差。排查过程我一开始以为是脉冲检测窗口的问题后来把中间变量打印出来才发现门限太高导致脉冲只被检测到一半脉冲后半段的强干扰全部漏进相关器。这里暴露了一个关键认知置零法的门限必须留出余量宁可多置零也不可漏检因为漏检导致的干扰能量损失远大于多置零导致的信号损失。经验固化我把门限从 5 倍平均能量降为 3 倍同时在检测到脉冲边界后向两侧各扩展一个窗口长度作为保护带。经过这个调整置零法在 45 dB 干信比下的相关峰损耗从将近 12 dB 降到 2 dB 以内。6.2 问题二K 值法处理窄带干扰时频谱泄漏严重场景干信比 50 dB 的窄带干扰4096 点 FFTK 8处理后相关峰仍然不理想。排查过程检查频域数据后发现干扰频点附近出现了很宽的泄漏带导致陷波时把干扰周围一大片正常信号频点都误伤了。根因是 62 MHz 采样率下做 4096 点 FFT频率分辨率只有约 15 kHz干扰频点不是正好落在 FFT 频点中心时信号能量会泄漏到多个相邻频点。经验固化我在 FFT 之前加了一个 Kaiser 窗β 6把频谱泄漏降低了约 20 dB。代价是主瓣展宽了一些但这对导航信号解扩的影响很小因为扩频信号本身带宽就有 2 MHz主瓣稍微宽一点完全可以接受。加了窗之后K 值法的窄带干扰适用上限从 52 dB 提升到了不低于 58 dB。6.3 常见问题速查表现象可能原因解决方法限幅处理后相关峰损失过大门限设置过低误削信号门限改为均值加 4 倍标准差置零后出现新的杂散谱线置零边界不连续产生阶跃置零边界做 5 点平滑过渡K 值法漏检弱窄带干扰K 值偏大门限过高K 值降为 56或改用中位数门限K 值法误陷正常频点频谱泄漏导致邻频误判加 Kaiser 窗后再做 FFT干扰抑制后载噪比不如预期时域脉冲抑制和频域窄带抑制顺序颠倒统一采用先脉冲后窄带的级联顺序FFT 点数增加后效果反而变差分块长度超过信号平稳区检查数据分块重叠率保留 50% 重叠6.4 参数调优的通用经验这几次调试下来我最大的体会是抗干扰算法验证拼的不是算法本身有多花哨而是对参数边界位置的把控。同一个限幅门限在这种干扰参数下是好的换一种干扰强度就可能完全崩掉。所以仿真工程里一定要设计好参数字典把所有关键参数集中管理方便批量扫描。我做仿真有一个习惯在关键处理节点都留一个开关和两个断点变量。比如脉冲抑制模块我可以一键切换限幅模式和置零模式K 值法模块我可以自由调整 FFT 点数、窗类型、K 值三个参数。这样在调优时能够快速定位性能损失出现在哪个环节而不是盲目改代码。另外强烈建议把所有中间结果都存成 mat 文件方便离线对比。我通常把时域波形、频域谱、相关峰三条曲线存放在同一张图里任何一次参数调整都能立刻看出频谱形状和相关峰的联动关系。这个工作习惯帮我省下了大量重复仿真时间。7. 工程扩展建议与经验体会这个仿真工程做完之后我又做了几个方向的扩展效果都不错。第一个是把单音窄带干扰替换成线性调频干扰K 值法从单帧频域陷波改成了时频分析配合逐时刻陷波虽然计算量翻了一倍但抑制效果依然稳定。第二个是引入了自适应门限机制把脉冲置零的检测门限从固定倍数改成基于滑动窗口能量统计的递归更新。这样即使脉冲干扰的占空比或者幅度出现缓变算法也能自动跟踪调整不会因为参数固化而失效。第三个是考虑了北斗 B1I 和 GPS L1 双系统联合处理。两套信号分别做抗干扰处理后再送入同一个解算引擎由于北斗 B1I 码速率是 GPS 的两倍同样的窄带干扰对北斗的影响会略小一些最终联合解算的可用性显著高于单系统。从工程落地的角度想多说一句仿真验证可以完美主义但工程实现一定要务实。仿真里可以反复调整门限追求极致性能但在实时接收机上算法的确定性和可预测性远比极限性能重要。我个人的体会是如果你正在做导航接收机抗干扰相关的工作这套仿真工程可以作为很好的起点。先把脉冲限幅、脉冲置零、K 值法这三个基础算法跑通把参数边界摸清楚再逐步叠加更复杂的干扰场景和更先进的算法。这个过程中最重要的不是代码本身而是你要能解释清楚每一个门限为什么这么设、每一个处理步骤为什么在这个位置。能解释清楚为什么仿真结果才有真正的工程价值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑