第四章 OFDM发射机设计与实现之长短序列产生

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40640020/article/details/84027677

 原创:转载请附链接

短、长训练序列作用:

接收到的数据经过粗定时,采样时钟调整,帧到达检测,帧定时,载波同步后得到同步后的数据。
帧到达检测,是基于短训练字的能量检测算法。判决时要计算数据前后相关和自相关的值。
帧定时,是基于长训练字的能量检测算法,用于确定数据的准确位置。
帧定时要在帧到达检测的基础上才能完成。先使用一系列短训练字进行帧到达检测,再用长训练字进行帧定时是为了能够准确确定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

 

展开阅读全文

没有更多推荐了,返回首页