4、信号捕获原理:时频二维搜索、串行搜索与并行搜索、捕获判决门限设定、捕获性能指标
各位同学,大家好。今天我们进入信号捕获这个核心环节。说实话,捕获是整个接收机里最让我头疼,也最让我着迷的部分。为什么?因为你要在茫茫的时频二维空间里,把那个微弱到几乎淹没在噪声里的信号给揪出来。这活儿,有点像大海捞针。
4.1 时频二维搜索:为什么是二维?
先问大家一个问题:GPS卫星信号到了接收机这边,我们不知道什么?
两个东西不知道:码相位和多普勒频移。
- 码相位:卫星的C/A码起始点在哪里?你不知道。接收机本地产生的C/A码和卫星的C/A码,存在一个随机的时延。这个时延范围是0到1023个码片。
- 多普勒频移:卫星在动,接收机也可能在动。相对运动导致载波频率偏移。对于GPS L1频段,这个偏移范围大约是±10 kHz。
所以,捕获的本质就是:在码相位维度和频率维度上,同时进行搜索。这就是时频二维搜索。
我习惯把这个问题想象成一个棋盘。棋盘的行是频率,列是码相位。每个格子代表一个“假设”:假设当前信号的频率是f,码相位是τ。我们要做的,就是遍历这个棋盘,找到那个让相关峰值最大的格子。
核心思想:捕获 = 在二维搜索空间内,找到使本地信号与接收信号相关值最大的那个点。
4.2 串行搜索与并行搜索
好,棋盘有了,怎么搜?这就引出了两种基本策略:串行搜索和并行搜索。
4.2.1 串行搜索
串行搜索,说白了就是一个格子一个格子地搜。先固定一个频率,把1023个码相位全部搜一遍;然后换下一个频率,再搜一遍。直到找到那个峰值。
伪代码大概是这样的:
for freq = -10kHz to +10kHz step 500Hz:
for code_phase = 0 to 1022:
correlation = correlate(received_signal, local_code, freq, code_phase)
if correlation > threshold:
signal_found = true
break
if signal_found:
break
这种方法的优点是什么?简单、省资源。一个相关器就够了。但缺点也很明显——慢。你想想看,频率步进如果是500 Hz,那频率维度就有41个点。码相位有1023个点。总共要搜41 × 1023 ≈ 42000次。每次相关运算还要花时间。我记得早期的一些民用GPS接收机,冷启动要花好几分钟,用的就是这种串行搜索。
避坑指南:我曾经在一个项目中,为了省FPGA资源,强行用了串行搜索。结果冷启动时间长达8分钟,用户直接投诉。后来我学乖了,该并行的时候就得并行。
4.2.2 并行搜索
并行搜索,就是一次搜多个格子。有两种主要的并行方式:
- 并行频率搜索:用多个相关器,每个相关器对应一个不同的频率。一次把所有频率都搜完,然后看哪个频率的峰值最高。
- 并行码相位搜索:利用FFT(快速傅里叶变换)的性质,一次把所有码相位都搜完。这是目前最主流的方法。
并行码相位搜索的原理,我简单说一下:
时域的相关运算,在频域就是乘法。具体来说:
- 对接收信号做FFT,得到R(f)。
- 对本地C/A码做FFT,得到C(f)。
- 计算R(f) × conj(C(f))。
- 对结果做IFFT,得到的就是所有码相位下的相关值。
一次IFFT,就把1023个码相位全算出来了。效率极高。
关键点:FFT并行搜索,把搜索时间从O(N²)降到了O(N log N)。N是码相位数量。对于1023个码片,速度提升是数量级的。
4.3 捕获判决门限设定
搜完了,怎么判断有没有捕获到信号?这就需要一个判决门限。
门限设得太低,虚警多——明明没信号,你非说捕获到了。门限设得太高,漏检多——信号就在那儿,你却没认出来。
常用的门限设定方法有两种:
- 固定门限法:根据噪声功率,设定一个固定的门限值。比如,门限 = 3 × 噪声均方根值。这种方法简单,但适应性差。噪声变化了,门限就不准了。
- 自适应门限法:实时估计噪声功率,动态调整门限。比如,用CFAR(恒虚警率)算法。我比较推荐这种方法,尤其是在信号动态范围大的场景下。
在实际工程中,我常用的一个经验公式是:
门限 = μ_noise + α × σ_noise
其中,μ_noise是噪声均值,σ_noise是噪声标准差,α是一个系数,通常取3到5。α越大,虚警概率越低,但漏检概率越高。需要根据系统要求来权衡。
注意:门限设定不能只看理论值。我遇到过好几次,理论计算的门限在实验室里跑得好好的,一到外场就出问题。为什么?因为外场的干扰信号、多径效应,都会改变噪声的统计特性。所以,门限一定要留有余量,并且最好能在实际环境中做校准。
4.4 捕获性能指标
怎么评价一个捕获算法好不好?看三个指标:
| 指标 | 定义 | 我的经验 |
|---|---|---|
| 检测概率 (Pd) | 信号存在时,正确检测到的概率 | 一般要求 > 90%。弱信号场景下,能到70%就算不错了。 |
| 虚警概率 (Pfa) | 信号不存在时,误判为存在的概率 | 一般要求 < 1%。太高了,接收机会一直“假锁定”。 |
| 平均捕获时间 (Tacq) | 从开始搜索到成功捕获的平均时间 | 这是用户最关心的指标。冷启动 < 30秒,热启动 < 5秒,是比较合理的。 |
这三个指标是相互制约的。你想提高检测概率,往往就会增加虚警概率。你想缩短捕获时间,可能就得牺牲检测概率。这就是工程上的权衡。
我个人习惯,在设计阶段会先定一个目标:比如,Pd ≥ 95%,Pfa ≤ 0.5%,Tacq ≤ 10秒(冷启动)。然后根据这个目标,去反推需要的信噪比、相干积分时间、非相干积分次数等参数。
一个小技巧:在调试捕获算法时,我经常用“捕获概率曲线”来评估性能。横轴是信噪比,纵轴是检测概率。这条曲线越陡峭,说明算法对信噪比的敏感度越低,鲁棒性越好。
好了,关于信号捕获的原理,我们就讲到这里。下一节,我们会深入讨论捕获的具体实现,包括相干积分和非相干积分的细节。大家有什么问题,可以随时问我。