OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)

news2025/1/13 6:02:20

原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

1.前言

  在之前已经完成了data域数据的处理,在构建整个802.11a OFDM数据帧的时候,还剩下前导码和signal域的数据帧,这两部分的内容。 PLCP的前导部分由一组重复10次的短训练序列和一组加了一个长型保护间隔与重复2次的有效OFDM符号组成的长训练序列组成。今天先来实现短训练序列。

PPDU帧结构
PPDU帧结构

PPDU帧结构
标PPDU帧结构题

2.原理

  短训练序列的主要用途是进行信号的检测、AGC和粗频偏估计。短训练序列都是经过精心的设计,每个短训练序列的长度为0.8us,在802.11a的前导码当中一共有10个短训练序列。这些短训练序列符号占据每个OFDM符号的52个非零子载波当中的12个。如果用-26~26来标识非零子载波的话,那么短训练序列的子载波的序号为{-24, -20, -16, -12, -8, -4, 4, 8, 12, 16, 20, 24},其中传输的传输数据为一个固定的伪随机序列,采用的QPSK的映射方式。

短训练序列
标短训练序列题

  由于短训练序列只用了52个子载波当中12个来传输符号,因此为了保证OFDM符号的功率稳定,需要乘以因子 。短训练序列的的选择可以是的在较大的范围内实现粗频率估计,通常对于周期为T的重复符号而言,最大可估计的频率偏差为,因此通过测量连续两个长度为0.8us的短训练序列符号的相位差,可以估计的频率偏差可达625KHz。 训练序列生成模块主要是提前将长、短序列的时域样值计算出并存入RAM中,需要时直接读取数据即可。

3.Matlab仿真

  由于Data域数据在IFFT处理之前会扩大8倍,相应的长训练序列在进行IFFT处理之前也需要扩大8倍。同时长、短训练序列也是需要经过加窗处理的,即多输出一个样值,该值为第一个样值,同时将第一个样值与最后一个样值缩小一倍。Matlab生成短训练序列代码如下:

%产生长短训练序列、帧头
short_training =[0,0,0,0,-1-1i,0,0,0,-1-1i,0,0,0,1+1i,0,0,0,1+ ...
    1i,0,0,0,1+1i,0,0,0,1+1i,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,1+1i,0,0,0,-1-1i,0,0,0,1+1i,0,0,0,-1-1i, ...
    0,0,0,-1-1i,0,0,0,1+1i,0,0,0]; % short training sequence
sts_frq = (13/6)^0.5 .* short_training;
sts_time = 8*ifft(sts_frq,64);    %对短训练序列进行ifft
%取16点,将该序列重复10次
sts16 = sts_time(1:16);
sts16_q = num2bin(q,sts16);%量化,存到FPGA的ROM
sts_rom = sts16;
for n = 1:9
    sts_rom = [sts_rom,sts16];
end
q = quantizer('fixed','round','saturate',[8,6]);%复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示。
sts_rom = [0.5*sts_rom(1),sts_rom(2:end),0.5*sts16(1)];     %加窗

  生成的STS序列如下表所示,把它们存到FPGA的ROM里面:

地址实部虚部地址实部虚部
08'b000110008'b0001100088'b000110008'b00011000
18'b101111008'b0000000198'b000000018'b10111100
28'b111110018'b11011000108'b110110008'b11111001
38'b010010018'b11111010118'b111110108'b01001001
48'b001011118'b00000000128'b000000008'b00101111
58'b010010018'b11111010138'b111110108'b01001001
68'b111110018'b11011000148'b110110008'b11111001
78'b101111008'b00000001158'b000000018'b10111100

4.硬件实现

  STS一个周期的16个时域样值被存入片内ROM中,ROM的具体内容如上面的表所示,该ROM共有16个地址空间,每个地址对应16位的字长,其中高8位存储STS样值的虚部,低8位存储STS样值的实部(与IFFT输出保持一致)。ROM的地址信号由一个模161的计数器生成。STS_din_rdy作为ROM的读使能信号,代表后面的模块准备好接收数据。当STS_din_rdy为高时,计数器以模161形式开始计数161个时钟,生成的地址信号为计数器的低4位,即cnt[3:0]控制ROM将其中存储的16个STS样值重复读取10个周期,形成标准所规定的短训练序列。 代码如下:

assign En_cnt = STS_din_rdy & ~cnt_last;

counter #(.CNT_NUM('d161),
  .ADD(1'b1))
u_counter(
.clk  (clk    ), 
.rst_n  (rst_n    ),
.En_cnt  (En_cnt    ),      
.cnt  (cnt    ), 
.cnt_last (cnt_last   )
);

always @(posedge clk or negedge rst_n) 
 if(!rst_n)begin
  STS_dout_last <= 1'b0;
  STS_dout_Index <= 'd0;
 end
 else begin
  STS_dout_last <= cnt_last;
  STS_dout_Index <= cnt;
 end
  
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin  //时域样值Im       Re
        Short_Mem[0]  <= {8'b00011000,8'b00011000};      
        Short_Mem[1]  <= {8'b00000001,8'b10111100};
        Short_Mem[2]  <= {8'b11011000,8'b11111001};
        Short_Mem[3]  <= {8'b11111010,8'b01001001};
        Short_Mem[4]  <= {8'b00000000,8'b00101111};
        Short_Mem[5]  <= {8'b11111010,8'b01001001};
        Short_Mem[6]  <= {8'b11011000,8'b11111001};
        Short_Mem[7]  <= {8'b00000001,8'b10111100};
        Short_Mem[8]  <= {8'b00011000,8'b00011000};
        Short_Mem[9]  <= {8'b10111100,8'b00000001};
        Short_Mem[10] <= {8'b11111001,8'b11011000};
        Short_Mem[11] <= {8'b01001001,8'b11111010};
        Short_Mem[12] <= {8'b00101111,8'b00000000};
        Short_Mem[13] <= {8'b01001001,8'b11111010};
        Short_Mem[14] <= {8'b11111001,8'b11011000};
        Short_Mem[15] <= {8'b10111100,8'b00000001};
  STS_dout <= 'd0;
  STS_dout_vld <= 1'b0;
 end
 else if(STS_din_rdy & STS_dout_last)
  STS_dout_vld <= 1'b0;
 else if(cnt == 'd0 | cnt_last)begin
  STS_dout <= {Short_Mem[0][15:8]>>1,Short_Mem[0][7:0]>>1};
  STS_dout_vld <= 1'b1;
 end
 else begin
  STS_dout <= Short_Mem[cnt[3:0]]; 
  STS_dout_vld <= 1'b1;
 end
end

  此处的设计已经考虑了加窗处理(Windowing),该操作在硬件中的实现方法是:将要进行加窗处理的数据单元(STS)多输出一个样值(数据单元的第一个样值),同时将数据单元的第一个样值和最后一个样值缩小1倍。在传输时,一个数据单元的最后一个样值将与下一个数据单元的第一个样值进行相加,成为一个采样点。因此,本设计中计数161个而非160个时钟,它将控制ROM在第161个时钟周期内再输出一个样值(地址为0的第一个样值)。模块的输出部分会对第一个和最后一个样值执行右移1位(即除以2)的操作,从而最终完成加窗处理。

5.MosdelSim仿真

仿真缩略图
标题仿真缩略图

仿真细节图
标仿真细节图题

原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1675431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

景源畅信:抖音小店比较冷门的品类分享?

在抖音小店的世界里&#xff0c;热门品类总是吸引着众多商家和消费者的目光。然而&#xff0c;就像星空中的繁星&#xff0c;虽不那么耀眼却依然存在的冷门品类同样值得我们关注。它们或许不似服装、美妆那样日进斗金&#xff0c;但正是这些小众市场的存在&#xff0c;为平台带…

如何对基本公共服务均等化进行统计监测

党的十九大指出“履行好政府再分配调节职能&#xff0c;加快推进基本公共服务均等化&#xff0c;缩小收入分配差距”&#xff0c;提出到2035年基本公共服务均等化基本实现。国务院相继于2012年和2017年发布了《国家基本公共服务体系“十二五”规划》和《“十三五”推进基本公共…

MySQL、JDBC复盘及规划

数据库仍有习题尚未做完&#xff0c;策略从一天做完改为每天5到10题&#xff0c;以此达到掌握和复习的效果&#xff0c;JDBC的六部仍需每天练习&#xff0c;从明天开始正式进行JavaWeb的学习&#xff0c;预计持续到七月中旬&#xff0c;还会完成一个书城项目&#xff0c;六月底…

安全风险 - 如何解决 setAccessible(true) 带来的安全风险?

可能每款成熟的金融app上架前都会经过层层安全检测才能执行上架&#xff0c;所以我隔三差五就能看到安全检测报告中提到的问题&#xff0c;根据问题的不同级别&#xff0c;处理的优先级也有所不同&#xff0c;此次讲的主要是一个 “轻度问题” &#xff0c;个人认为属于那种可改…

【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法

复数移相&#xff0c;也称为复数相位旋转&#xff0c;就是在原有复数的基础上&#xff0c;不改变模数&#xff0c;只把相位角做一定的偏移。 文章目录 前言 三角函数移相 复数乘法移相 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编…

mysql的隔离性——MVCC

MVCC通过undolog版本链和readview来实现 更新和删除时会写入undolog中。 读已提交&#xff1a;在事务任意读时创建readview&#xff0c;读最新提交的事务 可重复读&#xff1a;在事务第一次读时创建readview

媒体宣发:多元宣发方式的方式有哪些

在信息爆炸的今天&#xff0c;媒体宣发被广泛地运用在各个领域&#xff0c;对于产品宣传、企业形象塑造等都起着至关重要的作用。多样化的媒体宣发方式越来越受到企业的重视&#xff0c;那么常见的媒体宣发方式有哪些呢&#xff1f; 首先&#xff0c;新闻发布是最传统也是最直…

[动画详解]LeetCode151.翻转字符串里的单词

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说&#xff0c;对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说&#xff0c;用户和组、文件权限、SELinux、防火墙、pam、sudo等&#xff0c;究其核心的目的都是为了保证系统是安全的。 …

利用CAD绘制角度斜线的简易指南---模大狮模型网

在CAD设计中&#xff0c;绘制角度斜线是常见的需求&#xff0c;尤其在工程、建筑等领域中。正确绘制角度斜线不仅可以提高图纸的清晰度和美观度&#xff0c;还有助于准确表达设计意图。本文将介绍如何利用CAD软件进行角度斜线的绘制&#xff0c;为您提供简明易懂的操作指南。 一…

对接极速行情丨DolphinDB MDL 行情插件使用指南

通联数据依托于金融大数据&#xff0c;结合人工智能技术为投资者提供个性化、智能化、专业化投资服务&#xff0c; MDL 则是通联数据提供的高频行情数据服务。DolphinDB 提供了能够从 MDL 服务器获取高频行情数据的 DolphinDB MDL 插件&#xff0c;帮助用户方便地通过 DolphinD…

FreeRTOS【4】线程挂起和恢复

1.开发背景 基于上一篇指引&#xff0c;成功创建并启动线程后&#xff0c;线程已经开始运行了&#xff0c;但是有时我们需要线程暂停运行&#xff0c;例如某个线程是控制 LED 闪灯的&#xff0c;如果现在需要让 LED 停止工作&#xff0c;单纯的关闭 LED 是没用的&#xff0c;因…

想要安装Word、Excel、PowerPoint,但却找不到对应软件?

前言 前几天有小伙伴在找Word和Excel软件&#xff0c;但找了半天都没发现怎么安装。 这件事情其实很简单&#xff0c;那就是Word、Excel并不是单独的一个个软件&#xff0c;而是集成在MS Office套件里的。 咱们大部分人常用的办公软件大概是Word、Excel和PowerPoint这三个。还…

ros键盘控制程序teleop_twist_keyboard 键值含义及用法

在机器人仿真中&#xff0c; 经常会用到键盘控制程序teleop_twist_keyboard 对机器人进行控制。但是对各个键值是何种含义&#xff0c; 如何操作并没有任何资料介绍,初次使用时会不知所措。 通过实践&#xff0c; 发现各个键值的作用如下&#xff1a; u-- 向左前方前进 i-- 直…

C#实现长方体棱锥圆柱棱柱圆锥展开折叠旋转缩放

C#实现长方体棱锥圆柱棱柱圆锥展开折叠旋转缩放 C#实现 模型边数 长方体 棱锥 圆柱 棱柱 圆锥 实现功能 展开 折叠 颜色 边框颜色 旋转 缩放 大小 视图方向 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.com) 备用项目获取链接1&#xff1a;yife…

LangChain-Chatchat 实践

1. 说明 比较了几个AI LLM的集成应用工具(比如Quivr, Dify, one-api), 还是LangChain-Chatchat更符合我的需要: 支持私有化部署不同的LLM知识库支持Api支持开源免费, 容易二开 相关路径: 条项路径LangChain-Chatchat 项目/data0/Projects/Langchain-ChatchatLLM 语言模型保…

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求&#xff1f; urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

spring boot3多模块项目工程搭建-下(团队开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 Common模块 DAO模块 Service模块 Web模块 API模块 写在最后 写在前面 本文介绍了springboot开发后端服务&#xff0c;多模块项目工程搭建&#xff0c;各模块的…

gin导出excel文件

go可以通过excelize 包实现对excel的操作 "github.com/xuri/excelize/v2"导出示例 service层 批量导出数据的&#xff0c;我们可以在dao层中返回一个切片。在service中新建一个excelize对象&#xff0c;单独设置表头。遍历切片往excelize上修改即可。 func (s *S…

CSS2(一):CSS选择器

文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…