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.mzph.cn/diannao/50814.shtml

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

相关文章

《python语言程序设计》第6章10题使用isPrime函数 求小于10000的素数的个数

修改了一个地方&#xff0c;真的太棒了&#xff01; def isPrime(number):divisor 2while divisor < number / 2:if number % divisor 0:return Falsedivisor 1return Truedef printPrimeNumbers(numberOfPrimes):# 这个代码之前就没有用&#xff0c;作者写的目的是什么呢…

NC 最长回文子串

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 对于长度为n的…

6. 开发板烧录

1. 概述 采用恒玄的底板+2小板的开发板 2. 开发板资料 详见:<<BES AUDIO DEV BOARD USER MANUUAL_9v5.pdf>> 3. 硬件接线 供电:可以采用电池供电,也可以采用Type-c供电 烧录:采用Type-C口,实际上就是串口。(下图带黑色标志的)

【启明智显分享】基于国产Model3芯片的7寸触摸屏助力智慧医疗,电子床头屏提升护理交互

未来医院必然是以信息化为基础&#xff0c;以物联网为特征&#xff0c;以医疗为核心的服务型医院。病房作为医院的重要服务场所&#xff0c;成为智慧医院建设的重要一环。 为提高医护人员与患者的互动交流&#xff0c;给医疗注入智慧元素&#xff0c;让患者享受智能服务&#…

AJAX-Promise 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 一、Promise基本概念 1.1 定义 1.2 状态 1.3 构造函数 二、Promise基本用法 2.1 then() 2.2 ca…

keras的路透社数据训练对测试数据的概率总和计算问题

在使用keras内置数据路透社新闻分类的时候&#xff0c;使用训练的模型预测测试数据。然后发现对预测数据分类的概率总和不是1. pridiction model.predict(x_test)for i in range(0,46):print(np.sum(pridiction[i]))然而python深度学习这本书里面的是1.0 问题目前没有解决。…

醒醒,别睡了...讲《数据分析pandas库》了—/—<3>

直接上知识点 一、 1、新建数据框时建立索引 所有的数据框默认都已经使用从 0 开始的自然数索引&#xff0c;因此这里的"建立”索引指的是自定 df pd.DataFrame( {varl : 1.0, var2 :[1,2,3,4], var3 :[test,python,test,hello] , var4 : cons} , index [0,1,2,3]) …

量化私募公司的多因子构建方案(附python代码)

原创文章第600篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 昨天代码已经发布了&#xff0c;大家可以前往下载和更新&#xff1a; 代码发布&#xff1a;quantlabv5.3&#xff0c;可转债所有数据及双低、动量因子策略&#xff0c;单因子分析框…

文件夹怎么设置密码?文件夹加密方法盘点

文件夹是电脑管理数据的重要工具&#xff0c;当我们将重要数据存储在文件夹中时&#xff0c;需要严格保护文件夹的数据安全&#xff0c;避免数据泄露。下面我们就来了解一下文件夹设置密码的方法。 文件夹加密 文件夹加密是指通过加密算法来加密保护文件夹&#xff0c;避免其他…

高级网页爬虫开发:Scrapy和BeautifulSoup的深度整合

引言 在互联网时代&#xff0c;数据的价值日益凸显。网页爬虫作为一种自动化获取网页内容的工具&#xff0c;广泛应用于数据挖掘、市场分析、内容聚合等领域。Scrapy是一个强大的网页爬虫框架&#xff0c;而BeautifulSoup则是一个灵活的HTML和XML文档解析库。本文将探讨如何将…

Kolla-Ansible的确是不支持CentOS-Stream系列产品了

看着OpenStack最新的 C 版本出来一段时间了&#xff0c;想尝个鲜、用Kolla-Ansible进行容器化部署&#xff0c;结果嘛。。。 根据实验结果&#xff0c;自OpenStack Bobcat版本开始&#xff0c;Kolla-Ansible就适合在CentOS系列产品上部署了&#xff0c;通过对 Bobcat和Caracal…

【docker】部署证书过期监控系统mouday/domain-admin

证书过期了再去部署证书容易被骂&#xff0c;就找了一个开源的证书过期系统来部署一下 过程 官方文档&#xff1a;https://domain-admin.readthedocs.io/zh-cn/latest/manual/install.html#docker 直接下载镜像是超时的&#xff0c;切换一下文档推荐的镜像源 新建docker配置…

模拟电子技术-实验四 二极管电路仿真

实验四 二极管电路仿真 一&#xff0e;实验类型 验证性实验 二&#xff0e;实验目的 1、验证二极管的单向导电性 2、验证二极管的稳压特性。 三&#xff0e;实验原理 二极管的单向导电性&#xff1a; 四、实验内容 1、二极管参数测试仿真实验 1&#xff09;仪表仿真…

IndexError: index 0 is out of bounds for axis 1 with size 0

IndexError: index 0 is out of bounds for axis 1 with size 0 目录 IndexError: index 0 is out of bounds for axis 1 with size 0 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#…

物联网主机 E6000:智慧应急领域的创新力量

在当今瞬息万变的世界中&#xff0c;突发事件和紧急情况时有发生。如何迅速、准确地应对这些挑战&#xff0c;保障人民生命财产安全&#xff0c;成为了社会发展的重要课题。而物联网主机 E6000 的出现&#xff0c;为智慧应急领域带来了全新的解决方案。 一、强大的性能与功能 物…

ueditor跨域问题解决

ueditor解决跨域问题 问题&#xff1a;1.在引用vue-ueditor-wrap后&#xff0c;上传图片和附件出现跨域问题&#xff0c;前端引用了webpack去解决跨域问题&#xff0c;但仍然存在跨域问题&#xff1f; ueditor是百度的富文本&#xff0c;功能较多但资料不够全&#xff0c;因为…

模拟string(四)详解

目录 判断string大小关系bool operator(const string&s1,const string s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator>(const string& s1, const …

算法板子:使用数组模拟队列——在队尾插入元素、在队头弹出元素、判断队列是否为空、查询队头元素

使用数组模拟时长这个样子&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;const int N 1e5 10;// 数组q相当于队列; // hh是队头指针&#xff0c;始终指向队头 // tt是队尾指针&#xff0c;始终指向队尾 int q[N], hh, tt -1;// 队尾插入元…

代码随想录算法训练营第 25 天 | LeetCode491.递增子序列 LeetCode46.全排列 LeetCode47.全排列ii

代码随想录算法训练营 Day25代码随想录算法训练营第 25 天 | LeetCode491.递增子序列 LeetCode46.全排列 LeetCode47.全排列ii 目录 代码随想录算法训练营前言LeetCode491.递增子序列LeetCode46.全排列LeetCode47.全排列ii 一、LeetCode491.递增子序列1.题目链接2.思路3.题解 …

【算法】单向环形链表解决Josephu(约瑟夫)问题

应用场景 n 个小孩标号&#xff0c;逆时针站一圈。从 k 号开始&#xff0c;每一次从当前的小孩逆时针数 m 个&#xff0c;然后让最后这个小孩出列。不断循环上述过程&#xff0c;直到所有小孩出列&#xff0c;由此产生出一个队列编号。 提示 用一个不带头节点的循环链表来处…