博客七:GPS P码仿真与实现——从C/A码到精密测距码
本文说明:本系列博客基于作者发表于IEEE的学术论文——Z. Shang, “GPS C/A code simulation analysis and GPS signal capture analysis based on MATLAB,” in 2023 IEEE International Conference on Integrated Circuits and Communication Systems (ICICACS), Xi’an, China, 2023, pp. 1-6. doi: 10.1109/ICICACS57324.2023.10248505。

当年论文中只重点讨论了c/a码
一、为什么需要P码?——从“粗捕获”到“精密测距”
在博客一中,我们详细讨论了C/A码(粗捕获码)的生成原理。C/A码作为民用GPS信号的核心,具有周期短(1ms)、结构简单、易于捕获等优点。但它也有明显的局限性:
| 码速率 | 1.023 MHz | 10.23 MHz(10倍) |
| 码周期 | 1 ms(1023 chips) | 约267天(超长周期) |
| 测距精度 | ~30米 | ~0.3米(10倍提升) |
| 用途 | 民用(粗捕获) | 军用/高精度(精密测距) |
| 加密 | 公开 | P(Y)码加密(仅授权用户可解) |
| 频谱 | L1仅 | L1 + L2双频 |
P码的“精密”体现在两个层面:
P码被调制在L1载波的同相(I)支路上,与C/A码(正交Q支路)形成正交复用。这种设计使得民用接收机只需处理C/A码即可获得定位服务,而军用/授权接收机则可同时利用P码实现更高精度。
二、P码的生成原理:四个移位寄存器的协同工作
2.1 与C/A码的本质区别
C/A码由两个10级移位寄存器(G1和G2)组合生成。P码的生成结构则复杂得多:
| 移位寄存器数量 | 2个(10级) | 4个(12级) |
| 反馈多项式 | G1: 1+x³+x¹⁰;G2: 1+x²+x³+x⁶+x⁸+x⁹+x¹⁰ | X1/X2各两组,更复杂 |
| 输出组合 | G1[10] ⊕ G2[tap1] ⊕ G2[tap2] | X1A ⊕ X1B 与 X2A ⊕ X2B 再组合 |
P码由两个12级的M序列发生器组合而成:
P(t)=PN1(t)⊕PN2(t)P(t) = PN1(t) \\oplus PN2(t)P(t)=PN1(t)⊕PN2(t)
其中PN1和PN2各自又由两个子序列组合而成,形成四寄存器结构。
2.2 四寄存器结构详解
P码生成器由四个12位移位寄存器组成:
┌─────────────────────────────────────────────────────────────────┐
│ P码生成器架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ X1A寄存器 │ │ X1B寄存器 │ │
│ │ (12级) │ │ (12级) │ │
│ │ 反馈: 14501 │ │ 反馈: 14501 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └───────┬───────────┘ │
│ ↓ │
│ PN1(t) = X1A ⊕ X1B │
│ ↓ │
│ ┌───────┴───────┐ │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ X2A寄存器 │ │ X2B寄存器 │ │
│ │ (12级) │ │ (12级) │ │
│ │ 反馈: 17147 │ │ 反馈: 17147 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └───────┬───────────┘ │
│ ↓ │
│ PN2(t) = X2A ⊕ X2B │
│ ↓ │
│ ┌───────┴───────┐ │
│ ↓ ↓ │
│ P(t) = PN1(t) ⊕ PN2(t + 延时) │
│ │
└─────────────────────────────────────────────────────────────────┘
关键参数:
| X1A | 12 | 14501 | 4092 chips(短周期) |
| X1B | 12 | 14501 | 4092 chips(短周期) |
| X2A | 12 | 17147 | 4092 chips(短周期) |
| X2B | 12 | 17147 | 4092 chips(短周期) |
为什么是4092 chips?
12级移位寄存器的完整周期本应为 212−1=40952^{12} – 1 = 4095212−1=4095。但X1A和X2A被设计为短周期(shortcycled)到4092 chips。这一设计使得PN1和PN2的周期为:
TPN1=4092×3750=15,345,000 chips≈1.5 秒T_{PN1} = 4092 \\times 3750 = 15,345,000 \\text{ chips} \\approx 1.5 \\text{ 秒}TPN1=4092×3750=15,345,000 chips≈1.5 秒
X1A和X2A各运行3750次短周期,覆盖1.5秒。PN1和PN2再组合,最终形成周期约267天的超长P码序列。
2.3 P码的相位分配
与C/A码类似,不同卫星的P码通过不同的时间延迟来区分。GPS ICD文档中定义了C/A码与P码的配对相位分配表。
| 64 | 729 | 0254 | 1523 | 27 | P27(t+24) | 5112 |
| 65 | 695 | 1602 | 0175 | 28 | P28(t+24) | 0667 |
| 66 | 780 | 1160 | 0617 | 29 | P29(t+24) | 2111 |
| … | … | … | … | … | … | … |
关键事实:C/A码与P码的相位分配是不可分割的配对——每颗卫星的C/A码相位和P码相位由ICD文档共同定义,不能独立选择。
2.4 为什么P码如此难以生成?
与C/A码相比,P码的生成面临几个核心挑战:
| 状态初始化复杂 | 需要根据GPS周数和周内时(TOW) 计算四个寄存器的初始状态 |
| 短周期截断 | X1A/X2A需要每4092 chips重置一次,而非自然溢出 |
| 超长序列 | 完整P码周期约267天,无法一次性生成全部序列 |
| 相位分配表庞大 | 需查表确定每颗卫星的精确延时参数 |
三、MATLAB仿真实现
3.1 设计思路
由于P码的完整周期极长(267天),仿真时通常采用按需生成策略:
3.2 核心数据结构
% P码相位分配表(部分,完整表见IS-GPS-200)
% 每行: [PRN, X2_Delay, P_Relative_Advance]
pCodePhaseTable = [
1, 5, 0; % PRN 1: X2延时5 chips
2, 6, 0; % PRN 2: X2延时6 chips
% … 完整表共32+ entries
];
3.3 12级移位寄存器核心函数
function [seq, state] = lfsr12(init_state, feedback, num_chips, reset_after)
% 12级线性反馈移位寄存器
% 输入: init_state – 12位初始状态 (1×12, 0/1)
% feedback – 反馈多项式(八进制表示)
% num_chips – 需要生成的码片数
% reset_after – 每多少chip重置一次(短周期)
% 输出: seq – 生成的码序列
state = init_state;
seq = zeros(1, num_chips);
% 将八进制反馈多项式转换为抽头位置
taps = octalToTaps(feedback); % 例如 14501 → [1, 3, 5, 10, 12]
for i = 1:num_chips
% 输出最后一级
seq(i) = state(end);
% 计算反馈(各抽头的异或)
fb = 0;
for t = taps
fb = xor(fb, state(t));
end
% 移位
state = [fb, state(1:end–1)];
% 短周期重置(如需要)
if reset_after > 0 && mod(i, reset_after) == 0
state = init_state;
end
end
end
3.4 主生成函数结构
function pCode = generatePCode(prn, gps_week, tow_ms, num_chips)
% 生成指定卫星在指定时刻的P码
% 输入: prn – 卫星号 (1-32)
% gps_week – GPS周数
% tow_ms – 周内时(毫秒)
% num_chips – 需要生成的码片数
% 输出: pCode – P码序列 (+1/-1)
% 1. 查表获取该PRN的P码参数
[x2_delay, p_advance] = getPCodeParams(prn);
% 2. 计算四个寄存器的初始状态
% (基于GPS时间和PRN参数的复杂计算)
[init_X1A, init_X1B, init_X2A, init_X2B] = …
computeInitialStates(gps_week, tow_ms, prn, x2_delay);
% 3. 生成PN1序列
pn1 = lfsr12(init_X1A, 14501, num_chips, 4092) …
xor lfsr12(init_X1B, 14501, num_chips, 4092);
% 4. 生成PN2序列(含延时)
pn2_delayed = lfsr12(init_X2A, 17147, num_chips + x2_delay, 4092) …
xor lfsr12(init_X2B, 17147, num_chips + x2_delay, 4092);
pn2 = pn2_delayed(x2_delay + 1 : end);
% 5. 组合为P码
pCode_binary = xor(pn1, pn2);
% 6. 映射为 +1/-1
pCode = 2 * pCode_binary – 1; % 0→-1, 1→+1
end
3.5 一个重要的工程提醒
MATLAB从R2021b开始提供了官方的 gpsPCode 函数,可直接生成GPS卫星的P码:
% MATLAB官方函数(R2021b+)
pCode = gpsPCode(prn, 'NumChips', 10230, 'SampleRate', 10.23e6);
在学术研究和教学场景中,建议先独立实现生成算法以理解原理,再考虑使用官方工具函数提高效率。
四、仿真验证与分析
4.1 P码的时域特征
与C/A码一样,P码也是±1的伪随机序列。但由于码速率是C/A码的10倍(10.23MHz),P码的码片宽度仅为C/A码的1/10:
C/A码: |‾‾‾‾‾‾‾‾‾‾‾|___|‾‾‾‾‾‾‾‾‾‾‾|___| (1 chip ≈ 293m)
P码: |‾‾|__|‾‾|__|‾‾|__|‾‾|__|‾‾|__| (1 chip ≈ 29.3m)
更窄的码片宽度意味着更高的测距分辨率,这是P码“精密”二字的物理基础。
4.2 自相关与互相关特性
P码的自相关/互相关特性与C/A码类似——尖锐的自相关峰和低互相关。但由于P码周期极长,其互相关性能更为优越:
| 自相关峰/旁瓣比 | ~1023:1 | ~非常优良 |
| 互相关水平 | 较低 | 更低(长周期优势) |
| 抗多址干扰 | 良好 | 优异 |
4.3 P码与C/A码的频谱对比
由于码速率相差10倍,两者的频谱主瓣宽度差异显著:
功率谱密度
↑
│ C/A码 (1.023 MHz) P码 (10.23 MHz)
│ ████ ████████████
│ ██████ ██████████████
│ ████████ ████████████████
│ ██████████ ██████████████████
│ ████████████ ████████████████████
│ ██████████████ ██████████████████████
└──────────────────────────────────────────────→ 频率
0 1 2 3 4 5 6 7 8 9 10 (MHz)
P码的主瓣宽度约为C/A码的10倍。更宽的频谱意味着:
- 更强的抗窄带干扰能力
- 更高的处理增益(10log10(10.23×106)≈7010\\log_{10}(10.23 \\times 10^6) \\approx 7010log10(10.23×106)≈70 dB,远超C/A码的约43dB)
五、P码仿真中的常见问题
5.1 关于“P(Y)码”的说明
严格来说,GPS军用的加密码称为P(Y)码——即P码经过加密后的版本。普通P码(未加密)在理论上是可以生成的,但实际在轨卫星发射的是P(Y)码,没有解密密钥就无法使用。
5.2 状态初始化
P码生成中最复杂的部分是四个寄存器的初始状态计算。这需要:
- 精确的GPS时间(周数 + 周内秒)
- 正确的PRN对应的延时参数
- 短周期(4092 chips)的精确控制
5.3 存储与计算
P码的完整周期约267天,在1.023MHz码速率下相当于约 2.35×10142.35 \\times 10^{14}2.35×1014 个码片。切勿尝试一次性生成完整的P码序列——这不仅不现实,也完全没有必要。实际应用中只需生成所需时长的局部序列即可。
六、总结与系列关联
本篇核心收获
| 1 | 理解P码与C/A码的本质区别(速率、周期、精度) | ✅ |
| 2 | 掌握P码的四寄存器生成结构 | ✅ |
| 3 | 理解短周期(4092 chips)的设计意图 | ✅ |
| 4 | 了解P码相位分配与C/A码的配对关系 | ✅ |
| 5 | 掌握P码MATLAB仿真的核心思路 | ✅ |
与系列博客的关联
| 博客一 | C/A码生成 | 同为测距码,结构更简单(2寄存器 vs 4寄存器) |
| 博客二 | 中频信号模拟 | P码同样可以BPSK调制到中频载波 |
| 博客三 | 并行捕获算法 | P码捕获难度更高(周期长、码速率高) |
| 博客七 | P码仿真 | 精密测距码的生成原理与实现 |
系列博客完整目录
| 博客一 | C/A码生成原理与验证 | 移位寄存器、Gold码 |
| 博客二 | 中频信号模拟与滤波 | BPSK调制、AWGN、窄带滤波 |
| 博客三 | 并行码相位捕获算法 | FFT相关、多普勒搜索 |
| 博客四 | 真实信号捕获实战 | 数据处理、卫星延迟 |
| 博客五 | 从捕获到跟踪 | Costas环、DLL |
| 间章 | 从低通滤波到卡尔曼滤波 | 信号处理范式对比 |
| 博客六 | 从跟踪到PVT解算 | 比特同步、星历、定位 |
| 博客七 | P码仿真与实现 | 精密测距码、四寄存器结构 |
引用本文:本系列博客介绍的GPS C/A码与P码生成、信号模拟、捕获、跟踪与PVT解算算法,基于作者发表于IEEE的学术论文——Z. Shang, “GPS C/A code simulation analysis and GPS signal capture analysis based on MATLAB,” in 2023 IEEE International Conference on Integrated Circuits and Communication Systems (ICICACS), Xi’an, China, 2023, pp. 1-6. doi: 10.1109/ICICACS57324.2023.10248505。
(博客七 完)
网硕互联帮助中心


评论前必须登录!
注册