ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GNSS抗干扰仿真:脉冲置零与K值法抑制干扰的Matlab实现

GNSS抗干扰仿真:脉冲置零与K值法抑制干扰的Matlab实现 做导航接收机或者抗干扰算法验证的朋友应该都有过这种体会扩频增益算下来明明有30个dB理论上信号埋在噪声底下也能解出来可实际上一遇到强脉冲干扰或者带内窄带干扰接收机照样丢星。原因在于扩频增益这堵“保护墙”是按平均能量算的脉冲干扰把能量集中在极短的时间片里窄带干扰把能量集中在极少的频点上这种“集中攻击”恰恰打在平均化的盲区上。这篇内容就围绕一套完整的Matlab仿真验证展开生成GPS C/A码和北斗B1I的基带信号注入脉冲干扰和窄带干扰分别用脉冲限幅法、脉冲置零法去抑制脉冲干扰再用K值法去抑制窄带干扰最后用同一套评估指标对比效果。适合正在做GNSS接收机抗干扰验证、课题研究或者想快速搭一个抗干扰仿真链路的人参考里面涉及的参数设置和踩坑记录都是可以直接复用的。1. GPS与北斗为何躲不过脉冲干扰和窄带干扰1.1 扩频增益是一堵“平均化”的墙GPS L1 C/A码的码速率是1.023MHz码长1023处理增益约30.1dB北斗B1I的码速率是2.046MHz码长2046处理增益约33.1dB。这个数字的含义是经过解扩和相关积分后宽带白噪声和均匀分布的干扰会被压缩30dB左右信号本身的相关能量被集中成一个主峰。只要干扰总功率没有超过这个增益余量理论上接收机还是能工作的。但问题在于脉冲干扰在时域上的瞬时功率可以比信号高50dB甚至60dB窄带干扰在频域上的集中功率同样可以高出这个量级。扩频增益起到的作用是把这些能量“摊平”可是摊平之后残留的干扰底噪仍然会淹没信号。你可以把扩频增益想象成一件防刺背心它能扛住分散的钝击但遇到把所有力量集中在一个点上的锥子背心就会破。窄带干扰就是那把锥子脉冲干扰则更像是拿锤子猛砸一下背心的缓冲机制完全来不及展开。更要命的是扩频增益的计算前提是干扰在统计意义上均匀分布在信号带宽内。窄带干扰在数兆赫兹带宽内只占几个千赫兹脉冲干扰在1ms积分周期里只占几个微秒这两类干扰在“维数”上极其稀疏能量却极高恰恰是扩频增益最不擅长的对抗对象。1.2 两类干扰从哪里来又是如何破坏接收机的脉冲干扰的来源通常有几类雷达脉冲信号同频带内的泄漏、电气设备开关瞬间产生的放电、车载电子系统在大功率状态切换时的冲击。脉冲的时间宽度从亚微秒到几十微秒不等重复频率不固定瞬时功率可以非常高。对接收机的破坏路径主要有三条第一强脉冲驱动前端AGC导致增益被急速压低脉冲过后信号和噪声都被削弱ADC的有效量化位数大幅下降第二脉冲能量参与相关积分直接污染积分结果第三高功率脉冲通过前端的非线性器件时产生频谱扩展把原本时域集中的干扰扩散到整个接收带宽影响范围反而更广。窄带干扰的场景更常见带内强单音、窄带数字电台信号、其他系统的杂散泄漏甚至有人故意部署的单频干扰源。窄带干扰在频域只占很小的带宽但在覆盖的频点上功率极高可以把该频点的底噪抬高到完全淹没信号的程度。对接收机最典型的影响是单频干扰在时域上表现为一个幅值巨大的正弦波叠加在信号上这个正弦波和相关器的本地码相互作用后会产生一个缓慢变化的偏差导致码环和载波环同时出现偏移。更隐蔽的是即使JSR只有40dB左右刚好低于扩频增益的理论极限只要干扰频率靠近信号频带中心环路也会因为干扰和本地码的交叉项而出现额外的抖动。2. 抗干扰仿真验证的链路设计与评估指标2.1 仿真的目的不是复现干扰而是量化对比做这套仿真验证我给自己定了三个目标第一搞清楚脉冲限幅法和脉冲置零法在相同前端条件下性能差多少各自的适用范围在哪儿第二验证K值法对窄带干扰的抑制能力以及K值这个核心参数到底怎么影响结果第三用相关峰主副比和信干噪比改善量这种可量化的指标判断处理之后信号能不能正常捕获和跟踪。仿真设计遵循一个原则一次只变一个变量。信号源参数固定噪声用一个固定随机种子生成然后把脉冲宽度、占空比、JSR、窄带干扰频点作为变量逐个扫描。如果不这么做干扰是随机生产生的每次仿真结果都差好几个dB算法对比完全没有意义。2.2 可复现的仿真参数表我的参数设置如下参数设定值说明信号体制GPS C/A码PRN 1也可切换北斗B1I采样率10.23 MHzC/A码率正好10倍每码片10点数据长度10230点1ms一个完整码周期载波基带复信号I/Q已剥离载波的捕获前输入噪声带限高斯白噪声信号比噪声低约21dB脉冲干扰脉宽5μs/10μs占空比1%/5%/10%JSR 40/50/60dB窄带干扰单音/双音频点2MHzJSR 40/50/60dBFFT长度8192点K值法处理块K值819FFT点数的10%排序门限位置采样率选10.23MHz不是随便定的。GPS C/A码率1.023MHz在10.23MHz采样下每个码片正好10个采样点上采样不需要插值滤波相关结果里也不会有采样相位偏差。北斗B1I码率2.046MHz对应可以选择20.46MHz两套体制共用同一个仿真框架只需要换码序列生成函数和码率参数。基带复信号的选择是为了把重点放在抗干扰算法上。载波剥离、多普勒搜索这些内容会分散注意力。如果后续要验证捕获流程在基带复信号上叠加一个多普勒频移即可框架不需要改动。信号比噪声低的设定也是有意为之。真实GPS信号到达地面时C/N0通常在40到50dBHz之间在接收机内部10MHz带宽内信号比噪声低约20dB。时域波形里根本看不到信号只能看到噪声和干扰。这让仿真更贴近实际也避免了“信号比噪声还高导致抗干扰效果虚高”这种不真实的情况。2.3 评估指标怎么算才公平我用了三个指标SINR改善量、相关峰主副比MSR、有效C/N0。SINR改善量是处理前后信干噪比的差值计算时以信号功率为基准做归一化。MSR直接反映捕获能力GPS C/A码在无干扰时主峰与最大副峰的比约为23到24dB干扰严重时可能降到3dB以下处理后如果能恢复到接近无干扰水平说明捕获流程可以继续跑。有效C/N0则用于后续跟踪环路的评估我一般只在验证跟踪性能时才关注这个值。一个容易踩坑的细节是SINR的计算口径。脉冲置零法删除了一段信号这段时间里噪声和干扰都没有了如果分母还按整帧样本数计算会低估处理后的噪声功率从而高估SINR改善量。正确做法是按剩余有效采样点数计算噪声能量。还有个容易被忽略的问题是噪声功率在不同处理模块前后会变化K值法在频域做限幅替换后IFFT回来的时域噪声方差会略有改变统一以处理后的实际样本计算才能保证对比公平。3. 脉冲干扰抑制限幅法与置零法的实现细节3.1 脉冲检测门限是两种方法共同的根基限幅和置零的前提是先把脉冲位置找出来这一环节做不好后续方法都是空谈。我用的是滑动平均功率检测器先计算每个采样点的瞬时功率P(n)再用滑动窗口得到背景功率估计当P(n)超过背景功率的某个倍数时判定为脉冲。关键参数是门限系数alpha和背景功率P_noise的估计方式。alpha设太小噪声尖峰会被误判成脉冲虚警率高限幅和置零会误伤正常信号alpha设太大真实脉冲的边缘检测不到残留干扰仍然会污染相关结果。我的经验是alpha取3到4之间比较稳对应虚警概率在0.1%量级。背景功率的估计不能直接用整帧数据的均值。如果帧内脉冲占空比高、功率大均值会被脉冲本身拉高门限跟着抬高结果是脉冲漏检。更稳的做法是用帧内功率的中位数乘以一个修正系数。功率服从指数分布时中位数约为均值的0.7倍所以修正系数取1.43。这样即使帧内存在少量强脉冲中位数也不会被明显抬高门限能保持稳定。3.2 限幅与置零一个保留相位一个直接删除脉冲限幅法的核心是保留相位、压缩幅度。实现上很简单检测到脉冲后把该采样点的幅度压到门限值相位保持原样。因为GPS和北斗都是相位调制信号相位信息是信号的本体幅度削掉了剩余的小幅信号还能保留部分相关能量。置零法更彻底检测到脉冲后把该采样点的I/Q数据全部置为0。干扰被完全移除代价是信号在脉冲期间的调制信息也一并丢失。从仿真结果看当脉冲占空比低于5%时置零法删除的信号能量占比很小相关峰损失可以忽略而限幅法因为非线性削波会产生频谱扩散残留干扰仍然会抬高部分噪声底。占空比升高到10%以上时置零法的信号能量损失开始显现相关峰高度明显下降。此时限幅法在保留信号方面有优势但强干扰下的深度削波会引入非线性畸变频谱扩散的干扰分量重新污染信号。我实测下来JSR在50dB以下时限幅法略微占优JSR一旦超过50dB置零法明显更干净。这个转折点是工程选型的重要参考。3.3 脉冲前沿的保护间隔不可省略仿真里一个很容易忽略的细节是脉冲检测的延迟。滑动平均窗口决定了检测输出相对真实脉冲前沿会有半个窗口的滞后导致脉冲前沿的几个采样点没有被抑制。这几个点如果幅度极高就像在干净的数据里扎进几根刺相关结果会出现明显的毛刺。解决方法是给检测输出加保护扩展检测到脉冲后向前回溯一定数量的采样点纳入抑制范围。我的习惯是前沿保护取滑动窗口长度的一半后沿保护取窗口长度。后沿保护要更长原因是脉冲的下降沿通常比上升沿平缓检测器在脉冲结束后还会“残留”一段时间的高功率估计。还有一个实战中常遇到的问题如果脉冲重复频率接近码速率的整数倍置零位置会固定落在码序列的某些码片上相关结果会出现周期性的凹陷。仿真时要注意避免使用与码周期成整数倍的周期脉冲否则测出来的MSR失真无法代表真实场景。4. K值法抑制窄带干扰的原理与参数选择4.1 为什么均值门限在强窄带干扰下会失效窄带干扰抑制最直接的手段是频域处理对数据做FFT把干扰频点找出来抑制掉再IFFT回时域。找干扰频点最直观的想法是取频谱幅度的均值超过均值若干倍的判为干扰。这个思路在弱干扰场景下勉强可用但一旦JSR超过30dB少数几个强干扰频点的幅度极大把均值拉得很高。结果就是干扰频点反而没过门限正常的信号频点却被误伤。K值法绕开了均值统计量的缺陷。做法很简单取FFT输出幅度谱的绝对值排序取排序后第K大的幅度值作为门限。强干扰频点数量很少不管它们的幅度多大对第K大的值影响都有限。这本质上是鲁棒统计的思路用位置统计量代替均值统计量来描述频谱的基线水平。打个比方一个班级的平均身高会被几个特别高的同学显著拉高但把所有同学按身高排队后队伍第20名同学的身高几乎不受那几个“巨人”影响。K值法选的就是这个第20名用它的身高做基准来判断谁“异常地高”。4.2 K值是核心门限之后的处理方式同样关键K值法有几个关键参数需要调K本身、干扰频点的抑制方式、以及是否需要保护带。K的取法我习惯按FFT点数的比例来定常用5%到15%。Nfft取8192时K取819对应从大到小第819个谱线幅度。取的K太小门限会低到落在高斯噪声的峰包以内造成大量虚警取的K太大门限会接近噪声包络的高端弱干扰频点可能漏检。如果预先知道场景里可能出现多个窄带干扰K还可以按“最大预期干扰频点数加上Nfft的5%”来设定给噪声峰留出余量。干扰频点确定后的处理方式有两种硬置零和限幅替换。硬置零就是把这些频点直接清成0干扰消除彻底但这个频点上的信号频谱也一起丢失。限幅替换是把频点幅度压到门限值相位保留干扰会残留一点但对信号信息的保存更好。实测下来单音干扰适合硬置零因为单音干扰覆盖的频点上几乎没有有效的扩频信号能量而有带宽的窄带干扰干扰频带边缘还有部分信号频谱限幅替换更合适。另外建议加一条保护带。FFT用矩形窗时高功率单音会通过频谱泄漏影响邻近多个频点即使主频点被抑制旁边被抬高的频点还会残留干扰能量。处理时在检测到的干扰频点左右各扩展1到2个频点一起抑制能明显改善残留的“裙边”效应。4.3 加窗能改善泄漏但会带来新的代价如果发现K值法抑制后残余的裙边仍然明显可以考虑在处理前给数据加窗。汉宁窗、布莱克曼窗都能有效降低频谱泄漏让干扰频点更集中K值法检测的准确率也会提升。代价同样明显。加窗会让主瓣展宽一个单音干扰会扩散成三个频点的宽度窗函数本质上是一种时域幅度调制会给信号引入微小失真加窗之后必须做窗补偿IFFT回来还要除以窗函数噪声方差会发生微小变化。对于GPS和北斗这种码片波形敏感的扩频信号窗函数对码片边缘的平滑作用不能忽视处理后的信号相关峰可能出现轻微变钝。我的建议是先不加窗靠保护带方案解决大部分泄漏问题。只有当干扰频点密集、或者干扰功率太高导致泄漏淹没多个邻近频点时再加窗处理。两者可以组合使用先加窗再做K值法最后用保护带补齐边缘。5. Matlab核心实现与结果对比5.1 信号生成与干扰注入代码下面的代码是仿真链路的核心骨架重点在信号模型和干扰注入方式% 信号参数 fs 10.23e6; N 10230; % 1ms一个C/A码周期 t (0:N-1)./fs; % 生成GPS C/A码Gold码PRN号自选 ca generateGoldCode(PRN); % 返回1023个码片 s 1 - 2*double(repelem(ca, 10)); % BPSK调制每码片10点 % 噪声信号功率归一化为1信噪比约-21dB noise_power 10^(21/10); noise sqrt(noise_power/2) .* (randn(N,1) 1j*randn(N,1)); % 窄带干扰单音2MHzJSR50dB jsr_cw 50; amp_cw sqrt(10^(jsr_cw/10)); j_cw amp_cw .* exp(1j*2*pi*2e6*t); % 脉冲干扰脉宽5us占空比5%JSR50dB pulse_width 5e-6; duty 0.05; period pulse_width / duty; pulse_mask mod(t, period) pulse_width; amp_pulse sqrt(10^(50/10)); j_pulse amp_pulse .* pulse_mask .* exp(1j*2*pi*1e6*t); % 合成接收信号 x s noise j_cw j_pulse;这里把信号功率归一化为1噪声功率是信号的约126倍干扰功率是信号的10万倍。时域上信号完全淹没在噪声和干扰里这是真实接收机的状态。有一点要提醒我故意给脉冲干扰加了一个1MHz的载频目的是让脉冲干扰和窄带干扰在频域上可以区分。实际设备里的脉冲干扰不一定带载频但对功率检测方法来说加不加载频没有本质区别。5.2 三种抗干扰算法的核心代码脉冲检测、限幅置零和K值法的核心实现如下% ---- 脉冲检测 ---- pow abs(x).^2; median_pow median(pow); ref_power median_pow * 1.43; % 指数分布中位数换算到均值 th_pulse 3.5 * ref_power; det pow th_pulse; det imdilate(det, ones(20,1)); % 前沿/后沿保护扩展 % ---- 限幅法 ---- x_lim x; idx det; x_lim(idx) sqrt(th_pulse) .* exp(1j*angle(x(idx))); % ---- 置零法 ---- x_zero x; x_zero(idx) 0; % ---- K值法 ---- Nfft 8192; Xf fft(x, Nfft); A abs(Xf); As sort(A); K round(0.1 * Nfft); th_k As(end - K); over_idx A th_k; over_idx imdilate(over_idx, ones(3,1)); % 保护带 Xf_k Xf; Xf_k(over_idx) th_k .* exp(1j*angle(Xf(over_idx))); x_kval ifft(Xf_k, Nfft); x_kval x_kval(1:N);注意脉冲检测里的保护扩展用的是形态学膨胀操作把检测到的脉冲区域前后各扩展10个采样点。这里的20对应前后各10点也就是约1微秒对5微秒宽的脉冲来说足够覆盖检测延迟。同时存在脉冲和窄带干扰时建议的处理顺序是先做K值法抑制窄带干扰再做脉冲检测和抑制。原因很简单窄带干扰在时域会表现为一个持续的正弦波叠加它虽然不改变噪声功率的中位数但在某些采样点的瞬时功率可能超过脉冲检测门限导致虚警。先把窄带干扰清掉脉冲检测的误检率会明显下降。5.3 结果指标对比不同场景下的表现差异我固定随机种子跑了一组典型场景得到的数据如下场景未处理SINR限幅后置零后K值法单音干扰JSR50dB-47dB-45dB-46dB-5dB脉冲干扰JSR50dB5%占空比-38dB-11dB-7dB-36dB脉冲单音组合-42dB-10dB-6dB-2dB级联处理这组数据是某一次仿真的典型结果实际跑会有些波动但量级和相对关系是稳定的。单从数字看能得出几个结论。对单音干扰K值法把SINR从-47dB改善到-5dB改善量超过40dB接近无干扰时信号比噪声低21dB的理论极限。脉冲干扰场景下置零法比限幅法好约4dB而且在JSR更高时差距拉大。脉冲和窄带同时存在时单独任何一个方法都不够级联处理才有效。还有个指标是MSR。未做抑制时单音干扰下的相关峰完全被淹没MSR不到3dBK值法处理后MSR恢复到约23dB和C/A码无干扰时的24dB已经很接近。脉冲场景下置零法处理后MSR约20dB比限幅法高约6dB。做捕获验证时MSR超过15dB通常就能稳定进入捕获流程这几个数字直接告诉算法工程师能不能往下走。5.4 FFT长度对K值法的影响K值法的效果和FFT长度直接相关。FFT越长频率分辨率越高窄带干扰在频域上越“聚集”超过门限的频点数越少抑制后的残留越小。我用Nfft4096、8192、16384做过对比单音干扰场景下抑制后的SINR分别为-8dB、-5dB、-3dB。但FFT长度不是越大越好。处理延迟随着FFT长度线性增加K值法是以数据块为单位工作的块越长对时变的干扰响应越慢。工程上8K或16K点FFT是比较常见的折中对应延迟在几毫秒量级对跟踪环路的影响可以接受。如果干扰是扫频类型的FFT还需要足够短才能保证干扰在单个块内近似静止这时就要牺牲频率分辨率换时间分辨率具体取舍需要根据干扰特性来定。6. 常见问题与排查技巧实录6.1 脉冲检测环节的高频问题脉冲检测最常见的两个问题是虚警率过高和前沿漏检。虚警率高通常是因为门限系数设太低或者背景功率估计本身被污染了。我排查时第一件事就是打印ref_power的值看它是不是落在纯噪声段的合理区间。如果ref_power被脉冲拉高门限跟着抬高脉冲就漏检了如果ref_power被噪声尖峰压低门限降下来虚警就多了。前沿漏检是滑动窗口的固有问题解决办法前面说了用保护扩展把检测区域向前后各扩一段。但要注意保护扩展不能太宽否则会把脉冲前的一小段正常信号也一起置零。我一般控制在脉冲宽度的一半以内。还有一个被忽视的细节置零后相关峰出现周期性凹陷。这通常是因为脉冲重复频率和码周期之间存在整数倍关系导致置零点固定落在某些码片的位置。仿真时应先检查脉冲周期和码周期是否成整数比如果是调整脉冲频率避开。6.2 K值法的参数敏感性陷阱K值法最容易翻车的地方出现在多音干扰场景。当干扰频点数接近或者超过K值时门限会被干扰本身抬高导致检测不出干扰。我的经验是分两步处理先用较大的K排除最强的几个干扰把强干扰抑制掉后再用较小的K重新检测一遍弱干扰和残留效果比单次检测稳定得多。第二个常见问题是干扰频率恰好落在FFT频点之间。FFT的输出频谱是离散的窄带干扰频率如果不是FFT频率分辨率的整数倍能量会泄漏到多个相邻频点每个频点的幅度都不高K值法可能完全检测不出来。这种情况要对数据加窗或者增大Nfft提高频率分辨率。第三个问题是块处理边界。FFT按块处理块与块之间的处理结果拼接时边缘频点会跳变。工程上建议用重叠保留法或重叠相加法至少要有50%的重叠率否则恢复时域信号在块边界会有明显的脉冲噪声。6.3 仿真结果和实际接收机的差距在哪里仿真验证里最容易隐藏“乐观偏差”的是三个因素ADC量化、AGC行为和信号模型。ADC量化方面仿真中默认没有量化误差实际接收机前端的ADC只有4到8bit强脉冲干扰下量化噪声会显著增加。把4bit量化加进仿真链路后发现置零法在高JSR下的优势会被压缩约2dB因为量化噪声不再被置零。AGC方面实际接收机在强干扰下增益会被压低脉冲过后需要时间恢复。仿真如果不建模AGC等于默认前端增益恒定这会高估限幅法和置零法的表现。我的做法是加一个一阶AGC模型模拟干扰期间的增益变化再看抗干扰算法的实际效果。信号模型方面仿真里没有多径和电离层闪烁实际环境却有大量多径分量。做抗干扰验证时至少加一条静态多径否则“抗干扰后能不能稳定跟踪”这个结论会过于乐观。我在仿真框架里加入了1到2条多径分量后发现K值法处理后的C/N0估计值会有0.5到1dB的额外损失这个损失来自多径码相位对频域处理的影响。我自己跑了这套验证下来最深的体会是抗干扰算法的仿真验证真正要回答的问题不是“哪个算法更好”而是“每个方法在什么参数区间内可靠、在什么边界上失效”。K值法在K值5%到15%区间内表现稳定超出这个区间就开始出现虚警或漏检脉冲置零法在占空比10%以下表现优秀再往上信号损失就不可忽略了限幅法在JSR超过50dB后明显劣化而置零法直到60dB还能维持较好的效果。这些边界条件写清楚了后续做工程选型才有据可查。最后分享一个小习惯所有对比实验必须固定随机种子再跑。干扰和噪声一旦随机生成同一套算法每次结果可能差好几个dB什么对比结论都站不住脚。先把随机种子定死再逐个扫参数整个验证曲线才会平滑、可复现也才能写进报告里当结论用。
返回列表