(三)OpenOFDM符号对齐

news2025/1/12 1:51:17

符号对齐

  • 模块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 plt

fig, 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_PREAMBLE

fig, 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.coloradmin.cn/o/1524275.html

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

相关文章

4-如何进行细分市场分析-03 竞争者分析

任何一个行业肯定都是有很多竞争者,我们如何判断这些竞争者对我们有什么样的威胁、什么样的机会、什么样的影响,我们需要去分析这些竞争者。 行业竞争格局如何分析? 我们可以从一些基本指标来入手,如市场集中度、行业利润率。 竞…

(学习日记)2024.03.15:UCOSIII第十七节:任务的挂起和恢复

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

ChatGPT提示词方法的原理

关于提示词,我之前的一些文章可以参考: 【AIGC】AI作图最全提示词prompt集合(收藏级)https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

SAR ADC教程系列5——FFT频谱泄露以及相干采样

频谱泄露的出现以及如何规避? 为什么要相干采样? 1.分析ADC输出信号的频谱工具:DFT(Discrete Fourier Transform) 重点:DFT相邻频谱频率间隔为fs/N 如何规避频谱泄露? 对于DFT,它对于接收到的信…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛——A 题:生产线的故障自动识别与人员配置具体思路以及源代码分析

一、问题背景 随着新兴信息技术的大规模应用,工业生产线的智能化控制技术日益成熟。自动生产线 可以自动完成物品传送、物料填装、产品包装和质量检测等过程,极大地提高了生产效率和 产品质量,减少了生产成本。自动生产线融入故障智能报警…

学习笔记--强化学习(1)

参考:https://blog.csdn.net/koulongxin123/article/details/122676149 1.什么是强化学习? (1)定义 基于环境的反馈而行动,通过不断与环境的交互、试错,最终完成特定目的或者使得整体行动收益最大化(是一种通过与环境…

echarts实践总结(常用一):柱状图(特点:渐变色、点击缩放、左右滑动、悬浮展示样式)

目录 第一章 echarts基本使用 第二章 echarts实践——柱状图 效果展示 第一章 echarts基本使用 Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客 第二章 echarts实践——柱状图 最近接到这么一个需求,需要画页面,然后有这么几个echarts的图需…

asp.net 作业星软件系统

asp.net 作业星软件系统 用户功能:分教师和家长(学生) 注册登录:登录部分是用户名密码,以及教师和家长(学生)的勾选; 注册包括用户名密码确认密码再次确认密码(与上方输入的密码比对)身份班级设置找回账号的问题和答案…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议? 2. 为什么使用HTTP协议? 3. HTTP协议通信过程 4. 什么是url? 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

养鸡厂用这个开源监控方案,应该很棒

软件介绍 WVP-PRO是基于GB/T 28181-2016标准的流媒体平台,依托于优秀的开源流媒体服务 ZLMediaKit 提供全面且丰富的功能。该软件允许用户将 IPC 摄像头接入平台,支持28181、rtsp、rtmp、flv等协议,可实现视频流发送到其他平台,广…

记日志打印引起接口慢问题排查

其他系统调用本接口,其他系统反馈接口慢,查看接口用时0.07s,但仔细观察日志发现接口确实慢了用时5.978s; 日志写入NAS盘,非本地写入肯定会有一定的延时,看日志打印策略是同步滚动打印,改成异步打…

软件实例,餐厅酒水寄存管理系统软件,酒水寄存登记表软件操作教程

软件实例,餐厅酒水寄存管理系统软件,酒水寄存登记表软件操作教程 一、前言 以下软件操作以 佳易王酒水寄存管理系统软件V16.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、酒水寄存管理系统软件可以管理多个品类的物…

[NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数 题目描述 设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1​…an​,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。 输入格式 第一行有一个整数,表示数字个数 n n n。 第二行有 n n …

小白DB补全计划Day1-LeetCode:SQL基本操作select

前言:找工作(主人)的任务罢了 链接:1757. 可回收且低脂的产品 - 力扣(LeetCode) 584. 寻找用户推荐人 - 力扣(LeetCode) 来源:LeetCode 对DB篇的SQL章不太知道怎么写…

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符 Python 字符串创建字符串访问字符串中的字符字符串切片字符串操作符字符串方法 Python 转义字符Python字符串运算符 Python 字符串 在 Python 中,字符串是一种基本数据类型,用于表示文本数据…

深度学习pytorch——Tensor维度变换(持续更新)

view()打平函数 需要注意的是打平之后的tensor是需要有物理意义的,根据需要进行打平,并且打平后总体的大小是不发生改变的。 并且一定要谨记打平会导致维度的丢失,造成数据污染,如果想要恢复到原来的数据形式,是需要…

【全面了解自然语言处理三大特征提取器】RNN(LSTM)、transformer(注意力机制)、CNN

目录 一 、RNN1.RNN单个cell的结构2.RNN工作原理3.RNN优缺点 二、LSTM1.LSTM单个cell的结构2. LSTM工作原理 三、transformer1 Encoder(1)position encoding(2)multi-head-attention(3)add&norm 残差链…

A Workload‑Adaptive Streaming Partitioner for Distributed Graph Stores(2021)

用于分布式图存储的工作负载自适应流分区器 对象:动态流式大图 划分方式:混合割 方法:增量重划分 考虑了图查询算法,基于动态工作负载 考虑了双动态:工作负载动态;图拓扑结构动态 缺点:分配新顶…

C语言基础之输入输出

前言 本次博客会是最有料的博客了,这其中的问题尤其是scanf函数对新手很不友好 我们本次 1会讲解其他的一些输入输出函数,分析他们的优劣点 2本次的参考资料来自于 c primer plus 1scanf函数详解 首先大家了解过scanf的功能吗 1大家已经学到这里了,肯定知道,scanf是从输…

Java Swing游戏开发学习11

内容来自RyiSnow视频讲解 这一节讲的是游戏状态GameState 游戏状态这里是,游戏所处的各种状态,比如游戏中、已暂停、与NPC对话中、与怪物Monster战斗中等等。在不同的状态中,游戏的交互也是不同的,比如按Enter键在游戏中状态&…