☰
GNSS接收机抗干扰算法仿真:脉冲与窄带干扰抑制Matlab实现
2026/10/4 9:32:06 网站建设 项目流程

导航接收机最怕的就是射频前端被强干扰"打蒙"。不管是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 ms(10 个伪码周期),既能看到明显的相关峰,又不至于让计算量失控。

生成干净信号后,我会加高斯白噪声把信噪比调整到大约 -20 dB(对应典型 GNSS 接收机的载噪比 45 dBHz 左右),这样后面叠加干扰后的恶化效果就会非常明显。

2.2 脉冲干扰与窄带干扰注入模型

脉冲干扰我采用的是周期矩形脉冲模型,它的数学表达式可以写成:干扰信号等于脉冲幅度 A 乘以前面所述的矩形窗函数。这里有个关键的参数换算问题:干信比 60 dB 对应的幅度 A 如何计算?

设信号功率为 Ps,干扰功率为 Pj,干信比 JSR = 10*log10(Pj/Ps) = 60 dB,则 Pj = Ps * 1000。因为脉冲只占信号时长的 1/100(10 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 值适当降低到 5~6 可以增强检测灵敏度。

这个规律背后的物理逻辑其实很简单: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 ms;K 值法因为多了 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 点 FFT,K = 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 值降为 5~6,或改用中位数门限
K 值法误陷正常频点频谱泄漏导致邻频误判加 Kaiser 窗后再做 FFT
干扰抑制后载噪比不如预期时域脉冲抑制和频域窄带抑制顺序颠倒统一采用先脉冲后窄带的级联顺序
FFT 点数增加后效果反而变差分块长度超过信号平稳区检查数据分块重叠率,保留 50% 重叠

6.4 参数调优的通用经验

这几次调试下来,我最大的体会是抗干扰算法验证拼的不是算法本身有多花哨,而是对参数边界位置的把控。同一个限幅门限,在这种干扰参数下是好的,换一种干扰强度就可能完全崩掉。所以仿真工程里一定要设计好参数字典,把所有关键参数集中管理,方便批量扫描。

我做仿真有一个习惯:在关键处理节点都留一个开关和两个断点变量。比如脉冲抑制模块,我可以一键切换限幅模式和置零模式;K 值法模块,我可以自由调整 FFT 点数、窗类型、K 值三个参数。这样在调优时能够快速定位性能损失出现在哪个环节,而不是盲目改代码。

另外强烈建议把所有中间结果都存成 mat 文件,方便离线对比。我通常把时域波形、频域谱、相关峰三条曲线存放在同一张图里,任何一次参数调整都能立刻看出频谱形状和相关峰的联动关系。这个工作习惯帮我省下了大量重复仿真时间。

7. 工程扩展建议与经验体会

这个仿真工程做完之后,我又做了几个方向的扩展,效果都不错。第一个是把单音窄带干扰替换成线性调频干扰,K 值法从单帧频域陷波改成了时频分析配合逐时刻陷波,虽然计算量翻了一倍,但抑制效果依然稳定。

第二个是引入了自适应门限机制,把脉冲置零的检测门限从固定倍数改成基于滑动窗口能量统计的递归更新。这样即使脉冲干扰的占空比或者幅度出现缓变,算法也能自动跟踪调整,不会因为参数固化而失效。

第三个是考虑了北斗 B1I 和 GPS L1 双系统联合处理。两套信号分别做抗干扰处理后再送入同一个解算引擎,由于北斗 B1I 码速率是 GPS 的两倍,同样的窄带干扰对北斗的影响会略小一些,最终联合解算的可用性显著高于单系统。

从工程落地的角度想多说一句:仿真验证可以完美主义,但工程实现一定要务实。仿真里可以反复调整门限追求极致性能,但在实时接收机上,算法的确定性和可预测性远比极限性能重要。

我个人的体会是,如果你正在做导航接收机抗干扰相关的工作,这套仿真工程可以作为很好的起点。先把脉冲限幅、脉冲置零、K 值法这三个基础算法跑通,把参数边界摸清楚,再逐步叠加更复杂的干扰场景和更先进的算法。这个过程中最重要的不是代码本身,而是你要能解释清楚每一个门限为什么这么设、每一个处理步骤为什么在这个位置。能解释清楚"为什么",仿真结果才有真正的工程价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询