4.2 长训练序列的生成

4.2 长训练序列的生成

 从时域上来看,帧结构在短训练序列之后是长训练序列,其长度为8us,其中包括二个有效OFDM符号的长度(每个3.2us)和一个长型保护间隔的长度(1.6us)。

        长训练序列主要用于精确的频率偏差估计和信道估计。从频域来看,场训练序列符号与政策OFDM符号一样由53(包括直流处一个取“0”值的空符号)个子载波组成,分别占据从-26~26的子信道。

        为了简化接收端的信道估计运算,传输的数据是BPSK调制的,即:

    4.2 长训练序列的生成 - fantasy - 悠然见南山


在IEEE 802.11a标准中,也有对应的规定,参考【GB 15629.1101-2006 第11部分 无线局域网媒体访问控制和物理层规范.pdf】,我国版本的无线局域网物理层规范标准。

4.2 长训练序列的生成 - fantasy - 悠然见南山

            长训练序列的时域表,161个。

4.2 长训练序列的生成 - fantasy - 悠然见南山

4.2 长训练序列的生成 - fantasy - 悠然见南山


verilog产生长训练序列:



 

`timescale 1ns / 10ps
//////////////////////////////////////////////////////////////////////////////////
// Create Date: 15:42:23 09/28/2014
// Design Name: training
// Module Name: long_training_gen
// Project Name: OFDM base on Xilinx KC705
// Description: OFDM 长训练序列生成模块,符合IEEE 802.11a 标准。
// 硬件平台上系统内所有复数类型的信号统一规定用8位有符号二进制形式(8-bit Signed Binary)。
// 因为长训码是标准定义好的确定性数据,所以直接将数据进行IFFT和加窗处理后存入ROM中,直接调用输出即可。
// Revision: 1.0
// Copyright: 《基于xlinx FPGA的OFDM通信系统基带设计》
//////////////////////////////////////////////////////////////////////////////////

module long_training_gen (RESET, FFT_CLK, LONG_ACK, LONG_RE, LONG_IM, LONG_INDEX, LONG_DV);

input RESET; // 低电平异步复位
input FFT_CLK; // 20M sys_clk
input LONG_ACK; // MCU送来的控制信号,模块使能
output [7:0] LONG_RE; // 长训练序列实部, 已参照IFFT模块的设置进行了等比例调整,与整个OFDM数据帧的其他部分相匹配。
output [7:0] LONG_IM; // 长训练序列虚部,已参照IFFT模块的设置进行了等比例调整,与整个OFDM数据帧的其他部分相匹配。
output [7:0] LONG_INDEX; // 长训练序列的序号
output LONG_DV; // 输出数据有效信号

reg [7:0] LONG_RE;
reg [7:0] LONG_IM;
reg [7:0] LONG_INDEX;
reg LONG_DV;
reg [1:0] i;
reg [5:0] j;
reg [7:0] longrom_re [63:0]; // ROM 矩阵
reg [7:0] longrom_im [63:0];

always @ (posedge FFT_CLK or negedge RESET) // ROM 初始化
if (!RESET)
begin
i <= 0;
j <= 0;
LONG_RE <= 0;
LONG_IM <= 0;
LONG_INDEX <= 0;
LONG_DV <= 0;
// 长训序列经过 IFFT,单个周期被周期扩展为161个采样点
// 输出实现:先输出32CP(64样值中的后32个),然后将64个rom输出二遍。
// 根据IEEE标准数据等比例调整,样值数据格式为:
//【符号位】+ 【1】 + 【2】 + 【3】 + 【4】 + 【5】 + 【6】 + 【7】
// (+/-) + 2^(-2)+ 2^(-3)+ 2^(-4)+ 2^(-5)+ 2^(-6)+ 2^(-7)+ 2^(-8)
longrom_re[0] <= 8'b00101000; // 0.156 对应IEEE标准表的 【32】
longrom_re[1] <= 8'b11111111; //-0.005
longrom_re[2] <= 8'b00001010;
longrom_re[3] <= 8'b00011001;
longrom_re[4] <= 8'b00000101;
longrom_re[5] <= 8'b00001111;
longrom_re[6] <= 8'b11100011;
longrom_re[7] <= 8'b11110110;
longrom_re[8] <= 8'b00011001;
longrom_re[9] <= 8'b00001110;
longrom_re[10]<= 8'b00000000;
longrom_re[11]<= 8'b11011101;
longrom_re[12]<= 8'b00000110;
longrom_re[13]<= 8'b00001111;
longrom_re[14]<= 8'b11111010;
longrom_re[15]<= 8'b00011111;
longrom_re[16]<= 8'b00010000;
longrom_re[17]<= 8'b00001001;
longrom_re[18]<= 8'b11110001;
longrom_re[19]<= 8'b11011110;
longrom_re[20]<= 8'b00010101;
longrom_re[21]<= 8'b00010010;
longrom_re[22]<= 8'b11110001;
longrom_re[23]<= 8'b11110010;
longrom_re[24]<= 8'b11110111;
longrom_re[25]<= 8'b11100001;
longrom_re[26]<= 8'b11011111;
longrom_re[27]<= 8'b00010011;
longrom_re[28]<= 8'b11111111;
longrom_re[29]<= 8'b11101000;
longrom_re[30]<= 8'b00010111;
longrom_re[31]<= 8'b00000011; // 0.012 对应IEEE标准表的 【63】
longrom_re[32]<= 8'b11011000; //-0.156 对应IEEE标准表的 【64】
longrom_re[33]<= 8'b00000011; // 0.012 对应IEEE标准表的 【65】 【1】
longrom_re[34]<= 8'b00010111;
longrom_re[35]<= 8'b11101000;
longrom_re[36]<= 8'b11111111;
longrom_re[37]<= 8'b00010011;
longrom_re[38]<= 8'b11011111;
longrom_re[39]<= 8'b11100001;
longrom_re[40]<= 8'b11110111;
longrom_re[41]<= 8'b11110010;
longrom_re[42]<= 8'b11110001;
longrom_re[43]<= 8'b00010010;
longrom_re[44]<= 8'b00010101;
longrom_re[45]<= 8'b11011110;
longrom_re[46]<= 8'b11110001;
longrom_re[47]<= 8'b00001001;
longrom_re[48]<= 8'b00010000;
longrom_re[49]<= 8'b00011111;
longrom_re[50]<= 8'b11111010;
longrom_re[51]<= 8'b00001111;
longrom_re[52]<= 8'b00000110;
longrom_re[53]<= 8'b11011101;
longrom_re[54]<= 8'b00000000;
longrom_re[55]<= 8'b00001110;
longrom_re[56]<= 8'b00011001;
longrom_re[57]<= 8'b11110110;
longrom_re[58]<= 8'b11100011;
longrom_re[59]<= 8'b00001111;
longrom_re[60]<= 8'b00000101;
longrom_re[61]<= 8'b00011001;
longrom_re[62]<= 8'b00001010;
longrom_re[63]<= 8'b11111111; //-0.005 对应IEEE标准表的 【95】

longrom_im[0] <= 8'b00000000; // 0.000 对应IEEE标准表的 【32】
longrom_im[1] <= 8'b11100001;
longrom_im[2] <= 8'b11100100;
longrom_im[3] <= 8'b00010101;
longrom_im[4] <= 8'b00000111;
longrom_im[5] <= 8'b11101010;
longrom_im[6] <= 8'b11110010;
longrom_im[7] <= 8'b11100101;
longrom_im[8] <= 8'b11111001;
longrom_im[9] <= 8'b00000001;
longrom_im[10]<= 8'b11100011;
longrom_im[11]<= 8'b11110100;
longrom_im[12]<= 8'b11110001;
longrom_im[13]<= 8'b11111100;
longrom_im[14]<= 8'b00101001;
longrom_im[15]<= 8'b11111111;
longrom_im[16]<= 8'b11110000;
longrom_im[17]<= 8'b00011001;
longrom_im[18]<= 8'b00001010;
longrom_im[19]<= 8'b00010001;
longrom_im[20]<= 8'b00011000;
longrom_im[21]<= 8'b00000100;
longrom_im[22]<= 8'b00010101;
longrom_im[23]<= 8'b11111010;
longrom_im[24]<= 8'b11011001;
longrom_im[25]<= 8'b11111100;
longrom_im[26]<= 8'b11111011;
longrom_im[27]<= 8'b11101101;
longrom_im[28]<= 8'b00001110;
longrom_im[29]<= 8'b00011101;
longrom_im[30]<= 8'b00011011;
longrom_im[31]<= 8'b00011001; // 0.098 对应IEEE标准表的 【63】
longrom_im[32]<= 8'b00000000; // 0.000 对应IEEE标准表的 【64】
longrom_im[33]<= 8'b11100111; //-0.098 对应IEEE标准表的 【65】 【1】
longrom_im[34]<= 8'b11100101;
longrom_im[35]<= 8'b11100011;
longrom_im[36]<= 8'b11110010;
longrom_im[37]<= 8'b00010011;
longrom_im[38]<= 8'b00000101;
longrom_im[39]<= 8'b00000100;
longrom_im[40]<= 8'b00100111;
longrom_im[41]<= 8'b00000110;
longrom_im[42]<= 8'b11101011;
longrom_im[43]<= 8'b11111100;
longrom_im[44]<= 8'b11101000;
longrom_im[45]<= 8'b11101111;
longrom_im[46]<= 8'b11110110;
longrom_im[47]<= 8'b11100111;
longrom_im[48]<= 8'b00010000;
longrom_im[49]<= 8'b00000001;
longrom_im[50]<= 8'b11010111;
longrom_im[51]<= 8'b00000100;
longrom_im[52]<= 8'b00001111;
longrom_im[53]<= 8'b00001100;
longrom_im[54]<= 8'b00011101;
longrom_im[55]<= 8'b11111111;
longrom_im[56]<= 8'b00000111;
longrom_im[57]<= 8'b00011011;
longrom_im[58]<= 8'b00001110;
longrom_im[59]<= 8'b00010110;
longrom_im[60]<= 8'b11111001;
longrom_im[61]<= 8'b11101011;
longrom_im[62]<= 8'b00011100;
longrom_im[63]<= 8'b00011111; // 0.120 对应IEEE标准表的 【95】

end

//************************************
else begin
if (LONG_ACK)
begin
LONG_INDEX <= LONG_INDEX + 1;
//Add cyclic guard//
if (i==0)
if (j<31)
begin
LONG_RE <= longrom_re[j+32]; // CP
LONG_IM <= longrom_im[j+32];
LONG_DV <= 1;
if (i==0 & j==0)
begin // multiplied by the window function
LONG_RE <= 8'b11101100; // -0.078
end
j <= j + 1;
end
else begin // 表示i=0,j=31的时候,输出值。也就是前32CP样值的最后一个
LONG_RE <= longrom_re[j+32];
LONG_IM <= longrom_im[j+32];
LONG_DV <= 1;
j <= 0; // 然后j值清零
i <= i + 1; // i + 1 = 1,即开始输出第一轮重复循环样值
end
else if (i>0 & i<=2)
if (j<63)
begin
LONG_RE <= longrom_re[j]; // 此时i = 1、2, j从0开始,也就是第一、二轮重复循环样值的输出
LONG_IM <= longrom_im[j];
LONG_DV <= 1;
j <= j + 1;
end
else begin
LONG_RE <= longrom_re[j];
LONG_IM <= longrom_im[j];
LONG_DV <= 1;
j <= 0;
i <= i + 1;
end
else
begin
i <= 0;
LONG_RE <= longrom_re[j] >> 1; // 加窗处理,输出第161个数,此时i被清零,j=0 ,输出值为0.156/2 = 0.078
LONG_IM <= longrom_im[j] >> 1;
end
end
else
begin
i <= 0;
j <= 0;
LONG_RE <= 0;
LONG_IM <= 0;
LONG_INDEX <= 0;
LONG_DV <= 0;
end

end

endmodule

猜你喜欢

转载自blog.csdn.net/weixin_40640020/article/details/83344998
4.2