4、GNSS信号模拟器原理:射频信号生成、星座模拟、星历与历书、多径与干扰模拟
各位工程师朋友,大家好。今天我们来聊聊GNSS信号模拟器。这东西,说白了就是一台能“造假”的卫星信号发射机。你把它放在实验室里,它就能模拟出天上几十颗卫星发下来的信号。我当年第一次接触这东西时,心里也犯嘀咕:这玩意儿靠谱吗?后来亲手做过几次闭环测试,才发现——嗯,真香。
核心一句话:GNSS信号模拟器,就是把你导航算法要面对的真实射频环境,搬到实验室里来。它让你不用上天,就能把组合导航系统测个底朝天。
4.1 射频信号生成:从数字到空中的最后一公里
射频信号生成,是模拟器最硬核的部分。我习惯把它拆成三步来看:
- 基带生成:先算出卫星的伪随机码(PRN码)、导航电文,再调制成基带信号。这一步是纯数字的,FPGA或者DSP都能干。
- 上变频:把基带信号搬移到L1(1575.42 MHz)、L2(1227.60 MHz)这些射频频点上。这里要用到锁相环和混频器,相位噪声控制不好,信号质量就崩了。
- 功率控制:模拟器要能精确控制输出信号的功率,从-130 dBm到-160 dBm,甚至更低。我见过不少模拟器,标称能到-160 dBm,实际测下来底噪就-155 dBm了,信号直接被淹掉。
这里有个坑,我提醒一下各位:射频线缆的损耗。我曾经在项目里用了一根劣质SMA线,结果-150 dBm的信号到了接收机端,实测只有-158 dBm。整整差了8个dB!后来我学乖了,每次测试前先用频谱仪标定一下线损。
小技巧:如果你用模拟器做高灵敏度测试,建议在射频输出口加一个可调衰减器。这样你可以精确控制信号到达接收机天线口的功率,避免线缆损耗带来的误差。
4.2 星座模拟:让卫星“活”起来
星座模拟,就是模拟器要算出每一颗卫星在什么位置、什么速度、什么时间发信号。你想想看,GPS有31颗卫星,北斗有35颗,伽利略有24颗……模拟器得同时“扮演”这么多角色。
我个人习惯把星座模拟分成两个层面:
- 轨道层面:用开普勒轨道参数(半长轴、偏心率、倾角、升交点赤经、近地点角距、平近点角)算出卫星的实时位置。这一步是纯数学计算,精度取决于你用的轨道模型。简单的用两行轨道根数(TLE),高精度的用精密星历。
- 信号层面:根据卫星位置和用户位置,算出每颗卫星的伪距、多普勒频移、信号功率。注意,这里要考虑卫星钟差、相对论效应、地球自转效应。我当年做北斗模拟器时,就因为在相对论修正上少算了一个系数,结果伪距误差差了十几米。
嗯,这里要注意:星座模拟的更新率。如果你做的是静态测试,1秒更新一次就够了。但如果是高动态场景(比如飞机做急转弯),更新率至少要100 Hz以上。否则你模拟出来的多普勒频移是跳变的,接收机锁不住。
警告:不要以为星座模拟只是算算轨道就完事了。你还要考虑卫星的可见性——卫星在地平线以下时,信号是发不出来的。有些模拟器会忽略这个细节,导致你测试时发现“卫星”数量异常多,结果全是假的。
4.3 星历与历书:导航电文的“剧本”
星历和历书,是导航电文里最重要的两部分。我打个比方:
- 星历:相当于卫星的“精确行程表”。它告诉你未来2-4小时内,这颗卫星的精确位置和钟差。精度在米级。
- 历书:相当于卫星的“粗略年历”。它告诉你整个星座里所有卫星的大致轨道参数。精度在公里级,但能用半年。
模拟器在生成导航电文时,需要把星历和历书按照ICD(接口控制文件)规定的格式,打包成子帧、页面、帧。以GPS L1 C/A码为例:
// 一个简化的星历参数结构体(C语言风格)
typedef struct {
double toe; // 星历参考时间(秒)
double sqrt_a; // 半长轴的平方根(米^0.5)
double e; // 偏心率
double i0; // 轨道倾角(弧度)
double omega0; // 升交点赤经(弧度)
double w; // 近地点角距(弧度)
double m0; // 平近点角(弧度)
double delta_n; // 平均运动角速度修正(弧度/秒)
double idot; // 轨道倾角变化率(弧度/秒)
double omega_dot;// 升交点赤经变化率(弧度/秒)
double cuc, cus; // 纬度幅角修正系数
double crc, crs; // 轨道半径修正系数
double cic, cis; // 轨道倾角修正系数
double af0, af1, af2; // 卫星钟差系数
} gps_ephemeris_t;
我在项目中遇到过一个问题:模拟器生成的星历参数,和真实GPS卫星的星历参数,在格式上完全一致,但数值上差了几个比特。结果接收机解算出来的位置,总是偏几十米。后来查了半天,发现是模拟器在计算toe(星历参考时间)时,没有做周内秒的模运算。嗯,这种细节,ICD文档里写得清清楚楚,但就是容易忽略。
避坑指南:我曾经用模拟器做RTK(实时动态差分)测试,发现固定解一直出不来。排查到最后,发现是模拟器生成的星历中,IODC(星历数据龄期)和IODE(星历数据龄期)不一致。接收机在差分时发现这两个参数对不上,直接拒绝使用。所以,星历参数的内部一致性,比精度更重要。
4.4 多径与干扰模拟:给接收机“上难度”
多径和干扰,是真实环境中接收机最头疼的问题。模拟器如果能把这些场景复现出来,那你的组合导航系统才算真正经过了考验。
4.4.1 多径模拟
多径,就是信号从卫星发出来后,经过建筑物、地面、水面反射,再到达接收机。反射信号比直达信号晚到,而且功率更弱。模拟器要模拟多径,需要控制三个参数:
- 延迟:反射路径比直达路径多走的距离。典型值从几米到几百米。
- 衰减:反射信号的功率损失。一般比直达信号弱3-20 dB。
- 相位:反射信号和直达信号之间的相位差。这个很关键,因为同相叠加会增强信号,反相叠加会削弱信号。
我建议你在做多径测试时,重点关注短延迟多径(延迟小于1.5个码片)。为什么?因为这种多径,接收机的延迟锁定环(DLL)很难区分直达信号和反射信号,会导致伪距测量误差。我见过一个案例,接收机在室内环境下,因为短延迟多径,伪距误差达到了15米。
4.4.2 干扰模拟
干扰,就是其他射频信号“污染”了GNSS频段。常见的干扰类型有:
| 干扰类型 | 典型来源 | 模拟器实现方式 |
|---|---|---|
| 连续波干扰 | 谐波、杂散发射 | 在GNSS频点附近加一个单音信号 |
| 宽带噪声干扰 | 工业设备、电源噪声 | 在GNSS频段叠加高斯白噪声 |
| 脉冲干扰 | 雷达、通信设备 | 按一定占空比和周期发射脉冲信号 |
| 欺骗干扰 | 恶意攻击 | 生成虚假的GNSS信号,功率比真实信号高 |
这里我要特别说一下欺骗干扰。模拟器要模拟欺骗干扰,其实就是在正常信号的基础上,再叠加一路“假信号”。这路假信号的功率要略高于真信号(比如高3-6 dB),而且伪距和多普勒要设计得“合情合理”。我曾经测试过一款接收机,在欺骗干扰下,位置解算结果被慢慢拉偏了500米,而接收机自己完全没察觉。嗯,这就是欺骗干扰的可怕之处。
注意:做干扰测试时,一定要在屏蔽箱里进行。否则你的模拟器发出的干扰信号,可能会干扰到周围真实的GNSS设备。我见过有人直接在开放实验室里做干扰测试,结果整栋楼的GPS信号都受到了影响……
4.5 本章知识体系:一张图看懂
说了这么多,我画了一张图,把GNSS信号模拟器的核心逻辑串起来。你一看就明白了:
这张图把整个流程串起来了:从用户输入场景参数开始,经过星座模拟算出卫星状态,然后生成基带信号并上变频,最后叠加多径和干扰,输出射频信号。每一步都有坑,每一步都有细节。你如果能把这四个环节都吃透,那GNSS信号模拟器在你手里,就是一把趁手的兵器。
好了,关于GNSS信号模拟器的原理,我就讲到这里。下一章我们会聊到硬件在环仿真系统的搭建,到时候我会把模拟器和真实接收机怎么连、怎么同步、怎么采集数据,一一拆解给你看。
公众号:蓝海资料掘金营,微信deep3321