基于MATLAB的误码率与信噪比(附完整代码与分析)

目录

一. 写在前面

二. 如何计算误码率

三. 带噪声的误码率分析

3.1 代码思路

3.2 MATLAB源代码及分析

四. 总结

4.1 输入参数

4.2 规定比特长度

4.3 特殊形式比较


一. 写在前面

(1)本文章主要讨论如何仿真误码率随着信噪比变化的图像

(2)本文章的源代码参考自MATLAB官方文件;

(3)每行代码我都尝试写清楚含义,非常适合初学者

二. 如何计算误码率

MATLAB代码及分析:

%清除所有无关变量
clear;clc;close all;x=[1 0;0 0;0 0;0 0];
%4行2列的矩阵,一共8个元素y=[0 0;0 0;0 0;1 1];
%4行2列的矩阵numerrs1=biterr(x,y)
%计算有多少个位置比特不一致
%很明显结果为3
%biterr函数在无线通信中经常会用到numerrs2=biterr(x,y,[],'column-wise')
%每个矩阵都有两列,比对每列有多少个元素不一样numerrs3=biterr(x,y,[],'row-wise')
%%每个矩阵都有四行,比对每行有多少个元素不一样numerrs4=biterr(x,y,[],'overall')
%计算两个矩阵整个有多少个元素不一样
%跟最原始的numerrs1=biterr(x,y)命令是一样的

输出结果:
numerrs1 =3

解释:很明显x和y一共有3个位置比特不一样


numerrs2 =2     1

解释:第一列x和y有两个2位置不一样,第二列有一个位置不一样


numerrs3 =

     1
     0
     0
     2

解释:第一行有1个比特不一样,第二行完全一样,第三行完全一样,第四行有2个比特不一样


numerrs4 =3

解释:很明显x和y一共有3个位置比特不一样

三. 带噪声的误码率分析

本代码是基于QAM调制的,有关QAM调制相关的分析可看此篇文章:

基于MATLAB的QAM调制与星座图(附完整代码与分析)-CSDN博客

3.1 代码思路

第一步:随机产生二进制数据,每k个为一组作为一个symbol(k的选择取决于QAM调制数)

第二步:对数据符号进行QAM调制

第三步:将调制后的信号输入到加性高斯白噪声(AWGN)信道中

第四步:对接收到的信号进行解调

第五步:将解调后的信号转为二进制数据

第六步:计算出现误差的比特数

3.2 MATLAB源代码及分析

%清除所有无关变量
clear;clc;close all;M=64;
%QAM调制阶数为64
%星座图中一共有64个点k=log2(M);
%每个symbol包含的比特数EbNoVec=(5:15);
%比特信噪比向量从5~15内取所有整数
%Eb代表每笔特信号的能量,Energy bit
%No代表噪声的功率谱密度
%Eb/No为比特信噪比,单位也是dBnumSymPerFrame=100;
%一共产生100个QAM symbolssnrdB=convertSNR(EbNoVec,"ebno","snr",BitsPerSymbol=k);
%ebno代表energy per bit to noise power spectral density ratio (Eb/N0)
%snr代表信噪比
%对输入数据EbNoVec,利用convertSNR函数将比特信噪比转为信噪比
%BitsPerSymbol=k,需要解释每个symbol包含的比特数berEst=zeros(size(EbNoVec));
%初始化误码率为0,注意误码率为向量for n=1:length(snrdB) 
%对每处信噪比的误码率均进行计算
%length代表snrdB的向量长度numErrs=0; 
%初始化误差比特数为0numBits=0;
%初始化总传输比特数为0while numErrs<200 && numBits<1e7
%要么出现错误比特数超过200个,要么传输总的比特数超过10^7,程序就会停止dataIn=randi([0 1],numSymPerFrame*k,1);
%从0或1内随机选择比特数,一共numSymPerFram*k行1列dataSym=bit2int(dataIn,k);
%以k比特为一组,将其转为10进制的数txSig=qammod(dataSym,M);
%对信号dataSym进行QAM调制,调制阶数为M
%默认编码方式为格雷码,发射信号rxSig=awgn(txSig,snrdB(n),'measured');
%对调制后的信号txSig,输入到AWGN信道中(加性高斯白噪声)
%snrdB(n)代表信噪比向量的第n个数
%measured凸显根据信号与信噪比可计算对应的噪声水平rxSym=qamdemod(rxSig,M);
%对接收到的信号rxSig进行解调,解调阶数为MdataOut=int2bit(rxSym,k);
%将信号从十进制转为二进制,以k比特为一组nErrors=biterr(dataIn,dataOut);
%计算调制前与调制后的错误比特数numErrs=numErrs+nErrors;
%总的误差比特数numBits=numBits+numSymPerFrame*k;
%每循环一轮都会增加numSymPerFrame*k比特数end
%while语句的结束berEst(n)=numErrs/numBits;
%计算误码率end
%for语句的结束berTheory=berawgn(EbNoVec,'qam',M);
%不同的比特信噪比EbNoVec
%M-QAM调制,计算理论上的误码率semilogy(EbNoVec,berEst,'*')
%画半对数图,横轴为EbNoVec,纵轴为经过对数计算的berEst,用*点表示
%一共11个点hold on
%画在同一个图上semilogy(EbNoVec,berTheory)
%半对数图grid
%出现格子legend('计算出的BER','理论上的BER')
%图像说明xlabel('Eb/No(dB)')
%x轴说明ylabel('Bit Error Rate(BER)')
%纵轴说明

运行结果:

解释:

随着比特信噪比从5dB增大到15dB,误码率从10^{-1}降低到10^{-3}.理论曲线与实际计算的点是相符合的。

四. 总结

4.1 输入参数

计算误码率的标准MATLAB语法为:

[number,ratio]=biterr(x,y)

输入的x和y可以是向量,也可以是矩阵。要求取值均非负。biterr函数会自动把x和y转为二进制的比特串来进行对比。

在输出的结果中number代表不一样的比特数量。

ratio代表误码率。

4.2 规定比特长度

如果使用的语句为:

biterr(x,y,k)

其中k代表比较的比特长度。

当然,通常我们是不会写的,就默认k为最大的数所对应的比特长度。

4.3 特殊形式比较

还可以在语句的最后面添加“overall”或者“row-wise”或者“column wise”。具体看上面的代码比较好理解,这里就不重复了。

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

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

相关文章

React native新架构组成

React Native 的新架构&#xff08;New Architecture&#xff09;引入了一些新的组件和概念&#xff0c;旨在提高性能、增强灵活性和简化跨平台开发。主要组成部分包括&#xff1a; Fabric: Fabric Renderer: Fabric 是新的渲染引擎&#xff0c;它旨在取代现有的渲染引擎。与…

112、路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是指没有子节点…

Java基础16(集合框架 List ArrayList容器类 ArrayList底层源码解析及扩容机制)

目录 一、什么是集合&#xff1f; 二、集合接口 三、List集合 四、ArrayList容器类 1. 常用方法 1.1 增加 1.2 查找 int size() E get(int index) int indexOf(Object c) boolean contains(Object c) boolean isEmpty() List SubList(int fromindex,int …

GESP错题整理

以下C 不可以作为变量的名称的是( )。 A. CCF GESPB. ccfGESPC. CCFgespD. CCF_GESP解答&#xff1a;因为C在定义变量时只能用字母&#xff0c;数字&#xff0c;符号作为变量名&#xff0c;空格是不能作为变量名的&#xff0c;所以选A。 下面C 代码执行后的输出是&#xff08; …

# 开发安全

开发安全 文章目录 开发安全安全开发生命周期安全开发目标安全开发基本准则注入类攻击手段Sql注入命令执行命令执行防御文件遍历防御 植入类安全漏洞防御XSS&#xff08;前端漏洞&#xff09;防御 储存型XSS文件上传防御 CSRF防御 会话固定防御 其它类型安全漏洞越权访问防御 口…

tkinter 综合应用

创建一个功能全面的 tkinter GUI 应用程序示例&#xff0c;展示一些常用的小部件和功能&#xff0c;包括菜单、按钮、标签、文本框、复选框、单选按钮、列表框、滚动条、对话框等。这个示例将展示如何将这些组件结合在一起&#xff0c;构建一个综合的 GUI 应用程序。 完整示例…

QT-QPainter实现一个可切换的开关控件

1、效果 2、核心代码 #ifndef SWITCH_H #define SWITCH_H #include <QWidget> #include <QTimer>

Freemaker 模板

背景 发送邮件&#xff0c;正文利用freemaker完成 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency>Autowired private Configuration configurer;GetMap…

如何调用讯飞星火认知大模型的API以利用其卓越功能

摘要 讯飞星火认知大模型&#xff0c;作为科大讯飞精心打造的一款人工智能模型&#xff0c;在自然语言理解和生成方面展现出了卓越的能力。这款模型通过深度学习技术和大量数据的训练&#xff0c;具备了强大的语言理解、文本生成和对话交互等功能。 一、模型功能概述 讯飞星…

我的创作纪念日--码农阿豪

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑&#xff0c;可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界&#xff0c;把…

Flow Matching For Generative Modeling

Flow Matching For Generative Modeling 一、基于流的&#xff08;Flow based&#xff09;生成模型 生成模型 我们先回顾一下所谓的生成任务&#xff0c;究竟是想要做什么事情。我们认为&#xff0c;世界上所有的图片&#xff0c;是符合某种分布 p d a t a ( x ) p_{data}(…

Web前端设计入门:探索未知,点亮创意之光

Web前端设计入门&#xff1a;探索未知&#xff0c;点亮创意之光 在数字化浪潮汹涌的时代&#xff0c;Web前端设计作为连接用户与数字世界的桥梁&#xff0c;其重要性日益凸显。对于初学者来说&#xff0c;如何快速入门并掌握这一技能&#xff0c;成为了一个充满挑战与机遇的课…

华为OD机试真题2024版-求幸存数之和

题目描述\n给一个正整数列 nums,一个跳数 jump,及幸存数量 left。运算过程为:从索引为 0 的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止。然后返回幸存数之和。\n约束: 1、0 是第一个起跳点。…

【因果推断python】45_估计量1

目录 问题设置 目标转换 到目前为止&#xff0c;我们已经了解了如何在干预不是随机分配的情况下对我们的数据进行纠偏&#xff0c;这会导致混淆偏差。这有助于我们解决因果推理中的识别问题。换句话说&#xff0c;一旦单位是可交换的&#xff0c;或者 &#xff0c;就可以学习…

MySQL CHECK约束

在 MySQL 中&#xff0c;直到 MySQL 8.0.16 版本之前&#xff0c;标准 SQL 的 CHECK 约束并未被完全支持。然而&#xff0c;从 MySQL 8.0.16 开始&#xff0c;CHECK 约束在表定义中得到了支持&#xff0c;允许你定义列中必须满足的条件。 使用 CHECK 约束&#xff0c;你可以确…

增加了redis分布式锁,但是还是生成了重复数据

增加了redis分布式锁&#xff0c;但是还是生成了重复数据 原因 两个线程 第一个线程先获取锁&#xff0c;然后进行新增&#xff0c;此时第二个线程也进入方法体&#xff0c;尝试获取锁&#xff0c;结果没获取到&#xff0c;继续在5s内尝试&#xff0c;在redis获取锁等待5s的过…

日志记录规范

日志记录通常包含三个基本要素&#xff1a;日期、信息和级别 别&#xff08;Level&#xff09;是日志记录中的一个重要概念&#xff0c;它用于标识日志消息的严重性和重要性。不同的系统和应用程序可能使用不同的日志级别体系&#xff0c;但常见的日志级别从高到低大致如下&am…

Web前端收入来源:探索多元化的盈利渠道

Web前端收入来源&#xff1a;探索多元化的盈利渠道 在数字化时代&#xff0c;Web前端技术日益成为推动互联网业务发展的重要力量。对于前端开发者而言&#xff0c;除了传统的薪资收入外&#xff0c;还存在多种潜在的收入来源。本文将从四个方面、五个方面、六个方面和七个方面…

Linux环境如何彻底卸载感干净RabbitMQ并重新安装

Linux&#xff08;Centos7&#xff09;环境如何彻底卸载感干净RabbitMQ并重新安装 我这个是超级简单的&#xff0c;如果安装不好&#xff0c;顺着网线来找我 一、卸载RabbitMq相关的软件包 1. 先停止RabbitMq服务 systemctl stop rabbitmq-server2. 查看rabbitmq安装的相关…