检测到数据包后,下一步是精确确定每个OFDM符号的起始位置。在802.11中,每个OFDM符号的长度为4μs。在20 MSPS采样率下,这意味着每个OFDM符号包含80个样本。任务是将传入的样本流分组为80个样本OFDM符号。这可以通过在短序列之后使用长序列来实现。
802.11 OFDM数据包结构
如上图所示,长前导码持续时间为8μs(160个样本),包含两个相同的长训练序列(LTS),每个样本64个。LTS是已知的,我们可以使用互相关来找到它。样本i的交叉验证分数可以计算如下。
其中H是时域中已知的64个样本LTS,可以在802.11-2012标准的表L-6中找到(索引96至159)。可以在此处找到一个可读取的LTS文件(64个样本),如下所示:
图1.长前导码和互相关结果
图10显示了长前导序列样本以及互相关的结果。我们可以清楚地看到长前导码中对应于两个LTS的两个峰值。而峰值宽度仅为1个样本,正好显示了每个序列的开始。假设样本索引,如果第一个峰值为N,那么160个样本长前导码从样本N−32开始,此处的32是GI长度1.6us。
对于每个样本,我们需要执行64次复数乘法,这将消耗大量FPGA资源。因此,我们需要减少交叉验证的规模。这个想法是只使用一部分而不是所有的LTS样本。
图2不同大小的互相关(8, 16, 32, 64)
上图显示了长前导码(160个样本)以及不同大小的交叉验证。可以看出,使用前16个LTS样本足以显示两个窄峰值。因此,OpenOFDM使用LTS前16个样本的互相关进行符号对齐。为了证实这一点,下图显示了实际数据包中前16个LTS样本的互相关。这两个尖峰不像图1中的那样明显,但仍然清晰可见。
使用LTS前16个样本进行交叉验证
为了找到这两个峰值,我们记录了前64个样本的最大相关样本(因为第一个峰值应该位于第32个样本)。同样,我们还记录了第二个64个样本的最大相关样本。为了进一步消除假阳性,我们还检查两个峰值样本指数是否相隔64±1。
FFT
现在我们已经找到了每个OFDM符号的开头,下一个任务是对每个符号内的最后64个数据样本(长度为3.2us的DATA)执行FFT。为此,我们使用了Xilinx ISE生成的XFFT内核。根据是否使用短保护间隔(SGI),需要跳过每个OFDM符号的前16或8个采样(GI长度0.8us)。
但在执行FFT之前,我们需要首先应用频率偏移校正(请参见频率偏移校正)。这是通过旋转模块实现的(请参见旋转)。
Rotate.v 在FFT之前根据sync_short的相位偏移实现相位旋转的功能
要将复数C=I+jQ旋转θ度,我们可以将其乘以e^jθ,如下所示:
同样,这本可以使用CORDIC算法完成。但我们在此与相位估计类似,使用查找表
I/Q平面中的象限、
如上图所示,我们将I/Q平面分成8个象限,每个象限为π/4。为了避免在表中存储几乎重复的条目,我们首先映射要旋转的阶段([−π、 π])进入[0,π/4]范围。接下来,由于传入阶段被放大512,每个象限被进一步分割成402 int(π/4∗512)。并且cos(θ)和sin(θ)值(按比例放大2048)存储在查找表中