当前位置: 首页 > news >正文

IEEE 802.11a OFDM系统的仿真(续)

 (内容源自详解MATLAB/SIMULINK 通信系统建模与仿真   刘学勇编著第九章内容,有兴趣的读者请阅读原书) 

clear all
%%%%%%%参数设计部分%%%%%%%Nsp=52;%系统子载波数(不包括直流载波)
Nfft=64;%FFT长度
Ncp=16;%循环前缀长度
Ns=Nfft+Ncp;%一个完整OFDM长度
noc=53;%包含直流载波的总的子载波数
Nd=6;%每帧包含的OFDM符号数(不包括训练符号)
M1=4;%QPSK调制
M2=16;%16QAM调制
sr=250000;%OFDM符号速率
EbN0=0:2:30;%归一化信噪比
Nfrm=1000;%每种信噪比下的仿真帧数
ts=1/sr/Ns;%OFDM抽样时间间隔
t=0:ts:(Ns*(Nd+1)*Nfrm-1)*ts;%抽样时刻
fd=100;%最大多普勒平移
h=rayleigh(fd,t);%生成单径瑞利信道
h1=sqrt(2/3)*h;%生成二径衰落信道(1)
h2=sqrt(1/3)*rayleigh(fd,t);
h2=[zeros(1,4) h2(1:end-4)];%训练符号频域数据,采用802.11a中的长训练符号数据    
Preamble=[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 1   1 -1 -1 1 -1   1 -1 1 1 1 1];
Preamble1=zeros(1,Nfft);
Preamble1(2:27)=Preamble(27:end);%训练符号重拍后的数据
Preamble1(39:end)=Preamble(1:26);
preamble1=ifft(Preamble1);%训练符号时域数据
preamble1=[preamble1(Nfft-Ncp+1:end) preamble1];%加入循环前缀%%%%%%%仿真循环%%%%%%%
for ii=1:length(EbN0)%******发射机部分******msg1=randsrc(Nsp,Nd*Nfrm,[0:M1-1]);%QPSK信息数据msg2=randsrc(Nsp,Nd*Nfrm,[0:M2-1]);%16-QAM信息数据data1=pskmod(msg1,M1,pi/4);%QPSK调制data2=qammod(msg2,M2)/sqrt(10);%16QAM调制并归一化data3=zeros(Nfft,Nd*Nfrm);%根据FFT要求,对数据重排data4=zeros(Nfft,Nd*Nfrm);data3(2:27,:)=data1(27:end,:);data3(39:end,:)=data1(1:26,:);          data4(2:27,:)=data2(27:end,:);data4(39:end,:)=data2(1:26,:);clear data1 data2;%清除不必要的临时变量data3=ifft(data3);%IFFT变换data4=ifft(data4);data3=[data3(Nfft-Ncp+1:end,:);data3];%加入循环前缀data4=[data4(Nfft-Ncp+1:end,:);data4];spow1=norm(data3,'fro').^2/(Nsp*Nd*Nfrm);%计算数据符号能量spow2=norm(data4,'fro').^2/(Nsp*Nd*Nfrm);data5=zeros(Ns,(Nd+1)*Nfrm);%加入训练符号data6=data5;for indx=1:Nfrmdata5(:,(indx-1)*(Nd+1)+1)=preamble1.';data5(:,(indx-1)*(Nd+1)+2 :indx*(Nd+1))=data3(:,(indx-1)*Nd+1:indx*Nd);data6(:,(indx-1)*(Nd+1)+1)=preamble1.';data6(:,(indx-1)*(Nd+1)+2 :indx*(Nd+1))=data4(:,(indx-1)*Nd+1:indx*Nd);endclear data3 data4data5=reshape(data5,1,Ns*(Nd+1)*Nfrm);%并串变换data6=reshape(data6,1,Ns*(Nd+1)*Nfrm);data51=zeros(1,length(data5));data61=zeros(1,length(data6));data51(5:end)=data5(1:end-4);data61(5:end)=data6(1:end-4);sigma1=sqrt(1/2*spow1/log2(M1)*10.^(-EbN0(ii)/10));%根据EbN0计算噪声标准差sigma2=sqrt(1/2*spow2/log2(M2)*10.^(-EbN0(ii)/10));for indx=1:Nfrmdd1=data5((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));%当前帧的发射数据dd2=data6((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));dd3=data51((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));dd4=data61((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));hh=h((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));%当前帧的单径信道参数hh1=h1((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));%当前帧的二径信道参数hh2=h2((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));%信号通过单径瑞利衰落信道,并加入高斯白噪声(2)r1=hh.*dd1+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));r2=hh.*dd2+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2))); %信号通过2径瑞利衰落信道,并加入高斯白噪声r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));r21=hh1.*dd2+hh2.*dd4+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2))); r1=reshape(r1,Ns,Nd+1);%串并变换r2=reshape(r2,Ns,Nd+1);r11=reshape(r11,Ns,Nd+1);%串并变换r21=reshape(r21,Ns,Nd+1); r1=r1(Ncp+1:end,:);%移除循环前缀r2=r2(Ncp+1:end,:);r11=r11(Ncp+1:end,:);r21=r21(Ncp+1:end,:);R1=fft(r1);%fft运算R2=fft(r2);R11=fft(r11);R21=fft(r21);R1=[R1(39:end,:);R1(2:27,:)];R2=[R2(39:end,:);R2(2:27,:)];R11=[R11(39:end,:);R11(2:27,:)];R21=[R21(39:end,:);R21(2:27,:)];HH1=(Preamble.')./R1(:,1);%信道估计HH2=(Preamble.')./R2(:,1);HH11=(Preamble.')./R11(:,1);HH21=(Preamble.')./R21(:,1);HH1=HH1*ones(1,Nd);HH2=HH2*ones(1,Nd);HH11=HH11*ones(1,Nd);HH21=HH21*ones(1,Nd);x1=R1(:,2:end).*HH1;x2=R2(:,2:end).*HH2;x3=R11(:,2:end).*HH11;x4=R21(:,2:end).*HH21;x1=pskdemod(x1,M1,pi/4);%数据解调x2=qamdemod(x2.*sqrt(10),M2);x3=pskdemod(x3,M1,pi/4);%数据解调x4=qamdemod(x4.*sqrt(10),M2);%统计一帧中的错误比特数[neb1(indx),temp]=biterr(x1,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1));[neb2(indx),temp]=biterr(x2,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));[neb3(indx),temp]=biterr(x3,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1));[neb4(indx),temp]=biterr(x4,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
end
ber1(ii)=sum(neb1)/(Nsp*log2(M1)*Nd*Nfrm);%理想信道估计的误比特率
ber2(ii)=sum(neb2)/(Nsp*log2(M2)*Nd*Nfrm);ber3(ii)=sum(neb3)/(Nsp*log2(M1)*Nd*Nfrm);%根据训练符号信道估计的误比特率
ber4(ii)=sum(neb4)/(Nsp*log2(M2)*Nd*Nfrm);endsemilogy(EbN0,ber1,'-ro',EbN0,ber3,'-rv',EbN0,ber2,'-r*',EbN0,ber4,'-rx')
grid on
title('OFDM系统误比特率性能')
legend('QPSK单径信道','QPSK2径信道','16-QAM单径信道','16-QAM二径信道')
xlabel('信噪比(EbN0)')
ylabel('误比特率')

(1)生成2径衰落信道

2径衰落信道表示信号同时通过2个信道,这里的信道设定如下

两径信道的能量之和和单径信道能量之和相等,

两径信道中第二个信道的能量比第一个信道的能量低3dB(也就是能量减半)

又因为信道的能量是信道振幅的平方,设两径信道第一个信道振幅为a,第二个振幅为b

所以a方+b方=1(单径瑞利衰落信道振幅为1)

a方=2*b方

所以a=根号下(2/3),b=根号下(1/3)。

接下来对第二个信道进行延时处理,延时就是在信道前面加0,加0会导致信道的长度变长,将超过指定长度的多余部分直接删掉

(2)信号通过2径衰落信道

即为信号*2径中的第一个信道+信号*2径中的第二个信道+噪声(这里噪声加的是两个信道的总体噪声)

%信号通过2径瑞利衰落信道,并加入高斯白噪声
    r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));
    r21=hh1.*dd2+hh2.*dd4+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));

dd1,QPSK调制得到的单帧信号;

dd2,QAM调制得到的单帧信号

dd3,QPSK调制经过处理与延时的信道一一对应的单帧信号

(因为信道和信号的所有元素要求一一对应,通过信道前面加0实现了信道的延时,为了实现一一对应也需要在信号前面加相同数量的0)

dd4,QAM调制经过处理与延时的信道一一对应的单帧信号

其它内容的推导可以见上一篇文章

相关文章:

IEEE 802.11a OFDM系统的仿真(续)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第九章内容,有兴趣的读者请阅读原书) clear all %%%%%%%参数设计部分%%%%%%%Nsp52;%系统子载波数(不包括直流载波) Nfft64;%FFT长度 Ncp16;…...

Linux cut命令详解使用:掌握高效文本切割

cut 是 Linux 中一个用于从文本文件或标准输入中提取指定字段的命令。它根据分隔符或者字符位置来裁剪文本,是处理文本文件中的字段、列和子字符串的常用工具。 基本语法 cut [选项] 文件或 命令 | cut [选项]常用选项 -b:按字节位置切割&#xff08…...

c++11新特性——endable_shared_from_this

文章目录 一.解决场景代码示例原因 二.解决办法代码 三.底层原理 一.解决场景 一个share_ptr管理的类&#xff0c;如果从类的函数里返回类对象&#xff08;this指针&#xff09;&#xff0c;导致share_ptr引用计数错误&#xff0c;析构时异常问题 代码示例 #include <mem…...

小程序的右侧抽屉开关动画手写效果

<template><view><button click"openDrawer">打开抽屉</button><view v-if"showDrawer" class"drawer" :style"{ backgroundColor: bgColor }" click"closeDrawer"><view class"draw…...

vue3中el-table中点击图片放大时,被表格覆盖

问题&#xff1a;vue3中el-table中点击图片放大时&#xff0c;被表格覆盖。 解决方法&#xff1a;el-image 添加preview-teleported <el-table-column label"封面图" prop"coverUrl"><template #default"scope"><el-imagestyle&q…...

GO学习笔记(4) strconv/time

目录 strconv包1、string与bool之间的转换2、string与int之间的转换 time包1、常用常量定义2、Now&#xff08;&#xff09;获取当前年月日时分秒3、Format&#xff08;&#xff09;时间格式化4、Parse&#xff08;&#xff09;/ ParseInLocation&#xff08;&#xff09;解析时…...

课程管理系统-数据库-基于MySQL的数据库课程设计

目录 前言一、需求分析二、设计数据库模型1.实体关系图(ERD)2.表结构设计三、创建数据库和表四、插入数据五、查询数据六、更新和维护七、安全性与性能优化总结前言 设计一个数据库课程(或任何课程管理系统)时,我们首先需要明确系统的需求和目标。以下是一个基于MySQL的数…...

降维打击 华为赢麻了

文&#xff5c;琥珀食酒社 作者 | 积溪 真是赢麻了 华为估计都懵了 这辈子还能打这么富裕的仗&#xff1f; 其实在苹果和华为的发布会召开之前 我就知道华为肯定会赢 但我没想到 苹果会这么拉胯 华为这是妥妥的降维打击啊 就说这苹果iPhone 16吧 屏幕是变大了、颜色…...

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 版权单位&#xff1a;未来自主研究中心(FIRC) 版权声明&#xff1a;数据集仅仅供个人使用&#xff0c;不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式&#xff1a;Pascal VOC格…...

python 生成的代码,需要帮我生成一个直接在一台没有依赖的电脑上运行的 包

要创建一个可以在没有依赖的电脑上运行的包&#xff0c;你需要将你的代码和所有依赖项打包成一个可执行文件。对于Python项目&#xff0c;这通常意味着使用一些工具来打包你的代码和所有必要的库。以下是一些常用的工具和步骤&#xff1a; 确定依赖&#xff1a;首先&#xff0c…...

【Linux】操作系统与进程

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 &#x1f4cc;操作系统 &#x1f38f;操作系统的概念 &#x1f38f;设计操作系统的目的 &#x1f38f;操作系统对进程的管理 &#x1f579;️操作系统为什么…...

【Linux】 LTG:移动硬盘部署Ubuntu24.04

Ubuntu To Go 是一种便携式的 Ubuntu 操作系统解决方案&#xff0c;允许用户将 Ubuntu 系统安装在 USB 驱动器或其他可移动存储设备上。这样&#xff0c;用户可以在任何支持 USB 启动的计算机上运行 Ubuntu&#xff0c;而无需在本地硬盘上进行安装。 准备工作 移动硬盘&#x…...

Android的logcat日志详解

Android log系统 logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息。下面介绍 adb logcat中的详细参数命令以及如何才能高效的打印日志&#xff0c;或把日志保存到我们指定的位置。 可以输入 adb logcat --help&#xff0c;查看一下一些简…...

【Linux】:信号的保存和信号处理

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来信号的保存和信号处理相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…...

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…...

跨境电商必备保护账号的4个网络环境设置

在跨境电商的世界里&#xff0c;一个稳定可靠的网络环境就是你事业成功的关键&#xff01;但是&#xff0c;不稳定的IP很容易导致账号被封&#xff0c;让你的辛苦付之东流&#xff0c;相信许多小伙伴也经历过莫名其妙的账号封禁情况&#xff01; 为了让大家避免这种心痛的情况…...

Python+requests接口自动化测试框架实例教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…...

【网络安全】DNS重绑定原理详析

原创文章,不得转载。 文章目录 DNSDNS查询过程同源策略DNS重绑定攻击原理DNS重绑定攻击步骤DNS重绑定工具工具一工具二DNS 在网络中,访问网站实际上是通过其对应的 IP 地址实现的,然而,IP 地址往往难以记忆。因此,DNS(域名系统)应运而生。 DNS(Domain Name System)是…...

C语言初识编译和链接

目录 翻译环境和运行环境编译环境预编译编译词法分析语法分析语义分析 汇编 链接运行环境 翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令&#xff08;⼆进制指令&…...

TrinityCore环境搭建

1)https://192.168.3.96:41797/soft/app root jianan2)mysql322bb8f85b0920d9 192.168.3.96 9f5c813fefbbc3aa3) su wow cd /home/wow/TrinityCore/TrinityCore-TDB335.22061/build cmake ../ -DCMAKE_INSTALL_PREFIX/home/wow/server3.5.5 #构建项目cmake ../ -DCMAKE_INSTALL…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...