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

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

clear all
M=8;
msg=[1 4 3 0 7 5 2 6];
ts=0.01;
T=1;
%t=0:ts:T;  
t=0:ts:T-ts;
%x=0:ts:length(msg);
x=0:ts:length(msg)-ts;
fc=1;
c=sqrt(2)*exp(j*2*pi*fc*t);
msg_qam=qammod(msg,M).';
tx_qam=real(msg_qam*c);
tx_qam=reshape(tx_qam.',1,length(msg)*length(t));
%plot(x,tx_qam(1:length(x)))
plot(x,tx_qam)
title('8QAM信号波形')
xlabel('时间t'),ylabel('载波振幅')
scatterplot(msg_qam)
title('8QAM信号星座图')
xlabel('同相分量'),ylabel('正交分量')

clear all
nsymbol=100000;
M=16;
graycode=[0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10];
EsN0=5:20;
snr1=10.^(EsN0/10);
msg=randi([0,M-1],1,nsymbol);
msg1=graycode(msg+1);
msgmod=qammod(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)));y=qamdemod(rx,M);decmsg=graycode(y+1);[err,ber(indx)]=biterr(msg,decmsg,log2(M));[err,ser(indx)]=symerr(msg,decmsg);
end
P4=2*(1-1/sqrt(M))*qfunc(sqrt(3*snr1/(M-1)));
ser1=1-(1-P4).^2;%理论误符号率
ber1=1/log2(M)*ser1;%理论误比特率(1)
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
title('16QAM载波调制信号在AWGN信道下的影响')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

 (1)在计算理论误比特率时采用的是式7-37,7-38,在计算理论误符号率时,因为这里是16qam,

换一种方式理解就是,符号中有四个比特,只要有一个比特错了整个符号都错了,所以误比特率一定是比误符号率小的。        

clear all
M=4;
T=1;
deltaf=1/T; %FSK的频率间隔
fs=60;%采样频率
ts=1/fs;%采样时间间隔
t=0:ts:T;%一个符号周期的时间矢量
fc=4;%载波频率
msg=[0 1 3 2 randi([0,M-1],1,10000-M)];%消息序列
msg_mod=fskmod(msg,M,deltaf,fs,fs);%4-fsk调制
t1=0:ts:length(msg)-ts;
y=real(msg_mod.*exp(j*2*pi*fc*t1));
subplot(2,1,1)
plot(t1(1:4*fs),y(1:4*fs))%(1)时域信号波形
axis([0 4 -1.5 1.5])
title('4FSK调制的信号波形')
xlabel('时间');ylabel('振幅')
ly=length(y);
freq=[-fs/2:fs/ly:fs/2-fs/ly];
Syy=10*log10(fftshift(abs(fft(y)/fs)));%调制信号频谱
subplot(2,1,2)
plot(freq,Syy)

 (1)这里的图像只画出了前4个符号的图像,我们在设定msg信号的时候就已经确定了前4个符号为0 1 3 2,之后经过fsk调制之后,每个符号采样了60个点,所以4个符号的总长度是240(FSK调制之后用60个点表示一个符号),在使用plot进行函数的绘制时,范围是从1->4*fs=240

clear all
nsymbol=10000; %每种信噪比下的发送符号数
SymbolRate=1000;%符号速率
nsamp=50;%每个符号的取样点数
fs=nsamp*SymbolRate;%取样频率
fd=100;
%chan=rayleighchan(1/fs,fd);
chan=comm.RayleighChannel('SampleRate',fs,'MaximumDopplerShift',fd);%(1)
M=4;
graycode=[0 1 3 2];
EsN0=0:2:20;
snr1=10.^(EsN0/10);
msg=randi([0,M-1],1,nsymbol);   
msg1=graycode(msg+1);
x1=qammod(msg1,M);
x1=rectpulse(x1,nsamp);
x2=fskmod(msg1,M,SymbolRate,nsamp,fs);
spow1=norm(x1).^2/nsymbol;
spow2=norm(x2).^2/nsymbol;
for indx=1:length(EsN0)sigma1=sqrt(spow1/(2*snr1(indx)));sigma2=sqrt(spow2/(2*snr1(indx)));fadeSig1=chan(x1');%(3)%fadeSig1=filter(x1);%(2)%fadeSig2=filter(x2);fadeSig2=chan(x2');rx1=fadeSig1'+sigma1*(randn(1,length(x1))+j*randn(1,length(x1)))%(4);rx2=fadeSig2'+sigma2*(randn(1,length(x2))+j*randn(1,length(x2)));y1=intdump(rx1,nsamp);y1=qamdemod(y1,M);decmsg1=graycode(y1+1);[err,ber1(indx)]=biterr(msg,decmsg1,log2(M));[err,ser1(indx)]=symerr(msg,decmsg1);y2=fskdemod(rx2,M,SymbolRate,nsamp,fs);decmsg2=graycode(y2+1);[err,ber2(indx)]=biterr(msg,decmsg2,log2(M));[err,ser2(indx)]=symerr(msg,decmsg2);
end
semilogy(EsN0,ser1,'-k*',EsN0,ber1,'-ko',EsN0,ser2,'-kv',EsN0,ber2,'-k.');
title('4QAM和4FSK调制信号在瑞利衰落信道下的性能')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('4QAM误符号率','4QAM误比特率','4FSK误符号率','4FSK误比特率')

 FSK的调制方式与QAM相差不多,但是qam经过qammod函数处理之后还需要进行矩形脉冲成形r(rectpulse函数),,与此对应的还有脉冲成形的的逆过程(intdump函数),但是FSK调制不需要脉冲成形,可以在格雷映射完成之后直接调制.

此书中的瑞利信道的产生函数rayleighchan已经在新版本中无法使用了,所以采用新的函数comm.RayleighChannel产生瑞利信号,这个函数的使用方法可以参见

http://t.csdnimg.cn/wOHsA

使用方法简单来说可以是comm.RayleighChannel('属性1',属性1的值,'属性2',属性2的值......)。

但是这里如果直接采用(1)处代码会报错,报错内容为

错误使用 doppler (第 47 行)
类 'comm.RayleighChannel' 中的属性 'DopplerSpectrum' 的默认值无效:
At least 5 parameters are required

这里采取了其它人的解决方案,详见

http://t.csdnimg.cn/CU3Z2

这里我将他的方案重述一遍

首先错误原因是

comm中有2个 doppler,时频工具箱和matlab自带的一些设置冲突
所以我们需要将另一个我们需要的doppler也加入matlab的工作路径中,具体方式如下

在命令行中输入

which doppler

确认目前采用的doppler的位置,

之后

将工具箱中的comm加入路径中

我这里的路径为E:\MATLABR2021a\toolbox\comm\comm

所以在命令行输入

addpath('E:\MATLABR2021a\toolbox\comm\comm');

报错问题解决

继续代码问题,书上的滤波过程采用的函数是filter(2),会报错

错误使用 filter
输入参数的数目不足。

这是因为采用comm.RayleighChannel方法得到的信道有自己的使用方法,使用方法为(3)

注意,此处只能处理列向量,所以需要行转置列,由于在(4)处我们又要使用滤波后的行向量结果,所以再次转置(列转行)

实验结论如下:

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

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

相关文章

决策树基础

概述 决策树是一种树型结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一 个测试输出,每个叶结点代表一种类别。决策树学习采用的是自顶向下的递归方法,其基本思想是以信息熵为度量构造一棵熵值下降最快的树&#xff…

一层5x1神经网络绘制训练100轮后权重变化的图像

要完成这个任务,我们可以使用Python中的PyTorch库来建立一个简单的神经网络,网络结构只有一个输入层和一个输出层,输入层有5个节点,输出层有1个节点。训练过程中,我们将记录权重的变化,并在训练100轮后绘制…

github简单地操作

1.调节字体大小 选择options 选择text 选择select 选择你需要的参数就可以了。 2.配置用户名和邮箱 桌面右键,选择git Bash Here git config --global user.name 用户名 git config --global user.email 邮箱名 3.用git实现代码管理的过程 下载别人的项目 git …

反爬虫限制:有哪些方法可以保护网络爬虫不被限制?

目前,爬虫已经成为互联网数据获取最主流的方式。但为了保证爬虫顺利采集数据,需要防范网站的反爬虫机制,降低IP被限制的风险,这样才能提高爬虫工作的效率。那么,如何防止网络爬虫被限制呢?下面介绍几种有效…

dpdk发送udp报文

dpdk接收到udp报文后,自己构造一个udp报文,将收到的报文中的源mac,目的mac,源ip,目的ip,源端口和目的端口交换下顺序填充到新的udp报文中,报文中的负载数据和收到的udp保持一致。 注&#xff1…

Yarn UI 时间问题,相差8小时

位置 $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-common-2.6.1.jar 查看 jar tf hadoop-yarn-common-2.6.1.jar |grep yarn.dt.plugins.js webapps/static/yarn.dt.plugins.js 解压 jar -xvf hadoop-yarn-common-2.6.1.jar webapps/static/yarn.dt.plugins.js inflated: we…

【文件解析漏洞】实战详解!

漏洞描述: 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件,配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞: IIS6.X: 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹,其目…

传输层(port)UDP/TCP——解决怎么发,发多少,出错了怎么办

**传输层:**负责数据能够从发送端传输接收端. 传输层所封装的报头里一定有:源端口号和目的端口号的。 **端口号:**可以标识一台主机中的唯一一个进程(运用程序),这样当数据传输到传输层的时候就可以通过端…

单向链表(常规和带哨兵)

1.定义 在计算机科学中,链表是数据元素的线性集合,每个元素都指向下一个元素,元素存储上并不连续 2.分类 链表中还有一种特殊的节点称为哨兵结点,也叫哑元结点、首元结点,它不存储数据,通常用作头尾&…

艾体宝干货 | 如何分析关键网络性能指标?持续接收样品试用申请!

网络性能是企业顺利运营的重要基础,而Allegro流量分析仪作为一款强大的网络性能分析工具,为企业提供了深入了解网络运行状况的途径。在本文中,我们将探讨如何利用Allegro 流量分析仪分析关键网络性能指标,以优化网络性能、提高安全…

视频监控国标GB28181平台EasyGBS如何更换默认的SQLite数据库?

视频流媒体安防监控国标GB28181平台EasyGBS视频能力丰富,部署灵活,既能作为业务平台使用,也能作为安防监控视频能力层被业务管理平台调用。国标GB28181视频EasyGBS平台可提供流媒体接入、处理、转发等服务,支持内网、公网的安防视…

Apache2之Ubuntu-XXE漏洞渗透

一、配置靶场 第一步:打开kali,作为攻击机,打开是黑屏不要蒙圈,是正常的 第二步:配置局域网主机 探测局域网内的所有主机-- 1、查看虚拟机的网络配置 2、查看到我的子网地址为192.168.189.0 第三步:使用…

文心智能体零代码开发实践,创建一个智能体:从理论到实践AI技术落地

文心智能体引领零代码智能体开发新风尚,诚邀您一同探索这前沿科技的魅力!以下为实践创建一个叫”从理论到实践AI技术落地“智能体的步骤。 首先登录官网:文心智能体平台AgentBuilder | 想象即现实 登录后点击:创建智能体 输入“…

C语言例题(图形打印,逆序输出,交换数组,平均值)

一.X形图形 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。针对每行输入&#xff0c;输出用“*”组成的X形图案。 代码展示 #include <stdio.h> int main() {int i0;int j…

Vue3 + js-echarts 实现前端大屏可视化

1、前言 此文章作为本人大屏可视化项目的入门学习笔记&#xff0c;以此作为记录&#xff0c;记录一下我的大屏适配解决方案&#xff0c;本项目是基于vite Vue3 js less 实现的&#xff0c;首先看ui&#xff0c;ui是网上随便找的&#xff0c;代码是自己实现的&#xff0c;后面…

LCM接口通讯说明

LCM&#xff08;Liquid Crystal Module&#xff0c;液晶模块&#xff09;接口通讯说明涉及多种接口类型和通讯方式&#xff0c;这些接口和通讯方式的选择取决于具体的应用场景和需求。 最常见的LCD模块接口协议是&#xff1a; 1.并行接口 2.串行接口 3.串行或并行配置到微处…

基于欧氏距离的点云聚类(python)

1、背景介绍 欧式聚类是一种基于欧氏距离度量的聚类算法。它是点云处理中的一个重要步骤&#xff0c;它可以帮助我们从无序的点云数据中提取有意义的信息。一般来说&#xff0c;对点云进行欧式聚类处理&#xff0c;可以帮助后续数据处理&#xff0c;如物体检测与识别、三维重建…

<Rust><iced>基于rust使用iced构建GUI实例:一个CRC16校验码生成工具

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第五篇实例,是一个CRC16校验码转换程序。 本篇内容: 1、CRC16校验码生成 代码介绍 本文的crc16校验码生成工具,主要设计两个方面,一个是crc16 modbus…

【动态规划】力扣.213. 打家劫舍 II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…

基于YOLOv8的高压输电线路异物检测系统

基于YOLOv8的高压输电线路异物检测系统 (价格88) 包含 【“鸟窝”&#xff0c;“风筝”&#xff0c;“气球”&#xff0c;“垃圾”】 4个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该系统可以根据数…