ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WiFi时频同步原理:从帧结构看STF与LTF如何实现定时和频偏估计

WiFi时频同步原理:从帧结构看STF与LTF如何实现定时和频偏估计 WiFi时频同步怎么做的,从帧结构讲起去年调试一块WiFi接收板卡时我遇到一个很头疼的问题链路预算算得清清楚楚灵敏度指标也达标了可实际抓包时误包率总是比理论值高一截。折腾了好几天最后把问题定位到同步模块——不是射频前端的问题也不是编解码的问题而是接收机在时频同步阶段就没有把帧起点和载波频偏处理好。那会儿我才真正意识到在所有OFDM解调链路里时频同步才是那个决定能不能把信号听懂的第一道关口。这篇东西我就从帧结构的角度把WiFi里时频同步这件事从头到尾捋一遍。适合正在做WiFi协议栈、基带算法验证的工程师也适合刚接触OFDM同步机制的通信专业学生。看完你至少能回答三个问题WiFi帧头里为什么要设计STF和LTF这两种训练序列接收机怎么靠它们找到帧起点收发两端的载波频偏又是怎么被估出来并补偿掉的1. 从听不懂到听清WiFi接收机为什么要先过同步这一关很多人以为WiFi接收机拿到天线信号就能直接解调这是个很大的误解。射频信号从发射端出来经过空中传播到达接收端这个过程会给信号引入两类非常要命的偏差。1.1 发送端和接收端天然存在的两大偏差第一类是时间偏差。发射机不知道自己发出的帧什么时候能到达接收机接收机也不掌握帧到达的精确时刻。更麻烦的是收发两端的采样时钟不是同一个晶振产生的采样时刻的间隔会有微小的差别。你可以把两个设备想象成两块走速略有差异的手表一台每天快0.1秒一台每天慢0.1秒短时间内看不出来但传输一个长帧时积累的误差就会让接收机采到的样点偏离理想位置。第二类是频率偏差。发射机调制时用的载波频率和接收机解调时用的本振频率分别由两端的晶振产生。晶振的精度通常是几ppm到几十ppm比如一个20ppm的晶振在2.4GHz频段会产生大约48kHz的绝对频率偏差。注意这是载波频率的偏差不是采样率的偏差但它同样会让整个信号频谱在接收端发生平移。时间偏差和频率偏差如果不去校正后面的OFDM解调基本就是白做。1.2 同步失败会带来什么后果OFDM系统的核心优势是子载波之间保持正交频谱上彼此重叠但并不干扰。这个正交性听起来很美但它建立在两个前提上接收机FFT窗口必须对准符号边界以及本振频率必须与发射载波一致。时间没对准FFT窗口跨到相邻符号上前一个符号的尾部会泄漏进当前符号产生符号间干扰ISI。而且FFT窗口偏移还会给每个子载波引入一个与子载波序号成正比的相位旋转偏移越大边缘子载波的相位旋转越夸张。频率没对准子载波频谱整体搬移接收端的采样点不再落在每个子载波的峰值上而是落在相邻子载波泄漏过来的干扰上这就是子载波间干扰ICI。打个比方一列整齐的队伍本来每个人站在自己的格子里时间偏差相当于你拍照时按快门的瞬间队伍正好在换步拍出来的人都是重影频率偏差相当于整个队伍被挪了半格站在格子边界上的人互相挤着谁都不清爽。重影和拥挤叠加在一起解调出来的星座图就是一盘散沙误码率直接雪崩。所以WiFi协议在帧结构设计上专门在最前面放了一段精心构造的前导码目的就是让接收机在不知道任何先验信息的情况下靠这段训练信号完成时频同步。理解了这一点再去看帧结构你会发现每一段都是设计过的不是随手画的。2. 802.11帧头上写了什么前导码的结构与设计逻辑WiFi的物理层帧PPDU在最前面有一大块前导码Preamble后面才跟着信号字段SIG和数据字段Data。前导码是接收机最先接触到的部分也是同步算法的全部依据。2.1 从宏观帧到前导码数据发送前先打招呼一个完整的PPDU大致是这样的先是一段供同步用的前导码接着是SIG字段里面写着调制编码方式、帧长度、带宽等解调必需的信息最后才是真正的用户数据。前导码在不同代际的WiFi里长得不太一样。802.11a/g时代的传统前导码L-STF、L-LTF是必须保留的802.11n加了HT前导码802.11ac加了VHT前导码802.11ax加了HE前导码。但不管怎么加最前面的核心结构——短训练序列和长训练序列——从802.11a到802.11ax一直没变过。这也是所有同步算法的立足点。前导码的设计逻辑可以理解为发送端先不着急发数据而是先发一段接收机认识的信号这段信号要足够有规律、足够冗余让接收机在信噪比很差的情况下也能提取出时间基准和频率基准。这就像两个人约好在嘈杂的火车站碰面先约定好暗号再谈正事。2.2 STF短训练序列的重复结构与用途短训练序列STFShort Training Field在20MHz带宽下持续8微秒内部由10个完全相同的短符号组成每个短符号只有0.8微秒。因为每个符号极短所以它在频域上只占据了每隔4个子载波的位置能量分布很稀疏但时域波形有极强的周期性。这个周期性是同步算法的金矿。接收机不需要知道STF的具体内容只要检测到接收信号里存在一个周期为0.8微秒的重复结构就能判定帧来了。而且STF特别适合做自动增益控制AGC——信号刚到达时功率未知如果不管三七二十一直接放大轻则信号削顶重则量化噪声淹没有效信号。STF的8微秒时间窗口正好给AGC留出了收敛时间等STF过去、LTF到来时接收机增益已经调整到位了。STF还承担了粗频偏估计的任务。后面我会详细算这个账这里先记住一个结论短重复周期能覆盖大的频率估计范围但精度有限适合先把大方向找对。2.3 LTF长训练序列如何提供精调的依据长训练序列LTFLong Training Field在STF之后由保护间隔GI1.6微秒加两个或更多长符号组成每个长符号3.2微秒。LTF的重复周期更长频域上所有子载波都有能量分布因此能提供高分辨率的定时信息。接收机在完成STF阶段的粗同步后还需要进一步精确定位FFT窗口的起始位置。LTF的重复结构让接收机可以在更长的时间跨度上做相关运算把定时误差缩小到亚采样点级别。同时LTF也是信道估计的载体但那是解调阶段的事同步阶段更关心的是它带来的高分辨率频偏估计。STF和LTF的分工可以总结成一句话粗的、范围大的活儿交给STF细的、精度高的活儿交给LTF。下面这张表能直观说明两者的差异特征STFLTF总时长8微秒约8微秒含GI重复周期0.8微秒3.2微秒长符号频域密度每4个子载波一个全子载波主要用途帧检测、粗定时、AGC、粗频偏精定时、细频偏、信道估计估计范围大、精度低小、精度高2.4 信号字段与前导码的关系SIG字段紧跟在LTF后面里面是调制方式MCS、帧长、带宽、编码率等关键参数。接收机只有完成了时频同步才能把SIG字段正确解出来而SIG解出来之后接收机才真正知道后面的Data该怎么解。所以整个帧结构是层层递进的阶梯STF解决信号来了没、大概在哪的问题LTF解决精确位置在哪、频率偏了多少的问题SIG解决接下来怎么解的问题Data才是真正要传的内容。同步模块只需要关心前两级阶梯。3. 定时同步接收机怎么在一片喧闹里找到帧起点定时同步解决的问题是空中信号一直在噪声也一直在接收机怎么判断哪一刻是帧真正开始的时刻3.1 延迟相关检测为什么不用本地互相关最直觉的做法是让接收机保存一份STF的本地模板把接收信号和模板做互相关峰值出现的位置就是帧起点。这个方法在信噪比高时确实好用但存在两个问题一是WiFi接收机在帧到来前并不知道对方会用什么带宽和速率模板匹配的泛化能力有限二是互相关运算对频率偏差非常敏感载波有频偏时接收到的STF波形已经和本地模板产生了相位旋转相关峰会被展宽甚至淹没。所以实际设备用的是延迟相关delay correlation算法。核心思想是既然STF是重复结构那么相隔一个重复周期D的采样点之间应该高度相似。接收机把当前采样点和D个采样点之前的信号做共轭相乘如果这一段确实是STF乘出来的结果会有一个比较稳定的相位如果是噪声或非相关信号结果会随机起伏。再把这个结果在窗口内累加并归一化就得到一个在STF期间明显抬升的度量值超过门限就意味着检测到帧了。伪代码长这样# 信号长度 N重复周期 D20MHz采样率下D16 # r 是接收到的复数基带信号 for n in range(D, N): numerator sum(r[n-k] * conj(r[n-k-D]) for k in range(window_len)) denominator sum(abs(r[n-k])**2 for k in range(window_len)) metric[n] abs(numerator)**2 / (denominator**2 eps) if metric[n] threshold: # 粗略帧起点估计 start_estimate n break这个算法有个好处它不需要知道STF的具体数值只要信号具备周期性就能检测到天然抗频偏频偏体现为一个固定的相位旋转取模之后就不影响了。计算量也小一个滑动窗口的乘加运算而已。实际FPGA实现时连复数除法都不一定做用能量归一化或者直接比较分子分母的相对大小就行。3.2 门限判决与AGC实际工程里的两道坎延迟相关检测得到的是一个归一化度量值它是不是足够大才代表帧来了这个门限怎么定是个大学问。门限太高小信号帧或者信噪比很低的帧直接漏检接收机彻底瞎掉门限太低噪声的随机峰值会触发误检后面解出来的全是垃圾。更麻烦的是WiFi是突发通信信号和噪声交替出现门限需要既能适应高信噪比场景又能在低信噪比场景下保持可用。工程上常用的做法有两种一种是用相对门限把延迟相关度量值除以滑动能量窗口的均值比值超过预设倍数才判定为帧到达另一种是用双窗口滑动比较前面一个窗口测噪声底后面一个窗口测信号加噪声两者比值跳变时触发检测。前者实现简单后者对慢变干扰更鲁棒。AGC的问题同样不可忽视。STF虽然给了8微秒的收敛窗口但AGC环路从看到信号到增益稳定通常需要几个微秒。如果AGC增益还没稳定STF后段的信号幅度还在剧烈波动延迟相关度量值就会毛刺四起门限判决很容易出错。我在调试时踩过这个坑后来采取的办法是AGC检测用单独的快速通道不依赖延迟相关的判决结果二者并行处理等AGC稳定后再让定时同步模块继续精调。3.3 符号边界精同步从粗起点到FFT窗口STF的粗同步能给出一个大致位置但精度通常在几个采样点以内。对于OFDM解调来说这几个采样点的误差在保护间隔内是可以容忍的但误差如果接近甚至超过GI长度FFT窗口就会跨到相邻符号ISI立刻出现。所以精同步阶段需要利用LTF。LTF的重复周期是3.2微秒在20MHz采样率下相当于64个采样点。接收机在粗起点附近的一个小范围内对LTF做延迟相关搜索度量值最大的位置把FFT窗口精确对准。更细的做法是FFT窗口起点实际上可以放在符号边界的保护间隔内任意位置只要不越过符号边界就行所以精同步的容差比看起来宽松一些。还有一个细节WiFi协议里GI有两种长度普通GI是0.8微秒短GI是0.4微秒。短GI模式下符号时间更紧凑对定时精度的要求更苛刻FFT窗口稍微偏一点就可能撞到相邻符号。做同步算法时GI长度的信息虽然要到SIG阶段才能知道但精同步时最好按最严格的短GI场景来评估定时误差容忍度否则后面换到短GI模式误包率会突然恶化。4. 频率同步当两端的秒钟走速不一样定时同步解决的是什么时候开始采的问题频率同步解决的是采下来的信号频率偏了多少的问题。这两个问题经常放在一起处理因为它们的估计都可以从同一个延迟相关结果中提取。4.1 载波频偏是怎么来的晶振偏差与多普勒效应前面提过收发晶振的精度决定了载波频率偏差的上限。普通的石英晶振精度在10ppm到20ppm之间算下来2.4GHz频段的频偏在24kHz到48kHz5GHz频段直接翻倍到50kHz到100kHz。WiFi 6E进入了6GHz频段同样的ppm值对应的绝对频偏更大对同步算法的挑战也更高。多普勒效应对WiFi这类室内通信场景通常不是主要矛盾——人走路的速度产生的多普勒频移只有几十赫兹跟晶振偏差差了两三个数量级。但在车联网或者高铁场景中多普勒效应就不能忽视了几百赫兹的频移叠加在晶振偏差上会让同步算法面临更宽的工作范围。有趣的是不只是射频载波会偏采样时钟也会偏。采样时钟偏差SCOSampling Clock Offset表现为时域信号的压缩或拉伸在OFDM里会体现在子载波相位随符号序号累积旋转。好在802.11系统通常在基带同时做载波频偏和采样时钟偏移的联合跟踪靠导频子载波在数据符号阶段持续估计残余偏差。但同步模块的第一道关口还是先把载波频偏的大头干掉。4.2 粗频偏估计利用STF的周期性STF的延迟相关结果不只是用来做定时的它的相位本身就包含了频偏信息。原理很简单如果接收信号存在频率偏差Δf那么相隔D个采样点的两个采样点之间会产生一个额外的相位旋转大小为2πΔf·D·Ts其中Ts是采样间隔。把这个相位角求出来再除以2πD·Ts就得到了频偏的估计值。由于STF的重复周期短0.8微秒D16相位角的取值范围是(-π, π]所以能估计的频偏范围是±1/(2·0.8微秒) ±625kHz。这个范围覆盖普通的晶振偏差绰绰有余。但短周期也意味着精度有限。相位角除以一个很小的D相当于把微小的相位误差放大了好几倍。实测下来STF粗频偏估计的误差通常有几千赫兹对于64QAM甚至256QAM来说还不够用必须靠LTF做细估计。4.3 细频偏估计LTF的分辨率优势到了LTF阶段重复周期变成了3.2微秒D64甚至可以把两个LTF符号之间的间隔利用起来D80或更大。D越大相位角对频偏的放大倍数越大估计精度越高。但代价是模糊范围变小——D64时最大可无模糊估计范围是±1/(2·3.2微秒) ≈ ±156.25kHz比STF的范围窄了4倍。所以标准的做法是两步走先用STF做一个覆盖范围大但精度低的粗估计把频偏从几十kHz缩小到几kHz再用LTF在剩余的小范围内做细估计把频偏进一步压低到几百Hz以内。两次估计级联起来既保证了捕获范围又保证了精度。还有一个容易忽略的层次整数倍频偏。LTF细频偏估计是基于相位旋转的但相位旋转只能反映小数倍频偏如果频偏偏大导致整个频谱平移了一个甚至多个子载波间隔78.125kHz相位方法是测不出来的。整数倍频偏会让解调后的星座图整体错位通常需要靠LTF的频域模式或者SIG字段的导频来识别和纠正。这也是为什么有些资料会把频偏估计分成整数倍和小数倍两步来说。实际接收机里粗频偏加上细频偏的联合估计通常会先把整数倍的影响消掉再处理小数倍残差。4.4 频偏补偿的工程实现NCO与相位累加器估出了频偏接下来要在时域把频偏补偿掉。最直接的做法是用一个数控振荡器NCO生成频率为-Δf的复指数信号与接收信号逐点相乘。工程实现上NCO就是相位累加器加查找表或CORDIC相位每次递进2πΔf·Ts查表输出cos和sin值复乘完成频率搬移。# 已知频偏估计 d_freq_hz采样率 fs phase_step -2 * pi * d_freq_hz / fs phase 0.0 for n in range(N): comp[n] r[n] * (cos(phase) 1j * sin(phase)) phase phase_step补偿后的信号就可以送入FFT做频域处理了。需要提醒的是补偿一定要在FFT之前完成否则频偏被带进频域所有子载波都被污染信道估计和均衡模块会非常痛苦。5. 从理论到板子完整处理链路和实测避坑经验纸上谈兵到这里可以收尾了但真正做产品前面讲的所有模块都必须串成一条流水线并且处理好多天线、多带宽、低功耗等现实问题。5.1 一次典型的同步处理流程一个比较完整的WiFi接收同步流程是这样的能量检测先确认信道上有信号活动触发AGC启动。AGC调整用STF前段的能量信息把射频增益调到合适范围。帧检测延迟相关度量越过门限判定帧到达。粗定时记录帧起始的粗略位置。粗频偏估计用STF延迟相关的相位估计大范围频偏。精定时在粗起点附近用LTF搜索最佳FFT窗口。细频偏估计用LTF估出剩余频偏完成整数倍频偏判定。频偏补偿NCO逐点校正时域信号。FFT并解调SIG获取速率和长度信息正式进入数据解调。每一步的输出都是下一步的输入而且每一步都会把不确定性缩小一点。这个级联结构是全志、高通、博通这些WiFi芯片设计里的基本范式差异主要体现在每个模块的具体实现和门限设置的策略上。5.2 实测中最容易踩的四个坑第一个坑是AGC未收敛就做相关检测。天线端刚收到信号时如果增益还在快速变化信号幅度剧烈波动延迟相关的度量值会出现假的峰值。解决思路是把AGC判决和帧检测并联或者让帧检测模块在前几个微秒内只做触发预判等AGC稳定后再做精确计时。第二个坑是带宽切换和采样率变化。802.11n/ac/ax支持20/40/80/160MHz带宽带宽变了采样率就变STF的重复周期虽然还是0.8微秒但采样点数D会成倍增加。20MHz时D1640MHz时D3280MHz时D64。如果同步参数是硬编码的换带宽必挂。好的做法是让同步模块根据带宽配置动态更新D值和窗口长度。第三个坑是低功耗模式和晶振温漂。WiFi设备在空闲时会进入省电模式晶振可能被关闭或降频等到要收包时重新启动频率还没稳定就开始接收。这种情况下晶振频偏可能比标称值大好几倍粗频偏估计范围要留足余量。我遇到过一款设备在冷启动时频偏达到80kHz幸好当时粗估计范围设计的是±156kHz否则直接漏检。第四个坑是多天线场景的同步一致性。802.11n以后接收机通常有2根以上天线每根天线都有独立的射频链路和ADC它们各自的频偏和定时偏差可能略有不同。同步模块可以用做主天线通常选择信号最强的那根的同步结果再给其他天线做相对补偿也可以做联合估计把多路信号的相关结果合并起来提高精度。前者简单后者增益大但复杂度翻倍。对于刚开始做WiFi接收机的朋友建议先从主天线方案做起跑通后再优化多天线联合估计。5.3 从802.11a到WiFi 7同步挑战的变化趋势回看802.11a时代20MHz带宽、64点FFT、64QAM封顶同步误差的容忍度相对宽松。到了802.11ax最高支持160MHz带宽、1024QAM调制子载波间隔还是78.125kHz没变但子载波数量大增对残余频偏的容忍度大幅收窄。WiFi 7更进一步引入320MHz带宽和4096QAM同时对多链路MLO操作提出了要求。同步算法在这中间的演进主要体现在估计精度要求从几百Hz提升到几十Hz定时误差容忍度从保护间隔的几分之一提升到更严格的分数同时捕获场景从单一链路变成多链路并发不同链路的同步模块需要配合调度。不过万变不离其宗帧结构里STF和LTF的分工逻辑依然成立。理解了最基础的时频同步原理再去看802.11be甚至未来WiFi 8的帧结构你会发现都是在这个骨架上做加法。我个人的体会是同步模块是整个WiFi基带里最吃力不讨好的部分——做好了没人会注意它做不好所有上层指标都会崩盘。但恰恰是这种第一公里的工程最能体现一个通信系统设计者的基本功。调试同步链路时遇到门限抖动、AGC联动、频偏跳变这些问题别慌先把帧结构拿出来重新对照一遍再回看自己的算法是否在每个结构段上做了该做的事。思路理清了问题基本就解决了一半。
返回列表