(三)OpenOFDM符号对齐

符号对齐

  • 模块sync_long.v
  • 输入I (16), Q (16), phase_offset (32), short_gi (1)
  • 输出long_preamble_detected (1), fft_re (16), fft_im (16)

检测到数据包后,下一步是精确确定每个 OFDM 符号的起始位置。在802.11中,每个OFDM符号是4微秒长的。在 20 MSPS 采样率下,这意味着每个 OFDM 符号包含 80 个样本。任务是将传入的样本流分组为 80 个样本的 OFDM 符号。这可以使用短前导码后面的长前导码来实现。

        这部分是在实现数据包检测之后进行的,长前导码登场发挥作用。如果对这里的这些数字有疑惑,请先去搞清楚802.11 OFDM数据包的结构。下面我们将从长前导码的最起始位置(GI2)开始,将样本划分为80个样本一组的OFDM符号。

_images/training.png

图 9 802.11 OFDM 数据包结构(802.11-2012 Std 中的图 18-4)

如图9所示,长前导码持续时间为8微秒(160 个样本),包含两个相同的长训练序列(LTS),每个 64 个样本。LTS 是已知的,我们可以使用互相关来找到它。

样本i的交叉验证分数可以计算如下。

在这里H是时域中已知LTS的64个样本,并且可以在表L-6中找到(索引96至159)。可以找到 LTS(64 个样本)的 numpy 可读文件,可以这样读取:802.11-2012 stdhere

>>> import numpy as np
>>> lts = np.loadtxt('lts.txt').view(complex)

_images/lts.png

图 10长前导码和互相关结果

要绘制图 10,请加载数据文件(请参阅示例文件),然后:

# in scripts/decode.py
import decode
import numpy as np
from matplotlib import pyplot as pltfig, ax = plt.subplots(nrows=2, ncols=1, sharex=True)
ax[0].plot([c.real for c in samples][:500])
# lts is from the above code snippet
ax[1].plot([abs(c) for c in np.correlate(samples, lts, mode='valid')][:500], '-ro')
plt.show()

图 10显示了长前导码样本以及互相关的结果。我们可以清楚地看到两个尖峰对应于长前导码中的两个 LTS。尖峰宽度仅为 1 个样本,准确显示每个序列的开头。假设样本索引如果第一个尖峰是N,然后 160 个样本长前导码从样本开始N−32。

        两个尖峰的位置就是802.11 OFDM数据包结构中T1,T2前面的虚线位置,这只是代表不包含保护间隔GI的长前导码起始位置,如果说加上了这两个GI,我们就还得在N(出现尖峰的位置)的基础上减去32,也就是减去16*2两个GI的长度,以确定最初始的位置。

这一切看起来都很美好,但当涉及到 Verilog 实现时,我们必须做出妥协。

从(1)我们可以看出,对于每个样本,我们需要执行64次复数乘法,这会消耗大量的FPGA资源。因此,我们需要减少交叉验证的规模。我们的想法是仅使用一部分而不是所有 LTS 样本。

        下面主要就是说,因为资源有限,所以逐渐减少进行互相关的样本数量,看一下取到多少的时候出来的现象就已经能看到明显的尖峰,那就用这个样本数量去做互相关,既能节省资源又能达到想要的结果。

_images/match_size.png

图 11不同尺寸(8、16、32、64)的互相关

图 11可以绘制为:

lp = decode.LONG_PREAMBLEfig, ax = plt.subplots(nrows=5, ncols=1, sharex=True)
ax[0].plot([c.real for c in lp])
ax[1].plot([abs(c) for c in np.correlate(lp, lts[:8], mode='valid')], '-ro')
ax[2].plot([abs(c) for c in np.correlate(lp, lts[:16], mode='valid')], '-ro')
ax[3].plot([abs(c) for c in np.correlate(lp, lts[:32], mode='valid')], '-ro');
ax[4].plot([abs(c) for c in np.correlate(lp, lts, mode='valid')], '-ro')
plt.show()

图 11显示了长前导码(160 个样本)以及不同大小的交叉验证。可以看出,使用 LTS 的前 16 个样本足以表现出两个窄尖峰。因此,OpenOFDM 使用 LTS 的前 16 个样本的互相关来进行符号对齐。为了确认这一点, 图 12显示了实际数据包上前 16 个 LTS 样本的互相关。这两个尖峰不像 图10中的那样明显,但仍然清晰可见。

_images/lts_16.png

图 12使用 LTS 的前 16 个样本进行交叉验证

为了找到这两个峰值,我们记录了前 64 个样本的最大相关样本(因为第一个峰值应该位于第 32 个样本)。同样,我们还记录了第二个 64 个样本的最大相关样本。为了进一步消除误报,我们还检查两个尖峰样本索引是否为64±1。通过互相关确定了尖峰的位置还不够严谨,记录下两个尖峰的位置只有它们相差64±1的时候,才能正式确定,因为两个长前导码的开始正好相差64个样本长度。

快速傅里叶变换

现在我们已经找到了每个 OFDM 符号的起始位置,接下来的任务是对每个符号内的最后 64 个数据样本执行 FFT。为此,我们利用 Xilinx ISE 生成的XFFT 内核。根据是否使用短保护间隔 (SGI),需要跳过每个 OFDM 符号的前 16 个或 8 个样本。

但在执行 FFT 之前,我们需要首先应用频偏校正(请参阅频偏校正)。这是通过rotate模块实现的(请参阅旋转)。

        进行到这里我们基本就能去将时域上的信号通过FFT转到频域上了,但是!在执行这一步之前,还要把频率偏移校正一下子,详见(二)OpenOFDM频偏校正-CSDN博客。

        这里文章的设置有一些倒置,但是为了跟原文保持一致只能按这个顺序写了,在最开始OpenOFDM接收端信号处理流程-CSDN博客这篇文章里已经把所有流程按照正确顺序捋了一遍,可以把介绍章节看完之后再去看总体的流程。

总结:这一部分就是在检测到数据包之后,再借助长前导码将符号对齐,80个样本为一组以便确定哪些样本是一个完整的OFDM符号(包含16个样本的GI和64个样本的data)。

原文:Symbol Alignment — OpenOFDM 1.0 documentation

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

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

相关文章

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

深度学习-基于机器学习的语音情感识别系统的设计

概要 语音识别在现实中有着极为重要的应用&#xff0c;现在语音内容的识别技术已日趋成熟。当前语音情感识别是研究热点之一&#xff0c;它可以帮助AI和人更好地互动、可以帮助心理医生临床诊断、帮助随时随地高效测谎等。本文采用了中科院自动化所的CASIA语料库作为样本&#…

算法---滑动窗口练习-6(找到字符串中所有字母异位词)

找到字符串中所有字母异位词 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;找到字符串中所有字母异位词 2. 讲解算法原理 有效字符个数count更新条件&#xff1a;满足【hash1表&#xff08;遍历s的表&#xff09;中对应元素出现次数<hash2表&am…

【回溯专题】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【未完待续】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

用户视角的比特币和以太坊外围技术整理

1. 引言 要点&#xff1a; 比特币L2基本强调交易内容的隐蔽性&#xff0c;P2P交易&#xff08;尤其是支付&#xff09;成为主流&#xff0c;给用户带来一定负担&#xff08;闪电网络&#xff09;在以太坊 L2 中&#xff0c;一定程度上减少了交易的隐蔽性&#xff0c;主流是实…

数据资产管理之道:PDCA循环引领数字化转型

在数字化浪潮的推动下&#xff0c;数据已成为现代企业的核心竞争力。如何有效地管理这些宝贵的数据资产&#xff0c;确保它们为企业带来持续的竞争优势&#xff0c;成为许多企业迫切需要解决的问题。本文将基于PDCA循环&#xff0c;为您深入剖析如何构建稳健的数据资产管理流程…

【方法封装】时间格式化输出,获取请求设备和IP

目录 时间类 1.1 获取当前时间&#xff0c;以特定格式化形式输出 1.2 自定义时间&#xff0c;以特定格式化输出 1.3 获取当前时间&#xff0c;自定义格式化 1.4 自定义时间&#xff0c;自定义格式化 设备类 根据请求头信息&#xff0c;获取用户发起请求的设备 请求IP类 …

DVWA靶场-Brute Force暴力破解

DVWA是一个适合新手锻炼的靶机&#xff0c;是由PHP/MySQL组成的 Web应用程序&#xff0c;帮助大家了解web应用的攻击手段 DVWA大致能分成以下几个模块&#xff0c;包含了OWASP Top 10大主流漏洞环境。 Brute Force——暴力破解 Command Injection——命令注入 CSRF——跨站请…

解决找不到d3dx9_42.dll,无法继续执行此代码的多种方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“d3dx942.dll丢失”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;它会导致程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的d3dx942.dll文件…

2024年腾讯云免费服务器4核8G配置申请

腾讯云免费服务器4核8G配置申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾…

如何在webapp中手动部署

前言&#xff1a;这个有不知道怎么下载Tomcat的可以看我这篇博客的前面&#xff0c;有相关链接&#xff0c;下载好后我那边也有如何运行成功的 在idea中配置tomcat服务器&#xff0c;部署一个项目-CSDN博客 接下来进入这篇博客的正题&#xff01;怎么手动部署 先找到我们下载…

每日GEE| Day 01 研究区域矢量数据加载

// Add study region var roi ee.FeatureCollection(geometry) Map.centerObject(roi,8); var styling {color:red,fillColor:00000000,width:2};// display hollow roi Map.addLayer(roi.style(styling), {}, "outline"); 以上代码的功能实现了对研究区域的加载&am…

Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?

一、本期教学目标 掌握map集合常用方法。掌握map集合使用场景。通过map集合实现斗地主洗牌发牌动作。 二、前言 对于双列集合之map集合&#xff0c;它的相关知识点及拓展咱们都已经差不多学完了。接下来&#xff0c;就是带着大家如何灵活运用map进行一个实战教学&#xff0c;…

FFmpeg-aac、h264封装flv及时间转换

文章目录 时间概念流程api核心代码 时间概念 dts: 解码时间戳, 表示压缩帧的解码时间 pts: 显示时间戳, 表示将压缩帧解码后得到的原始帧的显示时间 时间基: time_base &#xff0c; 通常以ms为单位 时间戳: timestamp , 多少个时间基 真实时间&#xff1a;time_base * timest…

力扣111---二叉树的最小深度(简单题,Java,递归+非递归)

目录 题目描述&#xff1a; &#xff08;递归&#xff09;代码&#xff1a; &#xff08;非递归、层次遍历&#xff09;代码&#xff1a; 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

ping和telnet的区别

ping是ICMP协议&#xff0c;只包含控制信息没有端口&#xff0c;用于测试两个网络主机之间网络是否畅通 telnet是TCP协议&#xff0c;用于查看目标主机某个端口是否开发。 总结&#xff1a;ping是物理计算机间的网络互通检查&#xff0c;telnet是应用服务间的访问连通检查&am…

Android中ANR机制

Android中的ANR分为两种&#xff0c;前台ANR和后台ANR。 前台ANR&#xff0c;是指ANR时对用户可感知&#xff0c;比如拥有当前前台可见的activity的进程&#xff0c;或者拥有前台通知的fg-service的进程&#xff0c;这些是用户可感知的场景。前台ANR&#xff0c;会出现一个系统…

vue模板语法介绍及内置指令用法

1、文本差值&#xff08;大括号、v-text、v-htm指令&#xff09; 最基本的数据绑定就是文本差值&#xff0c;格式为“Mustache”语法&#xff08;双大括号&#xff09;&#xff1b; 双大括号只能解析文本不能解析html&#xff0c;如需解析html则需使用v-html指令&#xff1b;…

C语言之通讯录的实现(静态版,动态版,文件版)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 静态通讯录的实现逻辑 test.c&#xff1a;通讯录的逻辑实现 Contact.h&#xff1a;函数的声明与头文件的包含 Contact.c&#xff1a;函数的…

MySQL数据库实现增删改查基础操作

准备工作 安装mysql8.0 (安装时一定要记住用户名和密码)安装数据库可视化视图工具Navicat 请注意⚠️⚠️⚠️⚠️ a. 编程类所有软件不要安装在中文目录下 b. Navicat破解版下载安装教程&#xff1a;&#xff08;由于文章审核提示版权问题&#xff0c;链接不方便给出&#xff…