matlab仿真 数字信号载波传输(上)

news2024/12/23 14:26:05

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

 

clear all
nsymbol=100000;%每种信噪比下的发送符号数
T=1;%符号周期
fs=100;%每个符号的采样点数
ts=1/fs;%采样时间间隔
t=0:ts:T-ts;%时间矢量
fc=10;%载波频率
c=sqrt(2/T)*cos(2*pi*fc*t);%载波信号(1)

M=4;%4-PAM
graycode=[0 1 3 2];%格雷编码准则
EsN0=0:15;%信噪比,Es/N0
snr1=10.^(EsN0/10);%信噪比转化为线性值
msg=randi([0 3],1,nsymbol);%消息数据
msg1=graycode(msg+1);%格雷映射        
msgmod=pammod(msg1,M).';%基带4-PAM调制

tx=msgmod*c;%载波调制(2)
tx1=reshape(tx.',1,length(msgmod)*length(c));
spow=norm(tx1).^2/nsymbol;%求每个符号的平均功率(3)
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));%加入高斯白噪声(4)
    rx=tx1+sigma*randn(1,length(tx1));
    rx1=reshape(rx,length(c),length(msgmod));
    y=(c*rx1)/length(c);%相关运算(5)
    y1=pamdemod(y,M);
    decmsg=graycode(y1+1);
    [err,ber(indx)]=biterr(msg,decmsg,log2(M));%误比特率
    [err,ser(indx)]=symerr(msg,decmsg);%误符号率
end
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,1.5*qfunc(sqrt(0.4*snr1)));(6)
title('4-PAM载波信号在AWGN信道下的性能');
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率')

(1)由式7-4可知,传输信号的波形需要乘上根号下(2/T),保证PAM信号不是带限的.

(2)由式7-6可知,调制信号等于PAM调制乘上载波信号

(3)norm是求范数,其中默认情况是求二范数,二范数求后再平方等于幅度值的平方和,即符号的能量,除以符号的长度即为符号的功率。

(4)这里是用信噪比和信号功率求出噪声幅度,首先在求功率的时候使用了幅度的平方,所以最外面需要加上根号

个人理解为在计算噪声幅度时使用的是白噪声的功率谱密度进行计算,而信噪比的计算使用的是噪声的功率,两者的关系为:白噪声的功率谱密度=噪声功率/2。

(5)rx1是已调信号,c是载波,即为对载波进行互相关运算(式7-9)

(6)见式7-12,其中由于是PAM,所以式子中的M=4

 

 

 

clear all
nsymbol=100000;%每种信噪比下的发送符号数
T=1;%符号周期
fs=100;%每个符号的采样点数
ts=1/fs;%采样时间间隔
t=0:ts:T-ts;%时间矢量
fc=10;%载波频率
c=sqrt(2/T)*exp(j*2*pi*fc*t);%载波信号

c1=sqrt(2/T)*cos(2*pi*fc*t);
c2=-sqrt(2/T)*sin(2*pi*fc*t);
M=8;%8-PSK
graycode=[0 1 2 3 6 7 4 5];%格雷编码准则
EsN0=0:15;%信噪比,Es/N0
snr1=10.^(EsN0/10);%信噪比转化为线性值
msg=randi([0 7],1,nsymbol);%消息数据
msg1=graycode(msg+1);%格雷映射        
msgmod=pskmod(msg1,M).';%基带8-PSK调制

tx=real(msgmod*c);%载波调制(1)
tx1=reshape(tx.',1,length(msgmod)*length(c));
spow=norm(tx1).^2/nsymbol;%求每个符号的平均功率
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));%加入高斯白噪声
    rx=tx1+sigma*randn(1,length(tx1));
    rx1=reshape(rx,length(c),length(msgmod));
    r1=(c1*rx1)/length(c1);%相关运算
    r2=(c2*rx1)/length(c2);%相关运算
    r=r1+j*r2;
    y=pskdemod(r,M);
    decmsg=graycode(y+1);
    [err,ber(indx)]=biterr(msg,decmsg,log2(M));%误比特率
    [err,ser(indx)]=symerr(msg,decmsg);%误符号率
end
ser1=2*qfunc(sqrt(2*snr1)*sin(pi/M));
ber1=1/log2(M)*ser1;    
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
title('8-PSK载波信号在AWGN信道下的性能');
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

8-PSK与4-PAM的区别有以下几点

首先是采用的格雷码映射方式更多了;在调制时直接与复载波相乘,在解调时则需要同时与同向载波和正交载波求互相关,构造r=r1+j*r2后才能进行psk解调。

(1)注意这里,和载波相乘后还要取实部,这里和PAM是不同的,PAM在和载波相乘后是不需要取实部的,关键在于两种信号的定义式,由式7-13可知,在与载波相乘后前面还要用Re进行处理(即取实部),而根据式7-3,PAM在与载波相乘后是不需要取实部的。

 

clear all
M=4;
msg=[1 2 3 0 3 2 1 1];%(2)
ts=0.01;
T=1;
t=0:ts:T;
x=0:ts:length(msg);
fc=1;
c=sqrt(2)*exp(j*2*pi*fc*t);%(1)
msg_psk=pskmod(msg,M).';
msg_dpsk=dpskmod(msg,M).';
tx_psk=real(msg_psk*c);
tx_psk=reshape(tx_psk.',1,length(msg)*length(t));
tx_dpsk=real(msg_dpsk*c);
tx_dpsk=reshape(tx_dpsk.',1,length(msg)*length(t));
subplot(2,1,1)
plot(x,tx_psk(1:length(x)));%(3)
title('4PSK信号波形')
xlabel('时间t'),ylabel('载波振幅')
subplot(2,1,2)
plot(x,tx_dpsk(1:length(x)))
title('4DPSK波形')
xlabel('时间t'),ylabel('载波振幅')  

(1):这里需要乘上sqrt(2/T),又因为T=1,所以直接乘上根号2

(2):这里因为已经经过gray编码了,相较于上题省略了步骤

(3):这里需要画出信号的波形,画图横坐标为t,纵坐标为载波振幅

值得注意的是,其中x的长度为801,而tx_psk的长度为808;两者不相等

首先,一个符号传递的时间为T=1秒,所以一共有8个符号(PSKMOD处理后信号的长度不变,仍然是8个),所以整个信号传输共8秒,这里的抽样时间间隔为0.01,所以理论上一共有800个点,实际上t为101,就是因为算上了0这个点,在x的向量中也算上了0这个点,所以长为801,但是在进行载波调制的时候使用的是用t构造出来的c(长度也为101)和msg_psk(长度为8)相乘,结果出现了808的长度,

本质原因是x和t两个表示时间的向量相互之间长度并不是8倍的关系

个人建议可以修改为

clear all
M=4;
msg=[1 2 3 0 3 2 1 1];
ts=0.01;%抽样时间间隔
T=1;
t=0:ts:T-ts;
x=0:ts:length(msg)-ts;
fc=1;
c=sqrt(2)*exp(j*2*pi*fc*t);
msg_psk=pskmod(msg,M).';
msg_dpsk=dpskmod(msg,M).';
tx_psk=real(msg_psk*c);
tx_psk=reshape(tx_psk.',1,length(msg)*length(t));
tx_dpsk=real(msg_dpsk*c);
tx_dpsk=reshape(tx_dpsk.',1,length(msg)*length(t));
subplot(2,1,1)
plot(x,tx_psk(1:length(x)));
title('4PSK信号波形')
xlabel('时间t'),ylabel('载波振幅')
subplot(2,1,2)
plot(x,tx_dpsk(1:length(x)))
title('4DPSK波形')
xlabel('时间t'),ylabel('载波振幅') 

这样x和dpsk的长度均为800,也比较好解释图像的物理意义,x上的两个点之间的距离就代表一个抽样时间间隔0.01,8个符号中每个符号都取样了100次,所以表示8个符号一共使用了800个点。

从此例子来看,dpsk和psk调制方式近似,只不过是使用的函数不一致,一个是pskmod,另一个是dpskmod

clear all
nsymbol=100000;
M=8;
graycode=[0 1 2 3 6 7 4 5];
EsN0=5:20;
snr1=10.^(EsN0/10);
msg=randi([0,7],1,nsymbol);
msg1=graycode(msg++1);
msgmod=dpskmod(msg1,M);
spow=norm(msgmod).^2/nsymbol;
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));
    rx=msgmod+sigma*(randn(1,length(msgmod))+j*randn(1,length(msgmod)));%(1)
    y=dpskdemod(rx,M);
    decmsg=graycode(y+1);
    [err,ber(indx)]=biterr(msg(2:end),decmsg(2:end),log2(M));
    [err,ser(indx)]=symerr(msg(2:end),decmsg(2:end));
end
ser1=2*qfunc(sqrt(snr1)*sin(pi/M));
ber1=1/log2(M)*ser1;
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
title('8-DPSK载波调制信号在AWGN信道下的性能')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

 这个例子中提到了基带等效的概念,本人认为就是直接在基带信号上加上了干扰,在之前7.3的例子中,我们经过格雷映射和psk调制之后还经过了载波调制,然后干扰加上已调载波上,之后对载波进行解调,但是在此例子中,我们直接在dpsk调制之后加上了干扰,没有用信号调制载波,也就是中间省略了一些调制解调的步骤。

(1)这里注意直接在基带信号上加干扰的过程,因为我们在例7.3中加上干扰信号时已经对信号取了实部,所以可以直接加上randn(式7-3),但是本例中没有取实部,所以我们需要在实部和虚部中都加上高斯白噪声的干扰(randn)

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

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

相关文章

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…

GPT-4o Mini:探索最具成本效益的小模型在软件开发中的应用

随着人工智能技术的迅猛发展,自然语言处理(NLP)领域也取得了显著的进步。OpenAI 最新发布的 GPT-4o Mini 模型,以其卓越的性能和极具竞争力的价格,成为了广大开发者关注的焦点。作为一名长期关注人工智能及其在软件开发…

基于JSP、java、Tomcat三者的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持:JAVA、JSP 服务器:TOMCAT 7.0.86 编程软件:IntelliJ IDEA 2021.1.3 x64 首先我们打开页面,准备搭建项目的初始准备 1.New Project 2.随后点击Next,勾…

自定义 RAG 工作流:在 IDE 中结合 RAG 编排,构建可信的编码智能体

构建编码智能体并非一件容易的事。结合我们在 AutoDev、ArchGuard Co-mate、ChocoBuilder 等智能体项目的经验,我们开始思考在 Shire 语言中提供一种新的 RAG 工作流。结合我们先前构建的 IDE 基础设施(代码生成、代码校验、代码执行等接口)&…

【SQL 新手教程 1/20】SQL语言MySQL数据库 简介

💗 什么是SQL?⭐ (Structured Query Language) 结构化查询语言,是访问和处理关系数据库的计算机标准语言 无论用什么编程语言(Java、Python、C……)编写程序,只要涉及到操作关系数据库都必须通过SQL来完成 …

蚂蚁集团Android一面凉经(2024)

蚂蚁集团Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《蚂蚁集团Android一面凉经(2024)》。 面试职位: 蚂蚁集团-Android/iOS开发工程师-支…

优秀需求缺陷管理工具推荐及选购技巧

国内外主流的10款需求缺陷管理工具对比:PingCode、Worktile、禅道、Teambition、TAPD、Trello、简道云、Jira 、Bugzilla、Asana。 在选择需求缺陷管理工具时,面对众多选项,许多人可能感到困惑。不管是初创公司还是大型企业,都需要…

N3 - Pytorch文本分类入门

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 文本分类的基本流程常用的数据清洗方法如何使用jieba实现英文分词如何构建文本向量代码实践数据准备构建词典生成数据批次和迭代器模型设计模型创建模型训…

【vluhub】zabbix漏洞

介绍: zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…

[C++实战]日期类的实现

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

软件测试--测试管理与缺陷管理

文章目录 目标重点/难点 案例引入软件测试管理定义测试组织的定义独立组织测试的优缺点 测试管理——测试计划定义测试计划的持续活动 测试管理的准则出口准则入口准则 软件测试管理 | 测试用例的管理测试用例管理的重要性测试用例管理要解决的问题如何组织测试用例如何报告测试…

关于if return的组合来实现if else效果

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于if return的组合来实现if else效果 前言一、if return 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、if return // 在链表中插入节点…

Apache POI-Excel入门与实战

目录 一、了解Apache POI 1.1 什么是Apache POI 1.2 为什么要使用ApaChe POI 1.3 Apache POI应用场景 1.4 Apache POI 依赖 二、Apache POI-Excel 入门案例 2.1 写入Excel文件 2.2 读取文件 四、Apache POI实战 4.1 创建一个获取天气的API 4.2高德天气请求API与响应…

vs code解决报错 (c/c++的配置环境 远端机器为Linux ubuntu)

参考链接:https://blog.csdn.net/fightfightfight/article/details/82857397 https://blog.csdn.net/m0_38055352/article/details/105375367 可以按照步骤确定那一步不对,如果一个可以就不用往下看了 目录 一、检查一下文件扩展名 二、安装扩展包并…

秒杀案例-分布式锁Redisson、synchronized、RedLock

模拟秒杀 源码地址前期准备创建数据库表导入数据dependenciespomControllerTSeckillProductTseckillProductServiceTseckillProductServiceImplTseckillProductMapperTseckillProductMapper.xml使用JMeter压力测试开始测试超卖现象原因解决办法更改数据库库存500进行JMeter压力…

linux_top命令打印结果_PID USER PR NI VIRT RES SHR S 什么意思

top命令输出结果 含义 top 命令是 Linux 和 Unix 系统中用于实时显示系统中各个进程的资源占用情况的工具。当你运行 top 命令并查看输出结果时,会看到类似下面的列(具体的列可能因 top 的版本和配置而有所不同): PID: 进程ID&a…

NSS [NSSRound#4 SWPU]ez_rce

NSS [NSSRound#4 SWPU]ez_rce CVE-2021-41773 Apache Httpd Server 路径穿越漏洞 POC: GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1 Host: node4.anna.nssctf.cn:28690 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Window…

C/C++教程合集(完)

C初级教程(非常基础,适合入门)入门C语言只需一个星期(星期一)入门C语言只需一个星期(星期二)入门C语言只需一个星期(星期三)入门C语言只需一个星期(星期四)入门C语言只需一个星期&am…

NSS [NSSRound#13 Basic]flask?jwt?

NSS [NSSRound#13 Basic]flask?jwt? 开题 注册一下 要admin才能拿flag 看看是如何进行身份验证的 是flask session flask-unsign --decode --cookie .eJwtzjESwyAMBMC_UKfghJCEP-MRICZp7bjK5O9xkX6L_aR9HXE-0_Y-rnik_TXTlsiXEhUXleKGGGuG1jbmogrCEmNirZ7BEB-VJbTfIi-26hQD…

数据库实例迁移实践

背景 随着业务发展,数据库实例磁盘逐渐升高,告警频繁,且后续可能会对DDL产生影响(尤其是借助ghost等工具执行的DDL)。 该实例有多个库,则需要迁移其中的一个或几个单库到其他实例,为什么不做分…