4.4.2 载波同步(二)

4.4.2 载波同步(二)

基本上 《XILINX FPGA的OFDM通信系统基带设计》一书已经带有各部分的代码,我做的工作就是将代码整合到一起,并按照仿真修改,让其能正常工作。本文将对实现中的重点部分做解释,并指出需要修改的地方。

 

1、数据分流模块

    在经过 【分组检测】 模块后的数据,包括1个不完整的短训练符号(长度<16)、9个完整的短训练符号(9*16)、2个长训练符号(32+2*64)和数据符号。(第一个短训练符号不完整是因为前面分组检测是用其数据相关累加和来判定分组阈值的)

4.4.2 载波同步(二)

 

 

短训练符号输出:

 

if((1<=dataindex)&&(dataindex<=160))
begin
//1 <= dataindex <= 160
//已经超出短训练序列部分,因为短训经过分组同步后只有9个了
//虽然包含了部分长训练序列(<16),对结果影响不大
//但为能够全部进入长训练序列,故输出160个
shorttrainingoutenable <= 1'b1;
shorttrainingoutre <= tempdatainre;
shorttrainingoutim <= tempdatainim;
end
else
begin
//dataindex > 160
//超出短训练序列部分,短训练序列数据输出无效
shorttrainingoutenable <= 1'b0;
shorttrainingoutre <= 8'b00000000;
shorttrainingoutim <= 8'b00000000;
end

6个短训练符号,用于做频偏计算:

 

if ((1<=dataindex)&&(dataindex<=96))
begin//1<=dataindex<=6*16 用6个短训练序列做4次粗频偏校正
estimationoutenable <= 1'b1;
estimationoutre <= tempdatainre;
estimationoutim <= tempdatainim;
end
else //dataindex>=6*16 超出6个短训练序列
begin
estimationoutenable <= 1'b0;
estimationoutre <= 8'b00000000;
estimationoutim <= 8'b00000000;
end

 

2、载波频偏估计模块

基本框图:

4.4.2 载波同步(二)

 

前面有提到,明明是5组短训练符号,做4次频偏计算,为什么输入了6个短训练符号?

因为在进行延迟相关计(Delay Correlation Computing)的移位时,丢掉了一组数据,如下代码:

4.4.2 载波同步(二)

 仿真后的结果:

4.4.2 载波同步(二)

经过移位寄存器后,在bufferenable的作用下,移位寄存器输出少了1组数据,也就是丢掉了6组STS的最后一组,所以计算的时候还是5组STS计算,产生4次频偏估计值。

 

那为什么5组STS,只有4次相关值计算呢?

因为在 cfo_correlation 的计算中,通过L=16的移位寄存器时,又丢掉了一组数据:

4.4.2 载波同步(二)

 

注意:在选取4组相关值时,选取的dataindex有修改(和书上代码有出入):

4.4.2 载波同步(二)

重点看 dataindex 的取值,相对于书上,每个减去16 。

 

最后进行频偏估算,也就是求 arctan ,用的是xilinx的cordic ip核,在求完 4次 角度后,需要进行累加求平均值,我们是4组相关之取平均,在硬件上除以4,直接就是右移2位了(现在知道为什么要5组训练符号了吧)。

这部分有一个很重要的地方,书给的代码需要修改的,在 estimation_phase 模块中,cordic核部分要修改:

4.4.2 载波同步(二)

  对于 cordic 核,简单点说,即使没有频偏,tempphaseout的值也不会是0(就意味系统认为有频偏),这样会影响后面的计算。

这应该是关于 cordic 计算的一个 精度问题。