OFDM802.11a的FPGA实现(九)星座图映射(含verilog和matlab代码)

目录

  • 1. 前言
  • 2. 调制
    • 2.1 QAM调制
    • 2.2 64-QAM 调制
    • 2.3 16-QAM 调制
  • 3.模块实现
  • 4.Matlab仿真
  • 5.ModelSim仿真
  • 6.verilog代码

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

1. 前言

  在上一篇博客当中,已经完成了数据域的交织,数据域的数据经过交织之后,下一步就是需要对交织之后的bit进行星座图的映射了。

2. 调制

  在 OFDM 通信系统中根据不同的速率要求,其子载波需要用二进制相移键控(BPSK)、正交相移键控(QPSK)、或正交幅度调制(QAM)方式进行调制。数据经过卷积编码和交织后,串行比特流每 1、2、4 或 6 个比特被分为一组,用一定的规律将比特流映射成为复数,形成 BPSK,QPSK,16-QAM,64-QAM 调制。

BPSK_QPSK_16-QAM

64-QAM

  在传输过程中调制方式可能发生变化,如 signal 域的数据采用的是 bpsk 调制,而 data 域采用的是另一种调制方式,为了使所有的映射有一样的平均功率,需要对映射进行归一化。映射后的复数值乘上一个归一化的量 Kmod,即可得到输出数据。Kmod 的值根据不同的调制模式而不同。

归一化因子

2.1 QAM调制

  QAM 与其他调制技术相比,能得到更高的频谱效率,且具有抗噪声能力强等优点,因此得到了广泛的应用。QAM调制中,数据信号由相互正交的两个载波的幅度变化表示。QAM 是一种矢量调制,将输入比特先映射(一般采用格雷码)到一个复平面(星座图)上,形成复数调制符号,然后将该符号的 i、q 分量(即该复数的实部和虚部)分别对应调制在相互正交(时域正交)的两个载波cos 和 sin 上。
  正交振幅调制可以表示为:
s ( t ) = A m c o s ( w t ) + B m c o s ( w t ) ( 0 ≤ t ≤ T s ) s(t)=A_{m}cos(wt)+B_{m}cos(wt) (0 \leq t\leq Ts) s(t)=Amcos(wt)+Bmcos(wt)(0tTs)
  上述式子当中 A m , B m A{m}, B{m} Am,Bm就是调制之后得到的实部和虚部的数据。

正交调制

2.2 64-QAM 调制

  64-QAM在星座图上具有64个星座点,每个星座点代表一种状态,每6个bit表示一个星座点,其映射关系如下:

64QAM

  串行输入的bit,每6个bit构成一个星座点,第一个进来的是b0,进入的顺序依次排列为b0b1b2b3b4b5,根据映射表,可以得到虚部和实部的映射结果:

QAM64映射表

  b0b1b2对应I路,b3b4b5对应Q路数据,再乘以归一化因子,得到调制之后的IQ路的值。

2.3 16-QAM 调制

  16-QAM在星座图上具有16个星座点,每个星座点代表一种状态,每4个bit表示一个星座点,其映射关系如下:

16-QAM 调制

  串行输入的bit,每4个bit构成一个星座点,第一个进来的是b0,进入的顺序依次排列为b0b1b2b3,根据映射表,可以得到虚部和实部的映射结果:

b0b1Re/Ib2b3Im/Q
00-300-3
01-101-1
111111
103103

3.模块实现

  设计上,通过调制方式不同,将串行数据流以1、2、4或6比特分成一组,缓存在一个6比特寄存器中,等到比特数据达到一组时,通过该组数据映射方式进行映射并归一化得到调制的I和Q两路数据。复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示。与上下游端口数据交互依然采用valid-ready握手机制,不必又去跨时钟域。
  输出实部和虚部各8位,一位符号位,一位整数位,六位小数位;高8位为实部,低8位为虚部。Index_Out为输出标号。端口示意图如下:

4.Matlab仿真

  以2个OFDM符号,16-QAM调制,编码效率为3/4,进行仿真,生成测试数据共计288个,如下:

test_data =列 1 至 270     1     1     0     1     1     0     1     1     0     0     0     0     0     1     0     0     0     1     0     0     1     0     0     0     1     1列 28 至 541     1     1     0     0     1     1     0     1     1     0     0     1     0     1     0     1     1     1     0     0     0     0     0     0     0     1列 55 至 811     1     1     0     0     1     0     0     1     1     0     0     1     1     1     0     0     1     0     0     0     0     0     1     0     1     0列 82 至 1081     0     1     0     1     1     0     1     0     0     1     1     1     0     1     1     1     1     1     0     0     1     0     0     1     1     1列 109 至 1350     1     0     1     1     1     0     0     1     1     0     0     0     0     1     1     0     0     0     0     0     0     1     1     0     0     0列 136 至 1621     0     0     0     0     1     0     0     1     0     0     1     1     1     1     0     0     0     1     1     1     1     0     0     0     0     0列 163 至 1891     0     0     1     0     1     1     0     1     1     1     1     0     0     1     1     0     1     0     0     1     0     1     0     1     1     1列 190 至 2160     0     0     1     0     1     0     0     1     0     0     1     0     0     1     1     1     1     0     0     1     0     1     1     0     0     1列 217 至 2431     0     1     1     0     0     1     1     0     0     1     1     1     0     0     0     1     1     0     0     1     0     1     0     0     0     0列 244 至 2701     0     1     0     0     1     1     1     0     0     1     0     1     0     0     1     1     1     0     1     0     0     1     0     1     0     1列 271 至 2880     1     1     1     0     0     0     0     0     1     0     0     1     1     0     0     0     1

  测试数据经过前面章节的扰码、编码、删余、交织,然后进行如下的调制映射:

%% 调制映射
mod_out = qammod(int_lea_2_out', 2^M, 'InputType', 'bit', 'UnitAveragePower', true, 'PlotConstellation', true)';%复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示。
q = quantizer('fixed','round','saturate',[8,6]);
mod_out_q = num2bin(q,mod_out);%量化
mod_out = bin2num(q,mod_out_q);%反量化

  调制映射结果如下:

mod_out =列 1 至 8-0.9531 - 0.3125i   0.3125 + 0.9531i  -0.9531 + 0.9531i  -0.9531 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.9531i  -0.3125 - 0.9531i   0.3125 - 0.3125i列 9 至 160.3125 + 0.9531i  -0.9531 - 0.9531i   0.3125 - 0.9531i   0.9531 - 0.3125i  -0.9531 + 0.9531i   0.3125 + 0.3125i   0.3125 - 0.9531i   0.9531 + 0.9531i列 17 至 24-0.9531 - 0.9531i  -0.9531 + 0.9531i  -0.3125 - 0.9531i   0.9531 + 0.9531i  -0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.3125i   0.9531 + 0.3125i列 25 至 32-0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 + 0.3125i   0.9531 + 0.3125i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.9531 - 0.9531i   0.3125 - 0.3125i列 33 至 40-0.3125 + 0.3125i  -0.9531 + 0.9531i  -0.3125 - 0.9531i  -0.9531 + 0.9531i   0.3125 + 0.3125i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.9531 - 0.9531i列 41 至 480.3125 + 0.3125i   0.3125 - 0.3125i  -0.9531 + 0.3125i  -0.9531 + 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.3125i  -0.9531 + 0.9531i  -0.9531 - 0.3125i列 49 至 560.9531 + 0.9531i  -0.9531 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.9531 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.3125i列 57 至 64-0.3125 - 0.3125i   0.3125 + 0.3125i  -0.9531 + 0.9531i  -0.3125 - 0.9531i  -0.3125 - 0.3125i   0.3125 - 0.9531i   0.9531 - 0.3125i   0.9531 + 0.9531i列 65 至 720.9531 + 0.9531i  -0.3125 + 0.9531i  -0.9531 + 0.9531i  -0.3125 - 0.3125i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.3125 + 0.9531i  -0.3125 + 0.9531i列 73 至 800.3125 - 0.9531i  -0.9531 - 0.3125i  -0.3125 - 0.3125i   0.3125 + 0.3125i   0.9531 - 0.3125i   0.3125 - 0.9531i   0.3125 - 0.9531i   0.9531 + 0.3125i列 81 至 880.3125 - 0.9531i  -0.3125 + 0.3125i   0.3125 + 0.3125i   0.9531 - 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.9531i   0.3125 - 0.3125i   0.9531 + 0.3125i列 89 至 960.3125 - 0.9531i   0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.3125i   0.9531 - 0.3125i   0.3125 - 0.9531i  -0.3125 - 0.9531i

5.ModelSim仿真

  按照如下图所示进行连接,输入测试数据进行仿真:

  仿真结果如下图所示:

  将仿真结果存为txt文件,在Matlab里面读出来与Matlab的仿真结果进行比较,代码如下:

clc;
%% 串并转换
test_data = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/test_data.txt')';
display(test_data);
FPGA_S2P2S = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/u2_data_out.txt')';
display(FPGA_S2P2S);
check_S2P = test_data == FPGA_S2P2S; 
display(check_S2P);
%% 扰码
FPGA_scram_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/scram_data_out.txt')';
display(scram_out0);
display(FPGA_scram_dout);
check_scram = FPGA_scram_dout == scram_out0;
display(check_scram);
%% 卷积编码
FPGA_conv_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/conv_data_out.txt')';
display(conv_out0);
display(FPGA_conv_dout);
check_conv = FPGA_conv_dout == conv_out0;
display(check_conv);
%% 删余
FPGA_punt_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/punt_data_out.txt')';
display(conv_out);
display(FPGA_punt_dout);
check_punt = FPGA_punt_dout == conv_out;
display(check_punt);
%% 一级交织
FPGA_intv1_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/intv1_data_out.txt')';
display(int_lea_1_out);
display(FPGA_intv1_dout);
check_intv1 = FPGA_intv1_dout == int_lea_1_out;
display(check_intv1);
%% 二级交织
FPGA_intv2_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/intv2_data_out.txt')';
display(int_lea_2_out);
display(FPGA_intv2_dout);
check_intv2 = FPGA_intv2_dout == int_lea_2_out;
display(check_intv2);
%% 调制映射
FPGA_Re_map_dout = readlines('D:/FPGA/OFDM_802.11a_my/TX/matlab/map_Re_data_out.txt','EmptyLineRule','skip')';
FPGA_Im_map_dout = readlines('D:/FPGA/OFDM_802.11a_my/TX/matlab/map_Im_data_out.txt','EmptyLineRule','skip')';
% FPGA_Re_map_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/map_Re_data_out.txt')';
% FPGA_Im_map_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/map_Im_data_out.txt')';
% display(FPGA_Re_map_dout);
% display(FPGA_Im_map_dout);
q = quantizer('fixed','round','saturate',[8,6]);
FPGA_Re_map_dout = bin2num(q,FPGA_Re_map_dout);
FPGA_Im_map_dout = bin2num(q,FPGA_Im_map_dout);
FPGA_Re_map_dout = cell2mat(FPGA_Re_map_dout);
FPGA_Im_map_dout = cell2mat(FPGA_Im_map_dout);
FPGA_map_dout = FPGA_Re_map_dout + 1j*FPGA_Im_map_dout;
display(mod_out.');
display(FPGA_map_dout);
check_map = FPGA_map_dout == mod_out.';
display(check_map);

  FPGA调制映射的输出为:

FPGA_map_dout =列 1 至 8-0.9531 - 0.3125i   0.3125 + 0.9531i  -0.9531 + 0.9531i  -0.9531 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.9531i  -0.3125 - 0.9531i   0.3125 - 0.3125i列 9 至 160.3125 + 0.9531i  -0.9531 - 0.9531i   0.3125 - 0.9531i   0.9531 - 0.3125i  -0.9531 + 0.9531i   0.3125 + 0.3125i   0.3125 - 0.9531i   0.9531 + 0.9531i列 17 至 24-0.9531 - 0.9531i  -0.9531 + 0.9531i  -0.3125 - 0.9531i   0.9531 + 0.9531i  -0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.3125i   0.9531 + 0.3125i列 25 至 32-0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 + 0.3125i   0.9531 + 0.3125i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.9531 - 0.9531i   0.3125 - 0.3125i列 33 至 40-0.3125 + 0.3125i  -0.9531 + 0.9531i  -0.3125 - 0.9531i  -0.9531 + 0.9531i   0.3125 + 0.3125i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.9531 - 0.9531i列 41 至 480.3125 + 0.3125i   0.3125 - 0.3125i  -0.9531 + 0.3125i  -0.9531 + 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.3125i  -0.9531 + 0.9531i  -0.9531 - 0.3125i列 49 至 560.9531 + 0.9531i  -0.9531 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.9531 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.3125i列 57 至 64-0.3125 - 0.3125i   0.3125 + 0.3125i  -0.9531 + 0.9531i  -0.3125 - 0.9531i  -0.3125 - 0.3125i   0.3125 - 0.9531i   0.9531 - 0.3125i   0.9531 + 0.9531i列 65 至 720.9531 + 0.9531i  -0.3125 + 0.9531i  -0.9531 + 0.9531i  -0.3125 - 0.3125i   0.9531 - 0.3125i   0.3125 + 0.3125i   0.3125 + 0.9531i  -0.3125 + 0.9531i列 73 至 800.3125 - 0.9531i  -0.9531 - 0.3125i  -0.3125 - 0.3125i   0.3125 + 0.3125i   0.9531 - 0.3125i   0.3125 - 0.9531i   0.3125 - 0.9531i   0.9531 + 0.3125i列 81 至 880.3125 - 0.9531i  -0.3125 + 0.3125i   0.3125 + 0.3125i   0.9531 - 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.9531i   0.3125 - 0.3125i   0.9531 + 0.3125i列 89 至 960.3125 - 0.9531i   0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.3125i   0.9531 - 0.3125i   0.3125 - 0.9531i  -0.3125 - 0.9531i

  与Matlab仿真结果对比如下:

check_map =1×96 logical 数组列 1 至 411   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 42 至 821   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 83 至 961   1   1   1   1   1   1   1   1   1   1   1   1   1

  两个OFDM符号调制映射之后为96个输出,对比逻辑结果全为‘1’,说明FPGA该模块设计完全正确,作者测试了其他调制方案和数据速率都是正确的,这里不再重复赘述。感兴趣的可以自行进行测试。

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

6.verilog代码

verilog代码链接

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

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

相关文章

计算机毕设

随着社会和国家的重视,大学对于大学生毕业设计越来越重视。 做软件设计设计方面,前后端分离是必不可少的,代码管理工具,前后端接口测试是项目中必须要用到的工具。做大数据设计方面,主要是要用到爬虫进行数据爬取&…

Unity初级---初识生命周期

1. Awake() :唤醒函数,最先执行的函数,只执行一次,当脚本文件挂载的对象被激活时调用 2. OnEnable() ,OnDisable():当脚本启用和禁用时触发,可执行多次,触发的前提是脚本挂载的对象…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题,会直接影响到企业的日常运作,甚至直接关系到企业能不能继续存活,因此现金流量表是企业财务分析中重要报表之一,也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频

✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型(LLMs)自动化和加速从仿真(sim)到现实世界(real)转移的技术。在机器人技能学习领域&#x…

线程池(一)

1.线程池的基本概念 1.1 什么是线程池: 线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的…

学习强国手机助手

前景: 用手机刷学习强国时要一直盯着手机,总感觉费时费劲,刚好最近学习python写个小工具帮忙自动学习,实现了文章和视频学习,答题类不一定都能正确。上班时电脑连着USB就可以放那,自己可以上班干自己事情。…

内网端口转发与代理

思路:渗透的前提是双方能够建立通信。目前无法和win7建立通信,但是拿到了windows2003的权限,所以可以在Windows2003主机上面建立节点,作为跳板机去访问到内网。 目前状态:控制win2003(IP:192.1…

扩展学习|一文读懂知识图谱

一、知识图谱的技术实现流程及相关应用 文献来源:曹倩,赵一鸣.知识图谱的技术实现流程及相关应用[J].情报理论与实践,2015, 38(12):127-132. (一)知识图谱的特征及功能 知识图谱是为了适应新的网络信息环境而产生的一种语义知识组织和服务的方…

第8篇:创建Nios II工程之读取Switch的值<一>

Q:本期我们再添加一个PIO组件设为输入,创建Nios II工程读取输入值显示在LED上。 A:在前2期创建的控制LED工程的Platform Designer系统基础上再添加一个PIO核,参数设置为18位和单向输入模式,表示DE2-115开发板上的18个…

Ubuntu进行换源

各种源大全 在此地 // 此源均只适用Ubuntu 18.04 版本,其他版本需要修改 bionic 为对应的Ubuntu版本#阿里云源地址 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security ma…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的,只是没有区分环境,都混在一起了, 一般在想要删除一个虚拟环境,除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹, 还…

Vector Laboratories|用于生物偶联疗法BioDesign™ dPEG® Linker连接平台

术语dPEG代表“离散PEG(discrete PEG)”,这是一种均一的、单分子量(MW)、高纯度的新一代聚乙二醇聚合物。Vector Laboratorie采用其受专利保护的专有生产工艺,可生产提供适合于各种应用场景,具有…

在做题中学习(50):搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode) 解法:二分查找 思路:题目是有序的,时间复杂度O(logN),二分没跑了,题目说如果找不到target,返回它应该被插入位置的下标,所以可以分析一下示例2…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…

“Postman 中文版使用教程:如何切换到中文界面?”

Postman 的很好用的接口测试软件。但是,Postman 默认是英文版的,也不支持在软件内切换为中文版。很多同学的英语并不是很好,看到一堆的英文很是头痛。 今天我们来介绍下:切换到 Postman 中文版的方法。想要学习更多的关于 Postma…

药物代谢动力学学习笔记

一、基本概念 二、经典房室模型 三、非线性药物代谢动力学 四、非房室模型 五、药代动力学与药效动力学 六、生物等效性评价 七、生物样品分析方法 基本概念 生物样品:生物机体的全血、血浆、血清、粪便、尿液或其他组织的样品 特异性,specificity&…

nvcc: command not found

nvcc: command not found nvcc命令是 NVIDIA CUDA 编译器,就类似于gcc是c语言的编译器,用于编译 CUDA 代码并生成 GPU 可执行文件。由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在CPU上的ho…

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址:revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场,它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…

消费金融平台公司如何做大做强自营产品

本文来自于2019年的某次内部分享沟通会,部分敏感内容已做删减。

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…