(五)OpenOFDM解码

解码

现在我们已经校正了残余 CFO,也校正了通道增益,下一步是将 FFT 输出映射到实际数据位。这是对数据包进行编码的逆过程。

  1. 解调:复数到位
  2. 解交织:对每个 OFDM 符号内的比特进行混洗
  3. 卷积解码:去除冗余并纠正潜在的位错误
  4. 解扰。

步骤1和3取决于调制和编码方案,可以从SIGNAL字段获得。信号字段在长前导码之后的第一个 OFDM 符号中进行编码,并且无论实际调制如何,始终采用 BPSK 调制。回想一下,在 802.11a/g 中,一个 OFDM 符号包含 48 个数据子载波,相当于 BPSK 方案中的 48 个数据位。信号字段也以 1/2 速率进行卷积编码,因此信号字段中有 24 个实际数据位。

接下来,我们首先完成解码过程,然后解释传统 (802.11a/g) 和 HT (802.11n) 信号格式的格式。

解调

  • 模块demodulate.v
  • 输入rate (7), cons_i (16), cons_q (16)
  • 输出bits (6)

此步骤将 FFT 平面中的复数映射为比特。图19 示出了BPSK、QPSK、16-QAM和64-QAM的星座编码方案。OpenOFDM 也支持。

_images/mod.png

图 19 BPSK、QPSK、16-QAM 和 64-QAM 星座比特编码

在每个 OFDM 符号内,每个子载波根据调制方式被映射为 1、2、4 或 6 位。2^{n},n即位数。

解交织

  • 模块deinterleave.v
  • 输入rate (7), in_bits (6)
  • 输出out_bits (2), erase (2)

在每个 OFDM 符号内,编码位是交织的。要了解块交织器的工作原理,首先我们需要定义一些参数。这里我们只考虑802.11a/g和802.11n单空间流模式。

表 2调制相关参数 (802.11a/g)
调制编码率比特率N_{BPSC}N_{CBPS}N_{DBPS}
BPSK1/2614824
BPSK3/4914836
四相相移键控1/21229648
四相相移键控3/41829672
16-QAM1/224419296
16-QAM3/4364192144
64-QAM2/3486288192
64-QAM3/4546288216

在这里:

  • N_{BPSC}:每个子载波的位数
  • N_{CBPS}:每个 OFDM 符号的编码位数
  • N_{DBPS}:每个 OFDM 符号的数据位数

s=max(N_{BPSC}/2,1)是星座平面中沿实(或虚)轴的位数。交织器基于按行写入数据位并按列读出数据位。N_{BPSC}为奇数时,s=1;N_{BPSC}为偶数时,s=N_{BPSC}/2。

表 3 802.11 交织器的行和列
 802.11a/g802.11n 20MHz
N_{COL}1613
N_{ROW}×N_{BPSC}×N_{BPSC}

交织过程涉及两种排列。让k是第一次排列之前的位索引的索引,i是第一个排列之后但第二个排列之前的索引,并且j是第二次排列后的索引。

        这里先介绍了交织再介绍了反交织,前俩公式是交织的过程,后面俩才是解交织。交织分为两步,一个是把原本的数据流按行排列,再按列取出,这时候原本的数据已经乱了。第二步是在映射到星座图的时候,把相邻的码位映射到星座图中的对角线位置。解交织是前面的逆过程,先把码位从星座图上排列下来,再按列排,按行取,以恢复原本的顺序。

第一个排列 (→i)的交织确保相邻码位映射到非相邻子载波,定义为:

以及第二个排列(i→j) 确保相邻码位交替映射到星座点中的较低或较高有效位,并定义为:

解交织过程还涉及两种排列,以及反转交织过程中的两种排列。

首先,反转第二个排列 ( (2) ):

(3) ¶

并反转第一个排列:

(4) ¶

在 OpenOFDM 中,解交织是使用查找表来执行的。首先,一个 OFDM 符号中的比特存储在双端口 RAM 中。然后根据查找表读取这些位。

_images/deinter_lut.png

图 20解交错查找表

如图20所示,一个OFDM符号的原始比特首先被存储在置换缓冲器中。缓冲区条目为 6 位宽,可容纳 64-QAM。对于其他调制,只有较低的N_{BPSC}位有效。缓冲区有 48 (802.11a/g) 或 52 (802.11n) 行,具体取决于是否使用 HT。这个表就是用来缓存数据的,方便按解交织的思路去恢复原来的码位顺序。

将一个 OFDM 符号内的所有位写入置换缓冲区后,我们首先获得当前调制方案的子查找表的基地址。对于 802.11a/g,关键是信号字段内的速率位。对于 802.11n,关键是mcs 16。下一步是读取查找表以确定接下来要输出哪些位。

查找表条目的宽度为 22 位,其中包含:

  • null_a/null_b:当前位是否有效(用于接下来维特比解码中的标点符号)
  • addra/bita:输出的第一位
  • addrb/bitb:要输出的第二位
  • out_stb:输出选通
  • done:电流调制子 LUT 结束

请注意,解交错模块在每个时钟周期输出 2 位。查找表由 生成scripts/gen_deinter_lut.py

对于非 1/2 调制率,我们需要补偿解交织步骤中的标点符号,以使后续的维特比解码更容易。这是通过相应地插入虚拟位(通过null_a/null_b位)来实现的。确切的标点符号模式可以在 18-9 中的图中找到。802.11-2012 std

维特比解码

传输的比特经过卷积编码,增加了比特的冗余并帮助接收器修复比特错误。可以使用维特比算法来执行解码 ,我们使用 Xilinx 提供的 Viterbi IP 核。它不是免费的,但您可以获得评估许可证。评估许可证的限制是FPGA上电后一定时间(几个小时)后内核将停止工作。

Viterbi 核心处理大部分繁重的工作,我们只需要向它提供解交织模块输出的解穿孔比特。

对于 SIGNAL 或 HT-SIG 字段,解码在此停止。对于数据符号,最后一步是解扰。

这部分没有介绍详细过程,直接是Viterbi IP 核实现。

解扰

发送端的加扰步骤是为了避免长连续的 0 或 1 序列。加扰和解扰过程可以使用相同的逻辑来实现。这部分没咋看懂,反正就是先介绍了加扰的过程,再介绍了解扰的过程。

_images/scrambler.png

图 21加扰器/解扰器逻辑

假设当前输入位是B_{n}, 扰乱位B_{n}^{s}加扰器的内部状态更新如下:

(5) ¶

在这里X_{n}^{i}是第 n 个输入位之前的扰码器状态,

在发送端,对于每个数据包,扰码器都用伪随机值进行初始化。数据位的前 7 位在加扰之前被预设为零,以便接收器可以使用加扰位来估计值。

现在让我们看看接收器如何恢复发送器扰码器的初始状态。有两种方法可以解释这一点。

首先,我们可以计算初始状态。由于前 7 个未加扰位(B0 to B6) 均为零,则扰码位可由下式获得:

(6) ¶

从中我们可以反算出X如下:

(7) ¶

这种解释不会导致有效的 Verilog 实现,因为我们需要首先缓冲前 7 位,计算初始状态,然后再次从前 7 位进行解扰。

第二种解释是:前7个加扰比特是这7个比特加扰后的状态。换句话说,我们有:

(8) ¶

例如,看一下X_{7}^{7},

(9) ¶

我们还知道:

(10) ¶

所以X_{7}^{7}=B_{0}^{s}。这样我们就直接得到状态来解扰下一位B_{7}^{s},得到一个非常简单的 Verilog 实现。

原文:Decoding — OpenOFDM 1.0 documentation

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

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

相关文章

C语言学习笔记day8

一维数组冒泡排序法 1. 作用 将乱序的一维数组按照从小到大的顺序排列 2. 原理示意图 3. 代码 #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int a[5] {0};int len sizeof(a) / sizeof(a[0]);int i 0;int j 0;int tmp …

CSS案例-3.背景练习

效果1 用背景加入图标 效果2 将图片设为页面背景,图片主体在中间 效果3 鼠标放到导航栏上会变颜色 知识点 CSS背景 属性 描述 取值 background 复合属性 看独立属性 background-color 背景颜色 <color> background-image 背景图像 none | url background-repeat 背景…

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过&#xff08;CVE-2017-8386&#xff09;导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突&#xff0c;将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa&#xff0c;这是ssh的私钥&#xff0c;连接的时候请指…

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息&#xff1a; 题目链接&#xff1a; 一维前缀和思路&#xff1a;求前缀和数组&#xff0c;sum dp[r] …

性能分析调优模型

性能测试除了为获取性能指标外&#xff0c;更多是为了发现性能瓶颈和性能问题&#xff0c;然后针对性能问题和性能瓶颈进行分析和调优。在当今互联网高速发展的时代&#xff0c;结合传统软件系统模型以及互联网网站特征&#xff0c;性能调优的模型可以归纳总结为如图1-5-1所示的…

多线程服务器适用场合

前提 进程”指的是fork(2)系统调用的产物 线程”指的是pthread_create()的产物,因此是宝贵的那种原生线程。而且Pthreads是NPTL的,每个线程由clone(2)产生,对应一个内核的task_struct。 Pthreads是一组线程操作的标准&#xff0c;NPTL是 Native POSIX Thread Library 的缩写&…

【Quixel Mixer】简单介绍

一、下载 官网下载地址&#xff1a;Quixel Mixer - All-in-one texturing & material creation tool 下载好之后双击exe来安装 等待安装完成 下载后打开&#xff0c;新建一个工程和Mix 二、界面介绍 我们先将软件界面分为如下3个部分 1号区域为菜单栏 2号区域介绍 2号…

单头注意力机制(ScaledDotProductAttention) python实现

输入是query和 key-value&#xff0c;注意力机制首先计算query与每个key的关联性&#xff08;compatibility&#xff09;&#xff0c;每个关联性作为每个value的权重&#xff08;weight&#xff09;&#xff0c;各个权重与value的乘积相加得到输出。 import torch import tor…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点&#xff1a; 缺点&#xff1a; 四、改进与完事 LDM代表作 原理概括 Latent Space&#xff08;潜空间&#xff09; 五、总结 引…

MC0204 世界警察

世界警察小码哥来谈判了&#xff0c;恐怖分子在银行挟持了 n 个人质&#xff0c;每个人质都所属一个国家&#xff0c;第 i 个人质所属的国家为 ci​&#xff0c;人质排成了一排&#xff0c;位置都是固定的。经过商讨&#xff0c;恐怖分子允许小码哥可以带走任意一段连续区间内的…

关于大根堆,set重载运算符

题目描述 \,\,\,\,\,\,\,\,\,\,制定合理的日程能够帮助利用好时间进行加训&#xff0c;加训和加训。 \,\,\,\,\,\,\,\,\,\,新学期开始了&#xff0c;应该好好学习了&#xff01;凌晨两点整&#xff0c;加睡失败的你在为新一天的各项重要事件制定闹钟。 \,\,\,\,\,\,\,\,\,\, \,…

【SpringBoot】请求与响应参数 IoC与DI 总结

文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 Pat…

docker镜像管理基础-3

文章目录 镜像的概念docker镜像层docker存储驱动AUFSOverlayFSDeviceMapper docker registrydocker镜像的制作Docker Hubdocker镜像的获取镜像的生成基于容器制作镜像 镜像的导入与导出 镜像的概念 镜像可以理解为应用程序的集装箱&#xff0c;而docker用来装卸集装箱。 docke…

代码+视频,R语言使用BOOT重抽样获取cox回归方程C-index(C指数)可信区间

bootstrap自采样目前广泛应用与统计学中&#xff0c;其原理很简单就是通过自身原始数据抽取一定量的样本&#xff08;也就是取子集&#xff09;&#xff0c;通过对抽取的样本进行统计学分析&#xff0c;然后继续重新抽取样本进行分析&#xff0c;不断的重复这一过程N&#xff0…

Android的三种动画详解(帧动画,View动画,属性动画)

Android的三种动画详解&#xff08;帧动画、View动画、属性动画&#xff09;_android动画效果大全-CSDN博客 1、帧动画 缺点是&#xff1a;占用内存较高&#xff0c;播放的是一帧一帧的图片&#xff0c;很少使用。 顺序播放预先定义的图片&#xff0c;类似于播放视频。 步骤…

代码随想录阅读笔记-字符串【替换数字】

题目 给定一个字符串 s&#xff0c;它包含小写字母和数字字符&#xff0c;请编写一个函数&#xff0c;将字符串中的字母字符保持不变&#xff0c;而将每个数字字符替换为number。 例如&#xff0c;对于输入字符串 "a1b2c3"&#xff0c;函数应该将其转换为 "anu…

PlayBook 详解

4&#xff09;Playbook 4.1&#xff09;Playbook 介绍 PlayBook 与 ad-hoc 相比&#xff0c;是一种完全不同的运用 Ansible 的方式&#xff0c;类似与 Saltstack 的 state 状态文件。ad-hoc 无法持久使用&#xff0c;PlayBook 可以持久使用。 PlayBook 剧本是 由一个或多个 “…

Linux之shell变量

华子目录 什么是变量&#xff1f;变量的名称示例 变量的类型变量的定义示例 自定义变量查看变量&#xff08;自定义变量和全局变量&#xff09; 环境变量定义环境变量&#xff08;全局变量&#xff09;法一法二法三env&#xff0c;printenv&#xff0c;export注意 C语言与shell…

upload-labs 0.1 靶机详解

下载地址https://github.com/c0ny1/upload-labs/releases Pass-01 他让我们上传一张图片&#xff0c;我们先尝试上传一个php文件 发现他只允许上传图片格式的文件&#xff0c;我们来看看源码 我们可以看到它使用js来限制我们可以上传的内容 但是我们的浏览器是可以关闭js功能的…

蓝桥杯-粘木棍-DFS

题目 思路 --有n根木棍&#xff0c;需要将其粘成m根木棍&#xff0c;并求出最小差值&#xff0c;可以用DFS枚举出所有情况。粘之前有n根短木棍&#xff0c;粘之后有m根长木棍&#xff0c;那么让长木棍的初始长度设为0。外循环让所有的短木棍都参与粘&#xff0c;内循环让要粘的…