利用OFDM 系统中数据协议中包含的2个长训练序列进行自相关实现精频偏补偿;
在接收和发射机的本振会存在频率的偏差,这样会导致 0 中频接收的正交基带采样数据中包含频偏分量,这个频偏分量可以在长训练序列检测中利用自相关值进 行估计;
通过自相关值得到估计频偏分量并补偿到后续的采样序列中,达到精频偏矫正的目的。
当接收到一帧中心频率为 fc 的数据时,接收端使用本振为(1+e)fc的本振进行 下变频,
那么e为频率偏差因子。 根据正交下变频原理进行下变频 ((1+e)fc) 和 fc 混频后得到
((1+e)fc)+fc 和 ((1+e)fc) -fc 倍频项被滤除剩余差频项 e*fc 也就是这个频率偏差会引入到基带信号中。

角频率公式 𝜔=2𝜋𝑓
如果想得到每个采样周期的弧度旋转量,可以在角频率公式两侧乘以 Ts 采样周期:
w𝑇𝑠 = 2𝜋𝑓𝑇s
w𝑇𝑠就是每个采样周期的相位旋转量,用𝛼表示,并把𝑒∗𝑓𝑐带入公式得到
𝛼 =2𝜋𝑒𝑓𝑐𝑇𝑠
如果能够估算出𝛼相位旋转量就可以补偿频偏 ;
使用以下算法使用训练序列进行估计频偏

如果对𝑆𝑚+64取共轭那么得到的两个短训练序列之间的相位旋转量是与实 际相反方向。
如果对𝑆𝑚取共轭得到的相位旋转量是与实际方向相同。
得到了估计的 𝛼𝑙𝑡 相位变化量之后,可以生成一个反向的相位变化量的采样序列补偿到实际采样序列中。

补偿序列在fpga 中就可以以相位递增量为α𝑙𝑡的DDS产生;
精频偏矫正算法框图

精频偏矫正是在粗频偏矫正的基础上进行;
精频偏矫正的输入数据是由粗频偏矫正的输出数据给过来;
做频偏矫正只能取相关峰的值,才能计算出来前后两个长训练序列之间的相位差;
没有频偏的情况下,相位变化量应该是不变的;
计算出来的相位差就能够和频率进行相关联;
延迟96sample目的:在相关峰之后,对齐LT1;
对齐之后会进行精频偏矫正,就会经过上面算法框图的过程,进行延迟64拍、取共轭,一直到最后;

设计思想
- 将对齐⭕️ 的信号进行延拍16个采样,保证计算完频偏后可以对此序列 进行补偿频偏。从上图可以看到在第二个搜索长训练序列的相关峰之后才会 有频偏矫正的相关峰,所以计算频偏估计值一定是在⭕️ 信号产生之后 的,所以对之前已经输出的 ⭕️信号无法补偿频偏。因此延迟16采样。
- 延迟64采样来进行与第二个LT进行相关,会出现32个采样的相关峰值(LT1/2)。需要在相关峰出现的阶段进行取相关之后的复数值进行做频偏估计。
- 采集相关峰值用于频偏矫正,选取位置为第二个搜索长训练序列的相关峰之后的第8个采样点位置取频偏矫正的相关峰值。Second_peak_delay_8s 位置。
实现步骤:
- 先对粗频偏矫正后的数据进行64拍的延时,然后是取共轭,(取共轭是对𝑆𝑚+64取,所以后面计算出来的相位旋转量是与实际方向相反的),进行复数乘法运算(取完共轭后的数据与粗频偏矫正后的数据,需要考虑延时打拍),进行累加平滑;同之前的粗频偏矫正模块;
- 进行cordic IP 计算弧度(alpha),再计算每个采样点的相位递增量(alpha/(64*2*pi)),定点数的计算:1/(64*2*pi) = 2^29*(1/(64*2*pi);格式是 fix32_29;将除法变为乘法运算,得到的数据格式为 fix64_58;所以取值如下:
angle_out_div64x2pi = {mult_out[63],mult_out[59:58],mult_out[57:29]};
- 1 计算频率控制字,freq_ctrl =(angle_out_div64x2pi/2^29)*2^32;即
freq_ctrl <= {angle_out_div64x2pi[28:0],3'b000};
因为计算出来的相位旋转量是与实际方向相反,所以利用减法运算改变方向,得到与实际方向相同的相位旋转量,送入DDS,计算相位旋转量;
- 2 最后通过乘法器,将粗频偏矫正后的数据与DDS 输出的相位累加结果进行相乘,对长训练序列进行频偏补偿,最后就得到了精频偏补偿后的时序数据。
频偏量计算:频率控制字 / 2^32 * 20e6
精度频偏补偿能补偿到 10hz 以内;
频偏矫正完成后就到了OFDM符号,就需要到频域进行处理,需要用长训练序列进行信道估计(信道增益情况,用来恢复后面的数据位);