搞卫星扩频通信的人,多少都经历过这种尴尬:频谱仪上看信号好好的,能量就在那儿杵着,但接收机就是锁不住,相关峰死活起不来。我当年调试第一版扩频接收机时就卡在"信号明明在,却抓不到"这个坎上,后来把问题拆开才发现,问题不在前端硬件,而在捕获阶段的频率搜索和码相位搜索没有对准。也是从那次之后,我才真正把扩频通信和跟踪算法这套东西吃透。
这篇文章就把我从原理到工程实现的所有体会整理出来。内容围绕卫星扩频通信链路中最核心的"捕获"和"跟踪"两大环节展开,涵盖直接序列扩频(DSSS)的基本原理、多普勒频移的影响、二维搜索策略、码环和载波环的协同工作,还有高动态场景下的失锁问题。无论你是刚接触卫星通信的在校学生,还是在做低轨卫星地面终端的工程师,这篇文章都能提供一套可以直接落地的思路和参数设计方法。
1. 卫星通信为什么离不开扩频:从一次锁不住信号的排查说起
1.1 扩频不只是抗干扰
很多人对扩频的第一印象是"抗干扰",这个印象没错,但只对了一半。在卫星通信里,扩频技术被选中的原因至少有四个:抗干扰、抗截获、多址接入、高精度测距。
先说抗干扰。直接序列扩频把窄带信号扩展到很宽的频带上,接收端用本地伪码做相关解扩,把宽带信号重新压缩成窄带信号。这个过程中,宽带干扰和窄带干扰经过相关处理后被摊薄,只有与本地伪码强相关的信号才能获得处理增益。处理增益的计算公式是:
Gp = 10 × log10(Rc / Rb)
其中Rc是伪码速率,Rb是信息速率。举个例子,如果信息速率是1kbps,伪码速率是10.23Mcps,那么扩频增益大约是10×log10(10230) ≈ 40dB。这意味着即便干扰信号比有用信号强40dB,解扩之后依然可以正常解调。
再说抗截获。扩频信号在频谱上淹没在噪声之下,功率谱密度极低,第三方很难通过能量检测发现通信的存在,这就是低截获概率特性。对于军用卫星和中继卫星来说,这是硬需求;对于民用低轨卫星来说,扩频也能避免不同系统之间的频谱污染。
多址接入也是扩频的一大优势。码分多址(CDMA)允许所有用户共用同一载波频率,用不同的伪码序列区分用户,这对卫星转发器的功率和带宽利用非常友好。还有测距能力:扩频信号的码相位可以直接换算成传播时延,进而得到距离,这在导航卫星里是基本操作。
我一开始做接收机时,觉得扩频就是"用PN码乘一下",后来才意识到,扩频通信的难点从来不在发射端,而在接收端——如何在不知道信号参数的情况下把信号捞出来,捞出来之后又如何在动态环境下保持锁定。
1.2 接收机设计的第一道选择题
卫星扩频接收机的整体架构可以分成射频前端、AD采样、捕获引擎、跟踪环路、解调解码几个部分。射频前端负责下变频和滤波,AD采样负责把模拟信号数字化,捕获引擎完成信号的粗同步,跟踪环路完成信号的精确跟踪,之后才轮到数据解调。
这里面最容易犯的错误,是直接照搬地面通信接收机的设计思路。地面场景信道相对稳定,多普勒很小,接收机可以简单粗暴地用一个固定频率去做下变频和解调。但卫星场景完全不同:低轨卫星相对地面终端的径向速度可以达到每秒数公里,带来的多普勒频移和码率偏移都很大,而且这个偏移还是时变的。
所以卫星扩频接收机在设计上从一开始就要围绕"动态"两个字展开。捕获阶段的搜索范围和步进要考虑最大多普勒,跟踪阶段的环路带宽要考虑多普勒变化率,环路结构要考虑加速度和加加速度,这些都是地面接收机不需要太操心的。
2. 捕获阶段:在频率和码相位的二维平面上捞信号
2.1 多普勒频移的来龙去脉
捕获的本质,是完成载波频率和码相位的粗略估计,让接收机把信号的残余频偏压到一个范围内,同时把本地伪码和接收伪码的相位对齐。这个过程中最大的"拦路虎"就是多普勒频移。
多普勒频移的计算公式是:
fd = fc × vr / c
其中fc是载波频率,vr是卫星与终端的径向速度,c是光速。举例来说,一颗轨道高度约500km的低轨卫星,典型轨道速度约7.6km/s,在星下点附近径向速度接近0,但在卫星升起和落下期间径向速度可以达到最大,约7km/s左右。如果载波频率是2.2GHz,那么最大多普勒频移大约是:
fd = 2.2e9 × 7000 / 3e8 ≈ 51.3kHz
也就是说,接收机需要在±50kHz甚至更大的范围内搜索载波频率。如果载波频率更高,比如Ka频段30GHz,同样的径向速度下多普勒频移会接近700kHz,搜索范围更大。
不止载波有频移,伪码速率也会因为多普勒效应产生压缩或拉伸,这就是码多普勒。伪码速率偏移量为:
ΔRc = Rc × vr / c
如果伪码速率是10.23Mcps,多普勒速度为7km/s,那么码率偏移大约是:
10.23e6 × 7000 / 3e8 ≈ 238Hz
折算成码相位漂移速率,对捕获和跟踪都有影响。捕获时如果搜索时间很长,码多普勒会让相关峰偏移,所以必须把频偏和码偏放在一起考虑。
2.2 搜索步进怎么定:频率步进和码相位步进
捕获搜索是在一个二维平面上进行的,一维是载波频率,一维是码相位。频率搜索步进取决于相干积分时间Tcoh,通常取:
Δf = 1 / (2 × Tcoh)
这个公式的来源是相关损耗:当载波残余频偏等于Δf时,相干积累的归一化相关幅度会衰减到约0.64,对应约2dB的损耗。如果Tcoh取1ms,频率步进就是500Hz;Tcoh取4ms,频率步进就是125Hz。
码相位搜索步进通常取半个码片(0.5 chip),因为当本地伪码与接收伪码错开半个码片时,相关值仍然能保持一定的幅度,不会完全漏检。如果步进取1个码片,错开一个码片时会完全失配,抗噪能力明显下降;如果取1/4码片,搜索时间会加倍,但灵敏度提升有限,所以0.5码片是性能和代价的折中。
搜索范围由最大多普勒和伪码周期共同决定:
频率搜索范围 = 2 × fd_max + 余量
码相位搜索范围 = 伪码周期长度
以GPS C/A码为例,码周期1ms,码长1023码片,码相位搜索数量就是2046个。频率搜索点数是范围除以步进。如果最大多普勒±50kHz,步进500Hz,就是200个频点。总的搜索单元数就是200 × 2046 ≈ 40万个搜索单元。
这个数量级如果用串行搜索,每个单元积分1ms,最坏情况40万毫秒才能搜完,约400秒,这在大多数应用中是不可接受的。解决办法是并行化:频率维用多个相关器并行,或者码相位维用FFT实现并行相关。
2.3 FFT并行捕获的实现思路
FFT并行捕获的原理是利用循环相关定理:时域的循环相关等价于频域共轭相乘。具体流程是:取接收信号的一段时间序列(长度至少一个伪码周期),做FFT到频域,与本地伪码FFT的共轭相乘,再IFFT回时域,结果就是不同码相位对应的相关值。
这样做的好处是,一次FFT运算就完成了所有码相位的搜索,码相位维度被完全并行化了。接下来只需要在频率维度上继续搜索,用不同频率的本地载波去混频,对每个频点做一次共轭相乘+ IFFT。
伪代码大致是:
for each freq in freq_search_range: mix_signal = received_signal * exp(-j*2*pi*freq*t) S = FFT(mix_signal) correlation = IFFT(S * conj(FFT(local_code))) peak = max(abs(correlation)) if peak > threshold: record freq and code_phase breakFFT长度取一个伪码周期的采样点数。假设采样率是40MSps,码周期1ms,那么FFT长度是40000点。40000点的FFT运算量并不大,现代数字信号处理器或FPGA都可以轻松处理。实际工程中,为了减少FFT长度,也可以先做分段处理,或者只对半码片精度的码相位输出进行检测。
我自己的经验是:FFT捕获的性能瓶颈往往不在FFT本身,而在于混频频率点的数量。如果频率搜索范围是±50kHz,步进500Hz,需要做200次FFT运算。如果每次FFT耗时0.1ms,总共也就20ms,比串行搜索快了好几个数量级。
2.4 判决门限与虚警控制
捕获完成后,需要对相关峰做出"有信号"还是"无信号"的判决。门限设得太低,虚警概率增大,接收机会反复进入捕获状态,浪费大量时间在错误的频点上;门限设得太高,检测概率下降,弱信号直接被漏掉。
工程上常用恒虚警率(CFAR)原则设定门限。基本思路是:计算噪声基底的平均值和标准差,然后将门限设为:
门限 = 噪声基底的平均值 + 门限系数 × 噪声标准差
门限系数越大,虚警率越低,但检测灵敏度也越低。通常门限系数取4到6。门限的统计量可以在搜索过程中实时计算,也可以预先用无信号时的相关输出统计得到。
判断检测结果还需要考虑"多峰"问题。卫星信号被多径反射后,相关峰旁边会出现副峰,如果只取最大值,可能选到副峰位置,造成几十米甚至几百米的测距误差。处理办法是检测主峰与最高副峰的比值,超过一定比值(比如主峰是副峰的1.5倍以上)才判定捕获成功。
3. 跟踪阶段:码环和载波环的协同作战
3.1 延迟锁定环(DLL)怎么锁定码相位
捕获完成后,码相位的误差还比较大,一般在一个码片左右,这会严重影响解扩后的信噪比。跟踪环路的任务就是把码相位误差逐步压到零点附近,同时持续跟踪信号的多普勒变化。
码跟踪环的核心是延迟锁定环(Delay Lock Loop, DLL)。DLL用三个相关器来检测码相位误差:超前相关器(Early)、即时相关器(Prompt)和滞后相关器(Late)。三个相关器分别使用超前半个码片、即时、滞后半个码片的本地伪码与接收信号相关。
当本地码相位准确对齐时,超前和滞后的相关值相等,鉴相器输出为零;当相位超前时,滞后相关值大于超前相关值,鉴相器输出一个校正量;反之亦然。鉴相器输出经过环路滤波器处理后,控制本地伪码发生器的码速率,让本地码跟上接收码。
常用的鉴相器公式是:
码相位误差 = (E - L) / (E + L)
用超前一滞后相关值之差除以两者之和,实现对信号幅度变化不敏感的归一化处理。归一化很重要,因为信号经过衰落或自动增益控制后幅度会变化,如果不归一化,环路增益就不稳定。
DLL的环路滤波器通常采用二阶或三阶结构。环路带宽的选择直接影响跟踪精度和动态响应能力。带宽越窄,噪声越小,但对动态的响应越慢;带宽越宽,跟踪越快,但噪声越大。
一个经验取值是:DLL的噪声带宽取0.5到2Hz。对于低轨卫星的高速动态场景,带宽可以放宽到5Hz左右,但高带宽带来的噪声会增加测距误差,需要根据具体需求折中。
3.2 载波环:锁频环(FLL)和锁相环(PLL)的分工
载波跟踪环负责把本地载波频率精确对准接收信号的载波频率。卫星接收机通常用两级载波环:先用锁频环(FLL)把频差拉小,再用锁相环(PLL)做精确相位跟踪。
FLL的鉴频器检测的是相邻两次相关结果的相位差变化率,输出频率误差信号。FLL对动态不敏感,能在频差较大的情况下工作,但跟踪精度不高。PLL的鉴相器直接检测相位误差,精度高,但对动态敏感,当频差太大或相位跳变大时容易失锁。
对于BPSK/QPSK调制信号,接收机通常使用Costas环来消除调制带来的180度相位模糊。Costas环的鉴相器输出与cos(2φ)相关,当相位误差为180度时,输出依然为零但符号不变,因此不能区分180度相位反转。在卫星导航信号中,导航电文比特翻转会导致180度相位跳变,Costas环可以自动适应这一点,但代价是跟踪环路的噪声增加。
实际工程中常用的策略是FLL辅助PLL:FLL带宽较宽,先把动态压住,PLL带宽较窄,在FLL的辅助下做精细跟踪。当PLL的环路误差收敛到一定程度后,可以降低FLL在环路中的权重,让PLL主导。
3.3 环路滤波器和带宽参数的具体设计
环路滤波器是跟踪环路的灵魂。常用的是二阶和三阶滤波器。二阶环路可以跟踪频率阶跃,但跟踪频率斜升时会有稳态误差;三阶环路可以跟踪频率斜升,适合高动态场景。
以二阶环路为例,环路滤波器的传递函数可以写成:
F(s) = 2×ζ×ωn + ωn² / s
其中ωn是自然频率,ζ是阻尼系数。阻尼系数通常取0.707,这个值能在超调量和收敛速度之间达到最优平衡。环路噪声带宽BN与ωn的关系是:
BN = ωn × (ζ + 1/(4ζ)) / 2
取ζ=0.707时,BN ≈ 0.53×ωn。
如果PLL的噪声带宽选15Hz,那么ωn ≈ 28.3rad/s。整定环路时,需要根据接收机的动态特性和信噪比来调整BN。这个参数是跟踪环路调优的核心,我在实测中试过好几种组合,发现BN从10Hz调到15Hz时,动态跟踪能力提升明显,但弱信号下的锁定时间也变长了。
实际设计时,环路参数还需要跟积分时间Tcoh匹配。积分时间越长,环路更新率越低,环路带宽的上限也越低。经验口诀是:环路带宽必须远小于更新率的1/2,否则环路会不稳定。
4. 高动态和弱信号场景下的跟踪策略
4.1 高动态场景:多普勒变化率是最大威胁
低轨卫星场景中,除了多普勒频移本身,多普勒变化率(即频率的一阶导数)也可能很大。卫星在星下点附近经过时,视线方向变化剧烈,多普勒变化率可以达到几十Hz/s甚至上百Hz/s,这会让二阶级联环路产生不可忽略的稳态相位误差。
三阶PLL能更好地跟踪频率斜升,但其噪声响应更差,稳定性设计也更复杂。工程上的做法是做动态预估:根据星历计算卫星对终端的视线加速度,把它作为前馈补偿加入到环路中。这种策略的前提是接收机能够获取卫星星历,在自组网或无星历场景下,只能用更高阶的环路硬扛。
我在实测中发现,高动态场景下最容易出问题的不是稳态误差,而是环路在加加速度变化点附近的瞬态响应。当卫星从接近变为远离时,多普勒加速度会经历一个正负切换的过程,如果环路带宽太小,这个切换过程就会导致载波相位跳变,进而引起误码率飙升。解决办法是动态调整环路带宽:在动态大时加宽带宽,在动态小时收窄带宽。
4.2 弱信号场景:积分时间和比特同步的博弈
弱信号场景下,噪声是主要矛盾。为了提升信噪比,需要延长相干积分时间Tcoh。但相干积分时间不能无限延长,原因有几个:
第一,频率搜索步进与Tcoh成反比,Tcoh越长,频率搜索越精细,搜索时间也越长。第二,导航电文或数据比特翻转会导致相关积累的符号反转,必须在积分前完成比特同步。第三,码多普勒和振荡器漂移在长积分时间内会造成相关峰能量衰减。
处理方法是采用"数据辅助"的策略:先做比特同步,掌握比特跳变沿的位置,然后让相干积分窗口与比特边界对齐,避免跨比特积分。更进一步,可以用导频通道信号辅助数据通道的跟踪,导频通道没有数据调制,可以安全地做长积分。
非相干积分是对相干积分输出做平方和累加,可以规避数据翻转问题,但平方运算会放大噪声,非相干积分的增益随累加次数的增加而递减。所以在设计弱信号接收机时,我通常建议先用较短的相干积分时间做初步捕获,确认信号存在后再逐步延长积分时间。
5. 实测和仿真中必须注意的坑
5.1 采样率和量化位宽的坑
扩频信号在AD采样后进入数字域,采样率的选择直接影响相关性能和资源消耗。采样率最好是伪码速率的整数倍,这样每个码片对应整数个采样点,相关器实现起来简单。
举个例子,伪码速率10.23Mcps,采样率40.92MSps时,每个码片正好4个采样点,超前滞后间隔取2个采样点(0.5码片)非常方便。如果采样率不是整数倍关系,相关器就要做插值处理,麻烦不说,相关峰还会被展宽。
量化位宽方面,1位量化实现简单,但相关损耗大;2位量化是成本和性能的常见折中;4位以上量化性能接近模拟域,但数据量翻倍。对卫星信号模拟器测试来说,我推荐至少用4位量化,这样能真实还原信号的动态范围。
5.2 环路滤波器的初始化和收敛问题
环路滤波器启动时的初始状态必须谨慎。如果初始化不当,环路可能先发散再收敛,严重的直接失锁。我常用的做法是:捕获完成后,用捕获得到的多普勒频移作为FLL的初始频差,把环路滤波器状态清零,让FLL先工作一段时间(比如1秒),等频率误差稳定后再切入PLL。
这个"先FLL后PLL"的切换时机很关键。切换太早,PLL会因为频差大而失锁;切换太晚,PLL一直拿不到主导权。判断切换条件的标准是PLL鉴相器的平均输出小于某个阈值,比如小于10度。
5.3 测试环境搭建:卫星信号模拟器的重要性
扩频接收机的调试不能只在实验室里灌白噪声,更不能一上来就指望卫星在轨实采。我建议在开发阶段就引入卫星信号模拟器,它能在可控条件下生成具有指定多普勒动态、信噪比、多径特征的卫星信号。
使用模拟器测试有几个技巧。第一个技巧是做"静态点频测试",让模拟器输出一个固定频率、固定功率的信号,先用这个信号把接收机的捕获门限和环路参数调好。第二个技巧是"阶梯多普勒测试",让模拟器逐步增加多普勒频率,验证接收机在不同频偏下的捕获和跟踪能力。第三个技巧是"动态场景回放",把真实卫星的星历导入模拟器,回放出完整的动态过程,测试接收机的全程锁定能力。
一次完整的测试流程,我会先在模拟器上设置一个包含加加速度变化的场景,让接收机连续运行数分钟,观察载波环相位误差和码环码相位误差的变化。如果相位误差随时间发散,那就说明环路带宽或环路阶数不够;如果相位误差有周期性波动,那就说明模拟器设置的多径环境干扰了相关峰。
5.4 一个容易被忽略的细节:码多普勒对积分时间的限制
前面提到码多普勒会导致接收码的码率偏移,这个偏移对长积分的影响非常隐蔽。我举个例子:当码率偏移为240Hz时,在一个1ms的伪码周期内,本地码和接收码的相位会发生约0.24码片的相对滑动。
这意味着如果相干积分时间长达10ms,码相位滑动就达到2.4码片,相关峰会被展平到几乎没有,即便载波频率已经完全对齐,也会因为码相位失配导致相关积累失败。所以弱信号场景下,不能只考虑频率搜索步进和积分时间的关系,还要计算码多普勒对码相位的影响。
如果码多普勒影响不可忽略,解决方案是加一个"码频率搜索"维度,或者在捕获阶段就估计码率偏移,直接生成与接收码率匹配的本地码。这个细节我在早期的项目里栽过跟头,当时只看载波频率搜索,忽略了码率偏移,导致长时间积分下灵敏度始终上不去。
我在实际调试这类系统时最大的体会是:扩频接收机是个"牵一发而动全身"的系统,捕获、跟踪、解调、测距看起来是几个独立模块,实际参数互相耦合。捕获的积分时间决定频率搜索步进,频率搜索步进决定捕获时间,捕获时间又反过来影响码多普勒的容忍度;跟踪的环路带宽决定动态响应,动态响应又决定弱信号下的失锁概率。调试的时候别急着调灵敏度,先把链路中每个参数对系统的影响捋清楚,再动手改,会省掉大量反复试错的时间。