OFDM学习-(二)长短序列和PPDU团体数据处置惩罚流程

打印 上一主题 下一主题

主题 972|帖子 972|积分 2916

OFDM学习


  

媒介

根据框图可以知道发射机这部门信号在DA转换之前,数据是两路,分别是实部和虚部8位信号。通过DA转换也是两路模拟信号,通过IQ调制搞到射频。
PPDU包罗3部门数据,长短序列是不须要举行ofdm操作的,signal和data的信号须要举行ofdm操作,也就是下面图中扰码、卷积编码、交错等等的操作,最后通过ifft和cp加窗后举行输出,最后将实部信号与虚部信号与训练序列的实部和虚部按照位置分别发送。

一、短序列

子载波有效数量是52个,短序列只用到了其中的12个子载波,每个载波之间的隔断为4,位置序号是:
{-24,-20,-16,-12,-8,-4, 4,8,12,16,20,24},直流分量不能使用。又因为短序列采用的是BPSK模式,因此可以通过载波位置以及调制方式决定他的数据格式。确定[9:0] STS_IM[8] 和[9:0] STS_RE[8],就实现了短序列的产生,按照位置依次将实部序列和虚部序列信号发送即可。
因此短序列在频域上就是
% STS频域表现
S=[0,0,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,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,0,0,0,0,0];
但是最终须要发出去的是时域信号,以是这个频域信号理论上是要经过ifft模块处置惩罚之后发送出去,但是因为短序列都是固定的数值,因此时序信号的实部和虚部也是固定的,以是短训练序列的产生也就是通过MATLAB将频域转换为时域后,将固定的时域信号的实部值和虚部值直接使用。短训练序列的数据格式,1位符号位,1位整数位,6位小数位。
从时域上看,每一个短序列是16个采样点,也就是总共10*16=160点。
短序列的作用

吸收机举行分组检测、同步等
二、长序列

类似短序列,根本原理相同,各自作用不同。
三、PLCP/SIGNAL/DATA数据处置惩罚流程

训练序列直接按照时域产生实部信号和虚部信号,不须要举行ofdm调制。
SIGNAL信号和DATA信号须要从单比特流数据经过扰码、卷积编码、交错、符号调制、16QAM调制、导频插入、IFFT模块、CP加窗等步调最后与训练序列组合发送到DAC举行射频端的处置惩罚。
三、fpga实现

STS模块

  1. `timescale 1ns / 1ps
  2. ///
  3. // Company:                                                                     
  4. // Engineer: YWang                                                                    
  5. //                                                                                   
  6. // Create Date: 2023-03-10  14:53:45
  7. // Design Name:                                                                    
  8. // Module Name: STS_generator.v                                                         
  9. // Project Name:                                                                  
  10. // Target Devices:                                                                  
  11. // Tool versions:                                                                  
  12. // Description:                                                                  
  13. //                                                                                 
  14. // Dependencies: 0                                                                  
  15. //                                                                                 
  16. // Revision:                                                                    
  17. // Revision 0.01 - File Created                                                     
  18. // Additional Comments:                                                        
  19. //                                                                                   
  20. ///
  21. module   STS_generator(  
  22.     input                   clk         ,   
  23.     input                   rst_n       ,   
  24.     input                   Tx_Clr      ,   
  25.     input                   Start_En    ,
  26.     output reg [7:0]        STS_Im      ,
  27.     output reg [7:0]        STS_Re      ,
  28.     output reg              STS_Vld     ,
  29.     output reg [7:0]        STS_Index   ,
  30.     output reg              STS_Done            
  31. );                 
  32.     reg  [15:0] Short_Mem [15:0];
  33.     reg  [3:0]  i,j;
  34.     wire        STS_Req;
  35.     assign STS_Req = Start_En || (STS_Index>0);
  36.     always @(posedge clk or negedge rst_n) begin
  37.         if(~rst_n) begin  
  38.             Short_Mem[0]  <= {8'b00001100,8'b00001100};
  39.             Short_Mem[1]  <= {8'b11011110,8'b00000001};
  40.             Short_Mem[2]  <= {8'b11111101,8'b11101100};
  41.             Short_Mem[3]  <= {8'b00100100,8'b11111101};
  42.             Short_Mem[4]  <= {8'b00011000,8'b00000000};
  43.             Short_Mem[5]  <= {8'b00100100,8'b11111101};
  44.             Short_Mem[6]  <= {8'b11111101,8'b11101100};
  45.             Short_Mem[7]  <= {8'b11011110,8'b00000001};
  46.             Short_Mem[8]  <= {8'b00001100,8'b00001100};
  47.             Short_Mem[9]  <= {8'b00000001,8'b11011110};
  48.             Short_Mem[10] <= {8'b11101100,8'b11111101};
  49.             Short_Mem[11] <= {8'b11111101,8'b00100100};
  50.             Short_Mem[12] <= {8'b00000000,8'b00011000};
  51.             Short_Mem[13] <= {8'b11111101,8'b00100100};
  52.             Short_Mem[14] <= {8'b11101100,8'b11111101};
  53.             Short_Mem[15] <= {8'b00000001,8'b11011110};
  54.             STS_Vld <= 0;
  55.             STS_Index <=  0;
  56.             STS_Done <= 0;
  57.             STS_Re <= 0;
  58.             STS_Im <= 0;
  59.             i <= 0;
  60.             j <= 0;
  61.            end  
  62.         else if( Tx_Clr  ) begin
  63.             i <= 0;
  64.             j <= 0;
  65.             STS_Vld <= 0;
  66.             STS_Index <= 0;
  67.             STS_Done <= 0;
  68.         end
  69.         else if( STS_Req && (STS_Index<161) ) begin
  70.             STS_Index <= STS_Index + 1;
  71.             STS_Vld <=  1'b1;
  72.             if(i<10)    begin
  73.                 if(j==15) begin
  74.                     j <= 0;
  75.                     i <= i+ 1;
  76.                     STS_Re <= Short_Mem[j][15:8];  
  77.                     STS_Im <= Short_Mem[j][7:0];
  78.                 end
  79.                 else  begin
  80.                     if(i==0 && j==0) begin
  81.                         STS_Re <= Short_Mem[j][15:8]>>1; //鍔犵獥锛屽乏绉讳竴
  82.                         STS_Im <= Short_Mem[j][7:0]>>1;//娉ㄦ剰锛歋hort_Mem銆�0銆戜负姝f暟
  83.                     end
  84.                     else begin
  85.                         STS_Re <= Short_Mem[j][15:8];  
  86.                         STS_Im <= Short_Mem[j][7:0];
  87.                     end
  88.                     j <= j + 1;
  89.                 end
  90.             end
  91.             else begin  //鏈�鍚庝竴浣�
  92.                 STS_Re <= Short_Mem[0][15:8]>>1; //鍔犵獥锛屽乏绉讳竴  绗竴涓��
  93.                 STS_Im <= Short_Mem[0][7:0]>>1;
  94.                 STS_Done <= 1'b1;
  95.             end
  96.         end
  97.         else begin
  98.             STS_Vld <= 1'b0;
  99.         end
  100.     end
  101.                   
  102. endmodule         
复制代码
LTS模块

  1. `timescale 1ns / 1ps
  2. ///
  3. // Company:                                                                     
  4. // Engineer: YWang                                                                    
  5. //                                                                                   
  6. // Create Date: 2023-03-10  14:53:45
  7. // Design Name:                                                                    
  8. // Module Name: LTS_generator.v                                                         
  9. // Project Name:                                                                  
  10. // Target Devices:                                                                  
  11. // Tool versions:                                                                  
  12. // Description:                                                                  
  13. //                                                                                 
  14. // Dependencies: 0                                                                  
  15. //                                                                                 
  16. // Revision:                                                                    
  17. // Revision 0.01 - File Created                                                     
  18. // Additional Comments:                                                        
  19. //                                                                                   
  20. ///
  21. module   LTS_generator(  
  22.     input                   clk         ,   
  23.     input                   rst_n       ,   
  24.     input                   Tx_Clr      ,   
  25.     input                   Start_En    ,
  26.     output reg [7:0]        LTS_Im      ,
  27.     output reg [7:0]        LTS_Re      ,
  28.     output reg              LTS_Vld     ,
  29.     output reg [7:0]        LTS_Index   ,
  30.     output reg              LTS_Done            
  31. );                 
  32.     reg  [15:0] Long_Mem [63:0];
  33.     reg  [6:0]  i,j;
  34.     wire        LTS_Req;
  35.     assign LTS_Req = Start_En || (LTS_Index>0);
  36.     always @(posedge clk or negedge rst_n) begin
  37.         if(~rst_n) begin  //鏃跺煙鏍峰�� Re      Im
  38.             Long_Mem[0]  <= {8'b00101000 , 8'b00000000};
  39.                 Long_Mem[1]  <= {8'b11111111 , 8'b11100001};
  40.                 Long_Mem[2]  <= {8'b00001010 , 8'b11100100};
  41.                 Long_Mem[3]  <= {8'b00011001 , 8'b00010101};
  42.                 Long_Mem[4]  <= {8'b00000101 , 8'b00000111};
  43.                 Long_Mem[5]  <= {8'b00001111 , 8'b11101010};
  44.                 Long_Mem[6]  <= {8'b11100011 , 8'b11110010};
  45.                 Long_Mem[7]  <= {8'b11110110 , 8'b11100101};
  46.                 Long_Mem[8]  <= {8'b00011001 , 8'b11111001};
  47.                 Long_Mem[9]  <= {8'b00001110 , 8'b00000001};
  48.                 Long_Mem[10] <= {8'b00000000 , 8'b11100011};
  49.                 Long_Mem[11] <= {8'b11011101 , 8'b11110100};
  50.                 Long_Mem[12] <= {8'b00000110 , 8'b11110001};
  51.                 Long_Mem[13] <= {8'b00001111 , 8'b11111100};
  52.                 Long_Mem[14] <= {8'b11111010 , 8'b00101001};
  53.                 Long_Mem[15] <= {8'b00011111 , 8'b11111111};
  54.                 Long_Mem[16] <= {8'b00010000 , 8'b11110000};
  55.                 Long_Mem[17] <= {8'b00001001 , 8'b00011001};
  56.                 Long_Mem[18] <= {8'b11110001 , 8'b00001010};
  57.                 Long_Mem[19] <= {8'b11011110 , 8'b00010001};
  58.                 Long_Mem[20] <= {8'b00010101 , 8'b00011000};
  59.                 Long_Mem[21] <= {8'b00010010 , 8'b00000100};
  60.                 Long_Mem[22] <= {8'b11110001 , 8'b00010101};
  61.                 Long_Mem[23] <= {8'b11110010 , 8'b11111010};
  62.                 Long_Mem[24] <= {8'b11110111 , 8'b11011001};
  63.                 Long_Mem[25] <= {8'b11100001 , 8'b11111100};
  64.                 Long_Mem[26] <= {8'b11011111 , 8'b11111011};
  65.                 Long_Mem[27] <= {8'b00010011 , 8'b11101101};
  66.                 Long_Mem[28] <= {8'b11111111 , 8'b00001110};
  67.                 Long_Mem[29] <= {8'b11101000 , 8'b00011101};
  68.                 Long_Mem[30] <= {8'b00010111 , 8'b00011011};
  69.                 Long_Mem[31] <= {8'b00000011 , 8'b00011001};
  70.                 Long_Mem[32] <= {8'b11011000 , 8'b00000000};
  71.                 Long_Mem[33] <= {8'b00000011 , 8'b11100111};
  72.                 Long_Mem[34] <= {8'b00010111 , 8'b11100101};
  73.                 Long_Mem[35] <= {8'b11101000 , 8'b11100011};
  74.                 Long_Mem[36] <= {8'b11111111 , 8'b11110010};
  75.                 Long_Mem[37] <= {8'b00010011 , 8'b00010011};
  76.                 Long_Mem[38] <= {8'b11011111 , 8'b00000101};
  77.                 Long_Mem[39] <= {8'b11100001 , 8'b00000100};
  78.                 Long_Mem[40] <= {8'b11110111 , 8'b00100111};
  79.                 Long_Mem[41] <= {8'b11110010 , 8'b00000110};
  80.                 Long_Mem[42] <= {8'b11110001 , 8'b11101011};
  81.                 Long_Mem[43] <= {8'b00010010 , 8'b11111100};
  82.                 Long_Mem[44] <= {8'b00010101 , 8'b11101000};
  83.                 Long_Mem[45] <= {8'b11011110 , 8'b11101111};
  84.                 Long_Mem[46] <= {8'b11110001 , 8'b11110110};
  85.                 Long_Mem[47] <= {8'b00001001 , 8'b11100111};
  86.                 Long_Mem[48] <= {8'b00010000 , 8'b00010000};
  87.                 Long_Mem[49] <= {8'b00011111 , 8'b00000001};
  88.                 Long_Mem[50] <= {8'b11111010 , 8'b11010111};
  89.                 Long_Mem[51] <= {8'b00001111 , 8'b00000100};
  90.                 Long_Mem[52] <= {8'b00000110 , 8'b00001111};
  91.                 Long_Mem[53] <= {8'b11011101 , 8'b00001100};
  92.                 Long_Mem[54] <= {8'b00000000 , 8'b00011101};
  93.                 Long_Mem[55] <= {8'b00001110 , 8'b11111111};
  94.                 Long_Mem[56] <= {8'b00011001 , 8'b00000111};
  95.                 Long_Mem[57] <= {8'b11110110 , 8'b00011011};
  96.                 Long_Mem[58] <= {8'b11100011 , 8'b00001110};
  97.                 Long_Mem[59] <= {8'b00001111 , 8'b00010110};
  98.                 Long_Mem[60] <= {8'b00000101 , 8'b11111001};
  99.                 Long_Mem[61] <= {8'b00011001 , 8'b11101011};
  100.                 Long_Mem[62] <= {8'b00001010 , 8'b00011100};
  101.                 Long_Mem[63] <= {8'b11111111 , 8'b00011111};
  102.             LTS_Vld <= 0;
  103.             LTS_Index <=  0;
  104.             LTS_Done <= 0;
  105.             LTS_Re <= 0;
  106.             LTS_Im <= 0;
  107.             i <= 0;
  108.             j <= 0;
  109.            end  
  110.         else if( Tx_Clr  ) begin
  111.             i <= 0;
  112.             j <= 0;
  113.             LTS_Vld <= 0;
  114.             LTS_Index <= 0;
  115.             LTS_Done <= 0;
  116.         end
  117.         else if( LTS_Req && (LTS_Index<161) ) begin
  118.             LTS_Index <= LTS_Index + 1;
  119.             LTS_Vld <=  1'b1;
  120.             if(i==0)    begin
  121.                 if(j==31) begin
  122.                     j <= 0;
  123.                     i <= i+ 1;
  124.                     LTS_Re <= Long_Mem[j+32][15:8];  
  125.                     LTS_Im <= Long_Mem[j+32][7:0];
  126.                 end
  127.                 else  begin
  128.                     if(i==0 && j==0) begin
  129.                         LTS_Re <= 8'b11101100; //鐭缁冨簭鍒楀埌闀胯缁冨簭鍒楃殑绐楀彛鍑芥暟
  130.                         LTS_Im <= Long_Mem[j+32][7:0];
  131.                     end
  132.                     else begin
  133.                         LTS_Re <= Long_Mem[j+32][15:8];  
  134.                         LTS_Im <= Long_Mem[j+32][7:0];
  135.                     end
  136.                     j <= j + 1;
  137.                 end
  138.             end
  139.             else if( i==1 || i==2 )    begin
  140.                 if(j==63) begin
  141.                     j <= 0;
  142.                     i <= i+ 1;
  143.                     LTS_Re <= Long_Mem[j][15:8];  
  144.                     LTS_Im <= Long_Mem[j][7:0];
  145.                 end
  146.                 else  begin
  147.                     LTS_Re <= Long_Mem[j][15:8];  
  148.                     LTS_Im <= Long_Mem[j][7:0];
  149.                     j <= j + 1;
  150.                 end
  151.             end
  152.             else begin  //  鍔犵獥澶勭悊
  153.                 LTS_Re <= Long_Mem[0][15:8]>>1; //鍔犵獥锛屽乏绉讳竴浣�  
  154.                 LTS_Im <= Long_Mem[0][7:0]>>1;
  155.                 LTS_Done <= 1'b1;
  156.             end
  157.         end
  158.         else begin
  159.             LTS_Vld <= 1'b0;
  160.         end
  161.     end
  162.                   
  163. endmodule         
复制代码
训练序列模块

  1. `timescale 1ns / 1ps
  2. ///
  3. // Company:                                                                     
  4. // Engineer: YWang                                                                    
  5. //                                                                                   
  6. // Create Date: 2023-03-10  14:22:41
  7. // Design Name:                                                                    
  8. // Module Name: symbol_train.v                                                         
  9. // Project Name:                                                                  
  10. // Target Devices:                                                                  
  11. // Tool versions:                                                                  
  12. // Description:                                                                  
  13. //                                                                                 
  14. // Dependencies: 0                                                                  
  15. //                                                                                 
  16. // Revision:                                                                    
  17. // Revision 0.01 - File Created                                                     
  18. // Additional Comments:????????????????                                                     
  19. //                                                                                   
  20. ///
  21. module   symbol_train(  
  22.     input               clk         ,   
  23.     input               rst_n       ,   
  24.     input               Tx_Clr      ,   
  25.     input               Start_En    ,
  26.     output  [7:0]       Train_Im    ,
  27.     output  [7:0]       Train_Re    ,
  28.     output              Train_Vld   ,
  29.     output  [8:0]       Train_Index ,
  30.     output              Train_Done           
  31. );              
  32.     wire                STS_Start_En;
  33.     wire    [7:0]       STS_Im      ;
  34.     wire    [7:0]       STS_Re      ;
  35.     wire                STS_Vld     ;
  36.     wire    [7:0]       STS_Index   ;
  37.     wire                STS_Done    ;
  38.     wire                LTS_Start_En;
  39.     wire    [7:0]       LTS_Im      ;
  40.     wire    [7:0]       LTS_Re      ;
  41.     wire                LTS_Vld     ;      
  42.     wire    [7:0]       LTS_Index   ;
  43.     wire                LTS_Done    ;
  44.     STS_generator  u_STS
  45.     (
  46.         .clk                (clk            ),
  47.         .rst_n              (rst_n          ),
  48.         .Tx_Clr             (Tx_Clr         ),
  49.         .Start_En           (STS_Start_En   ),
  50.         .STS_Im             (STS_Im         ),
  51.         .STS_Re             (STS_Re         ),
  52.         .STS_Vld            (STS_Vld        ),
  53.         .STS_Index          (STS_Index      ),
  54.         .STS_Done           (STS_Done       )
  55.     );
  56.     LTS_generator  u_LTS
  57.     (
  58.         .clk                (clk            ),
  59.         .rst_n              (rst_n          ),
  60.         .Tx_Clr             (Tx_Clr         ),
  61.         .Start_En           (LTS_Start_En   ),
  62.         .LTS_Im             (LTS_Im         ),
  63.         .LTS_Re             (LTS_Re         ),
  64.         .LTS_Vld            (LTS_Vld        ),
  65.         .LTS_Index          (LTS_Index      ),
  66.         .LTS_Done           (LTS_Done       )
  67.     );
  68.     assign Train_Im = STS_Vld ? STS_Im : LTS_Vld ? LTS_Im : 8'b0 ;
  69.     assign Train_Re = STS_Vld ? STS_Re : LTS_Vld ? LTS_Re : 8'b0 ;
  70.     assign Train_Vld = STS_Vld ? 1'b1 : LTS_Vld ? 1'b1 : 1'b0;
  71.     assign Train_Index = STS_Index + LTS_Index;
  72.     assign Train_Done = LTS_Done;
  73.     assign STS_Start_En = Start_En;
  74.     assign LTS_Start_En = STS_Done;
  75.                   
  76. endmodule         
复制代码
仿真波形


总结

训练序列的产生要明确:
频域上用了12个子载波,隔断为4,BPSK符号格式,功率因数1.4几来着?。
频域固定,因此时域实部和虚部也是固定,通过MATLAB就可以直接得到时域的训练序列的实部和虚部的数值,因此直接在步伐中写死循环即可。
数据格式:1位符号,1位整数,6位小数
代码参考:基于FPGA的OFDM基带发射机的计划与实现
训练模块代码未做修改。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表