原创:转载请附链接
短、长训练序列作用:
接收到的数据经过粗定时,采样时钟调整,帧到达检测,帧定时,载波同步后得到同步后的数据。
帧到达检测,是基于短训练字的能量检测算法。判决时要计算数据前后相关和自相关的值。
帧定时,是基于长训练字的能量检测算法,用于确定数据的准确位置。
帧定时要在帧到达检测的基础上才能完成。先使用一系列短训练字进行帧到达检测,再用长训练字进行帧定时是为了能够准确确定FFT窗口的起始位置。
4.1 训练序列的生成
4.1.1短期训练序列结构
4.1.2长期训练序列结构
4.1.3训练序列的生成方法
4.1.4 训练序列生成模块的实现
由仿真图形可以看出,从225ns-8228ns共8000ns,以25ns为一周期,共产生16组数据,其中,第一个数据和第二个数据进行了加窗处理,仿真结果上显示为数据右移了一位,最后一个数据和下一组数据的第一位,合并,组成一个采样点。
注:第一个数据:由原00001100(0.046)变为00000110(0.23)进行了加窗处理
第161数据:00000110(0.23)以便与下一帧的第一个数据相加,作为一个采样点
matlab:
function LeaderSequence = LS( )
%传输接收机已知的伪随机序列(QPSK符号)
S=[0,0,1+i,0,0,0,-1-i,0,0,0,1+i,0,0,0,-1-i,0,0,0,-1-i,0,0,0,1+i,0,0,0,0,0,0,-1-i,0,0,0,-1-i,0,0,0,1+i,0,0,0,1+i,0,0,0,1+i,0,0,0,1+i,0,0];
L=[1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1];
%保证OFDM符号的功率值稳定
S=(13/6)^(1/2)*S;
%64点的傅里叶逆变换,变成时域
short=ifft(S,64);
short_cp=short(1:16);
short=short_cp;
%产生160个数据
for f=1:9
short=[short,short_cp];
end
short_str = short;
%长训练序列产生
long = ifft(L,64);
%后32个数据
long1 = long(33:64);
long2 = long(1:64);
long_str = [long1,long2,long2];
preamble = [short_str,long_str];
%对第一个和最后一个加窗处理,硬件上表现右移一位
%第161个数据
preamble(:,161) = preamble(:,161)*0.5 + preamble(:,1)*0.5;
%第一个数据
preamble(:,1) = preamble(:,1)*0.5;
%短+长
LeaderSequence = preamble;
end
transmitter\short_training:
module SHORT_generator(RESET,FFT_CLK,SHORT_ACK,SHORT_RE,SHORT_IM,SHORT_INDEX,SHORT_DV);
input RESET;
input FFT_CLK;
input SHORT_ACK;
output [7:0] SHORT_RE;
output [7:0] SHORT_IM;
output [7:0] SHORT_INDEX;
output SHORT_DV;
reg [7:0] SHORT_RE;
reg [7:0] SHORT_IM;
reg [7:0] SHORT_INDEX;
reg SHORT_DV;
reg[3:0] i;
reg[3:0] j;
reg [7:0] shortrom_re [15:0];
reg [7:0] shortrom_im [15:0];
always @ (negedge RESET or posedge FFT_CLK) //registers initial
if (!RESET)
begin
i=0;
j=0;
SHORT_RE=0;
SHORT_IM=0;
SHORT_INDEX=0;
SHORT_DV=0;
// 短训序列经过 IFFT,单个周期被周期扩展为161个采样点
// 输出实现:第一个+最后一个凑成一个采样点,然后16个样值循环10次
// 根据IEEE标准数据等比例调整,样值数据格式为:
//【符号位】+ 【1】 + 【2】 + 【3】 + 【4】 + 【5】 + 【6】 + 【7】
// (+/-) + 2^(-2)+ 2^(-3)+ 2^(-4)+ 2^(-5)+ 2^(-6)+ 2^(-7)+ 2^(-8)
shortrom_re[0]=8'b00001100;//0.046
shortrom_re[1]=8'b11011110;//-0.132
shortrom_re[2]=8'b11111101;// -0.013
shortrom_re[3]=8'b00100100;
shortrom_re[4]=8'b00011000;
shortrom_re[5]=8'b00100100;
shortrom_re[6]=8'b11111101;
shortrom_re[7]=8'b11011110;
shortrom_re[8]=8'b00001100;
shortrom_re[9]=8'b00000001;
shortrom_re[10]=8'b11101100;
shortrom_re[11]=8'b11111101;
shortrom_re[12]=8'b00000000;
shortrom_re[13]=8'b11111101;
shortrom_re[14]=8'b11101100;
shortrom_re[15]=8'b00000001;
shortrom_im[0]=8'b00001100;
shortrom_im[1]=8'b00000001;
shortrom_im[2]=8'b11101100;
shortrom_im[3]=8'b11111101;
shortrom_im[4]=8'b00000000;
shortrom_im[5]=8'b11111101;
shortrom_im[6]=8'b11101100;
shortrom_im[7]=8'b00000001;
shortrom_im[8]=8'b00001100;
shortrom_im[9]=8'b11011110;
shortrom_im[10]=8'b11111101;
shortrom_im[11]=8'b00100100;
shortrom_im[12]=8'b00011000;
shortrom_im[13]=8'b00100100;
shortrom_im[14]=8'b11111101;
shortrom_im[15]=8'b11011110;
end
//************************************
else
begin
if (SHORT_ACK)
if (i<=9)
if(j<15)
begin
SHORT_RE=shortrom_re[j];
SHORT_IM=shortrom_im[j];
SHORT_DV=1;
if(i==0&j==0) //multiplied by the window function
begin
SHORT_RE=SHORT_RE>>1;
SHORT_IM=SHORT_IM>>1;
end
j=j+1;
SHORT_INDEX=SHORT_INDEX+1;
end
else
begin
SHORT_RE=shortrom_re[j];
SHORT_IM=shortrom_im[j];
SHORT_INDEX=SHORT_INDEX+1;
SHORT_DV=1;
j=0;
i=i+1;
end
else
begin
i=0;
SHORT_RE=shortrom_re[j]>>1; //multiplied by the window function
SHORT_IM=shortrom_im[j]>>1;
SHORT_INDEX=SHORT_INDEX+1;
end
else
begin
i=0;
j=0;
SHORT_RE=0;
SHORT_IM=0;
SHORT_INDEX=0;
SHORT_DV=0;
end
end
endmodule
transmitter\long_training:
module LONG_generator(RESET,FFT_CLK,LONG_ACK,LONG_RE,LONG_IM,LONG_INDEX,LONG_DV);
input RESET;
input FFT_CLK;
input LONG_ACK;
output [7:0] LONG_RE;
output [7:0] LONG_IM;
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];
reg [7:0] longrom_im [63:0];
always @ (negedge RESET or posedge FFT_CLK) //registers initialize
if (!RESET)
begin
i=0;
j=0;
LONG_RE=0;
LONG_IM=0;
LONG_INDEX=0;
LONG_DV=0;
longrom_re[0]=8'b00101000;
longrom_re[1]=8'b11111111;
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;
longrom_re[32]=8'b11011000;
longrom_re[33]=8'b00000011;
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;
longrom_im[0]=8'b00000000;
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;
longrom_im[32]=8'b00000000;
longrom_im[33]=8'b11100111;
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;
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];
LONG_IM=longrom_im[j+32];
LONG_DV=1;
if (i==0&j==0)
begin //multiplied by the window function
LONG_RE=8'b11101100;
end
j=j+1;
end
else
begin
LONG_RE=longrom_re[j+32];
LONG_IM=longrom_im[j+32];
LONG_DV=1;
j=0;
i=i+1;
end
else if (i>0&i<=2)
if (j<63)
begin
LONG_RE=longrom_re[j];
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; //multiplied by the window function
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