GPS信号捕获【时间-频率空间搜索方法】
GPS信号捕获 【时间-频率空间搜索方法】
之前的文章介绍了GPS信号C/A码的生成方法,本文介绍实现GPS定位中的一个重要过程——信号捕获(GPS signal acquisition)。
简介
GPS信号的捕获过程主要是通过接收机接收卫星发射的信号,与本地生成的伪随机码 (replica signal) 进行相关操作来完成的。具体步骤包括:
(1)捕获目标:确定信号的存在,并粗略估计信号的多普勒频移 (Doppler shift) 和码延迟 (code delay),为后续的信号跟踪阶段提供初始参数。
(2)多普勒频移和码延迟搜索:通过改变本地复制信号的频率和码相位,与接收到的信号进行相关计算,寻找相关峰值。相关峰值表明找到了可能的多普勒频移和码延迟。
(3)相关计算:GPS信号捕获阶段的核心,基于如下公式:
补充:GPS信号捕获的基础是GPS信号的特质。具体而言,GPS的C/A 码的彼此之间的几乎没有互相关,只有自己本身和自己只有在没有延迟的情况下,自相关函数才会有极值。
时间-频率空间搜索
本文介绍GPS信号捕获的经典方法,时间-频率空间搜索(Time-Frequency Space Search),使用直接搜索算法(Serial Search)。具体来说,直接搜索法通过调整本地生成的伪随机码的相位和载波频率,逐点或并行地计算相关值,并寻找最优匹配。这种方法最为简单和容易理解,但是计算比较费时。
步骤可以简单分为:
(1)接收来自GPS卫星的信号。
(2)本地生成伪随机码和载波信号(Replica signal)。
(3)设置搜索范围。这里需要设置多普勒频移和码延迟两个参数。多普勒频移范围:由于卫星和接收机的相对运动,多普勒频移通常在 ±10kHz 之间,按固定步长(如 500 Hz或250Hz)划分搜索点。码延迟范围:根据伪随机码周期划分,步长通常为一个码周期的采样间隔,可以设置为0.5 chip。
(4)计算相关值。由接收机先产生特定卫星的伪随机噪声序列和本身的振荡器产生载波信号,所产生的码相位范围是从0~1022,输入的信号在与伪随机噪声(PRN)序列相乘后,再跟载波信号相乘,此处的载波信号分为两个,一个是振荡器所产生的载波信号,另一个则是产生的载波信号加上一个90°的相位差。简言之,就是得到同相信号(In-phase)和正交信号(Quadrature),最后再平方相加得到信号的能量(I^2 + Q^2)。算法流程可参考下图:
(5)寻找峰值。寻找相关值的峰值,若所得到的能量超过所设定的标准,则认为捕获到了需要找的多普勒频移和码延迟。
核心代码流程如下:
for sv = 1:32
% generate C/A code
ca_code = ShiftedSampledCA(sv, 1 / sampling_rate, 0.5); % raw code
samples_per_chip = sampling_rate / ca_rate;
current_corr_power=zeros(length(code_delay_range), length(doppler_range));
for code_idx = 1:length(code_delay_range)
% code delay
code_delay=code_delay_range(code_idx);
shifted_code = circshift(ca_code, round(code_delay * samples_per_chip));
for doppler_idx = 1:length(doppler_range)
f_D = doppler_range(doppler_idx);
f_NCO = f_IF + f_D;
% generate sine and cosine waves
t = (0:num_samples-1) / sampling_rate;
sin_wave = sin(2 * pi * f_NCO * t);
cos_wave = cos(2 * pi * f_NCO * t);
% compute components I and Q
I_t = incoming_1ms_IF .* cos_wave;
Q_t = incoming_1ms_IF .* sin_wave;
% compute sum of squarred
I_corr = sum(shifted_code.*I_t );
Q_corr = sum(shifted_code.*Q_t );
corr_power = I_corr^2 + Q_corr^2;
current_corr_power(code_idx,doppler_idx)=corr_power;
search_result(sv,code_idx,doppler_idx)=corr_power;
end
end
end
详细的小项目可以参考链接。这是有课程作业改编的GPS信号捕获方法。