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

news2024/11/24 17:27:51

 (内容源自详解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:Nfrm
        data5(:,(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);
    end
    
    clear data3 data4
    
    data5=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:Nfrm
    dd1=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);

end

semilogy(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调制经过处理与延时的信道一一对应的单帧信号

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

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

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

相关文章

ppt文档怎么转换成pdf?快来试试这几种转换方法!

ppt文档怎么转换成pdf?在日常工作与学习的广阔舞台上,PPT,这一演示文稿的常青树,无疑是表达创意、传递信息的重要工具,然而,正如每枚硬币都有其两面,PPT在带来便捷的同时,也显露出一…

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中,遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…

Linux基础---05输入输出重定向

一.输出重定向符号> 操作1 > 文件 :将操作1的结果覆盖到文件里,并且此文件之前的数据全部清空。 操作2 >>文件:将操作2的结果追加到文件里,原文件的内容不会被清空。 操作3 1>right.txt 2>wrong.txt:操作3的返…

C 盘突然爆满,罪魁祸首竟然是 ...... !

今天打开电脑的时候突然发现 C 盘进度条变红了,这很不正常! 做软件开发的应该都会经常在各种磁盘中查找文件和资料,也就会频繁打开 此电脑 窗口,因此即使不是刻意去观察各个磁盘的容量,也会时不时瞟一眼每个盘的占用条…

Java特殊文件xml—利用Dom4J解析xml文件(完整详解,附有代码+案例)

文章目录 三十.特殊文件30.1 xml概述30.1 xml文件30.2 Dom4J解析xml30.2.1 案列130.2.2 案例2 三十.特殊文件 30.1 xml概述 可扩展标记语言 可扩展:标签名字可以自己定义 优点:易于阅读,可以配置成组出现的数据 缺点:解析比较复…

对称矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的对称矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵&a…

盐湖卤水中提取铷、铯

盐湖卤水中提取铷、铯是一个复杂但具有重要意义的过程,因为铷、铯是稀有的金属元素,在高科技、航空航天、新能源等领域有广泛应用。以下是从盐湖卤水中提取铷、铯的详细分析:我国盐湖资源丰富,盐类资源总量约12000亿吨&#xff0c…

2024.9.12(k8s环境搭建2)

一、接9.11 19、部署calico的pod 4. 查看容器和节点状态 异常处理: 出现Init:0/3,查看node节点 /var/log/messages是否有除网络异常之外的报错信息 三台机器执行:(更新版本) yum list kernel yum update kernel reb…

i++与++i在for循环中效果一样?

首先说结果 是的,在Visual Studio 2022中,不同于直接printf,在for循环中的i与i是同样的效果(都当作了i) 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客,我目前还看不太明…

关于Spring Cloud 表达式注入漏洞——分析复现

更多漏洞分析复现,可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/5175.html 一、漏洞成因 近期,Spring Cloud官方发布了一则安全公告,修复了一个Spring Cloud Function中的 SPEL表达式注入漏洞。该漏洞是由于Spring Clou…

123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)

啃了几天initf_dm,发现啃不动啊,但是后面的函数比这个简单,要不先把简单的做了吧。 本文接上一篇https://blog.csdn.net/zhaozhi0810/article/details/142050827 一、c的入口 board_init_f 1.3.12 arch_cpu_init_dm(common/board_f.c&#…

AWS账号申请指南:必须绑定银行卡吗?

小伙伴们,大家好!今天九河云来和大家聊一聊一个常见的问题:申请AWS账号时,是否必须要绑定银行卡呢?相信很多小伙伴在注册AWS账号时都会遇到这个问题。为了帮助大家更好地了解这个过程,小编特意整理了一些信…

SprinBoot+Vue旅游景点管理系统设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

模 板

导引: 模板是为了解决函数类型不同所重载,带来的麻烦简化。利用一个模板(示列)代码,让编译器编写出不同类型的代码,满足所需。 int swap(int &p1,int &p2) {int pp1;p1p2;p2p; } char swap(char …

优化安防视频监控的关键体验:视频质量诊断技术如何应用在监控系统中?

随着科技的不断进步,视频监控平台在公安、司法、教育、基础设施等众多领域得到了广泛应用。然而,视频图像的质量直接关系到监控系统的应用效果,是反映监控系统运维效果的重要指标之一。因此,视频监控平台需要配备一系列先进的视频…

基于剂型改良的复杂注射剂分析!

改良型新药在医药领域的重要性日益凸显,其中脂质体注射剂作为一类重要的改良型新药,因其独特的临床优势和技术创新,正受到行业的高度关注。本文基于药融咨询团队的深度分析报告,探讨脂质体注射剂的技术创新、市场前景以及在中国的…

动手学深度学习(三)深度学习计算

一、模型构造 1、继承Module类来构造模型来构造模型 class MLP(nn.Module):# 声明带有模型参数的层,这里声明了两个全连接层def __init__(self, **kwargs):# 调用MLP父类Block的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数# 参数&#xff0c…

利用CubeMX复现正点原子TFTLCD驱动例程

来源:正点原子 FMC的工作原理暂时先欠着,先记录一下CRUD的过程。 第一步准备一个us级别延时函数,不会的参考拙作:STM32的定时器简介-CSDN博客 第二部开启FMC外设: ①进入 Pinout->FMC 配置栏,配置 …

【隐私计算】Paillier半同态加密算法

一、何为同态加密(HE)? HE是一种特殊的加密方法,它允许直接对加密数据执行计算,如加法和乘法,而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的,拥有密钥的用户对处理过的密文数据进…

树莓派5开发板-安装Raspberry Pi系统-学习记录1

树莓派5开发板介绍 树莓派5(Raspberry Pi 5)是树莓派系列最新的开发板,相较于前几代产品,它在性能、连接性和功能方面都有了显著提升。以下是树莓派5的一些主要特点: 处理器:树莓派5搭载了Broadcom BCM27…