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

news2024/11/13 9:34:46

(内容源自详解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.coloradmin.cn/o/1951586.html

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

相关文章

爬虫 APP 逆向 ---> 粉笔考研

环境: 粉笔考研 v6.3.15:https://www.wandoujia.com/apps/1220941/history_v6031500雷电9 模拟器:https://www.ldmnq.com/安装 magisk:https://blog.csdn.net/Ruaki/article/details/135580772安装 Dia 插件 (作用:禁…

前端开发知识-vue

大括号里边放键值对,即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤: 1.javascript中引入vue.js 可以src中可以是vue的网址,也可以是本地下载。 2.在javasc…

地形材质制作(能使地面湿润)

如图,创建一个材质并写以下逻辑 Landscape Layer Blend节点能使在地形模式绘制中有三个选择,根据以上逻辑,Red是原材质,Green是绿色材质也就是草,Blue为水(这个我认为比较重要) Blue的颜色最好为这个 这个节…

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图,是我在半年多前写的一段随笔,没想到来的这么快! 碰巧的是今天中午,在开发者群里有两位老铁自曝,本以为能公司干到老,但公司却不给机会,已经不在是公司员工了。 最近,晓衡…

一些关于颜色的网站

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 1、中国传统色 2、网页颜色选择器 3、渐变色网站 4、多风味色卡生成 5、波浪生成 6、半透明磨砂框 色卡组合

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 (nginx.exe要在非中文的目录下) 开启服务: start nginx 查看任务进程是否存在: tasklist /fi "imagename eq nginx.exe" 关闭ngi…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中,Fragments 是一种轻量级的 UI 组件,类似于视图(Views),但它们没有自己的控制器(Controller)。Fragments 通常用于定义可以在多个视图中重用的 UI 片段,从而提…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法(交换顺序)(1)算法(2)性能分析 2.2、简单选择排序(1)算法(2&#xff09…

express连接mysql

一、 安装express npm install express --save二、express配置 //引入 const express require("express"); //创建实例 const app express(); //启动服务 app.listen(8081, () > {console.log("http://localhost:8081"); });三、安装mysql npm i m…

《昇思25天学习打卡营第6天|ResNet50图像分类》

写在前面 从本次开始,接触一些上层应用。 本次通过经典的模型,开始本次任务。这里开始学习resnet50网络模型,应该也会有resnet18,估计18的模型速度会更快一些。 resnet 通过对论文的结论进行展示,说明了模型的功能&…

第2章 编译SDK

安装编译依赖 sudo apt-get update sudo apt-get install clang-format astyle libncurses5-dev build-essential python-configparser sconssudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \ expect g patchelf chrpath gawk texinfo chrpath diffstat …

springboot促进高等教育可持续发展管理平台-计算机毕业设计源码36141

摘 要 随着全球对可持续发展的日益关注,高等教育作为培养未来领导者和创新者的摇篮,其在推动可持续发展中的角色日益凸显。然而,传统的高等教育管理模式在应对复杂多变的可持续发展挑战时,显得力不从心。因此,构建一个…

stm32入门-----USART串口实现数据包的接收和发送

目录 前言 数据包 1.HEX数据包 2.文本数据包 C编程实现stm32收发数据包 1.HEX数据包的收发 2.文本数据包的收发 前言 前面几期讲解了USART串口发送数据和接收数据的原理,那本期在前面的基础上学习stm32 USART串口发送和接收数据包。本期包括两个项目&a…

数据库作业四

1. 修改 student 表中年龄( sage )字段属性,数据类型由 int 改变为 smallint : ALTER TABLE student MODIFY Sage SMALLINT; 2. 为 Course 表中 Cno 课程号字段设置索引,并查看索引: ALTER TABLE…

Linux系统下非root用户自行安装的命令切换为root权限时无法使用,提示comman not found解决办法

今天在开发的时候遇上了一个问题就是要去我们数据平台中进行数据的提取,数据存储用的是minio,一个MinIO部署由一组存储和计算资源组成,运行一个或多个 minio server 节点,共同作为单个对象存储库。独立的MinIO实例由具有单个 mini…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器: 搭建DNS多区域功能(Multi-Zone DNS)主要是为了满足复杂网络环境下的多样化需求,提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境: 在大型组织、跨国公司或跨地域服务中,网…

微服务安全——SpringSecurity6详解

文章目录 说明SpringSecurity认证快速开始设置用户名密码基于application.yml方式基于Java Bean配置方式 设置加密方式自定义用户加载方式自定义登录页面前后端分离认证认证流程 SpringSecurity授权web授权:基于url的访问控制自定义授权失败异常处理方法授权:基于注解的访问控制…

2024上半年热门网络安全产品和工具TOP10_wiz安全产品

今年上半年,利用生成式人工智能(GenAI)的网络安全工具继续激增。许多供应商正在利用GenAI的功能来自动化安全运营中心(SOC)的工作,特别是在自动化日常活动方面,如收集威胁信息和自动创建查询。 …

element 结合 {} 实现自适应布局

通过el-row el-col 实现 例如 :xl“{ 1: 24, 2: 12, 3: 8, 4: 6 }[tableData.length] || 6” length 1 2 3 4 、代码数量为 1 2 3 4 >4 时不同卡片数量时尺寸的配置

LLM模型之基于MindSpore通过GPT实现情感分类

前言 # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip install mindnlp0.3.1 !pip install mindnlp !pip install jieba %env HF_ENDPOINThttps://hf-mirror.com 导入对应的包 import osimport m…