基于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,误码率从降低到
.理论曲线与实际计算的点是相符合的。
四. 总结
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”。具体看上面的代码比较好理解,这里就不重复了。
相关文章:
基于MATLAB的误码率与信噪比(附完整代码与分析)
目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 (1)本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串筛选排序(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串筛选排序(100分) 🌍 评测功能需要 订阅专栏 后私信…...
# 开发安全
开发安全 文章目录 开发安全安全开发生命周期安全开发目标安全开发基本准则注入类攻击手段Sql注入命令执行命令执行防御文件遍历防御 植入类安全漏洞防御XSS(前端漏洞)防御 储存型XSS文件上传防御 CSRF防御 会话固定防御 其它类型安全漏洞越权访问防御 口…...
Qt MaintenanceTool.exe使用镜像源更新Qt
环境:Windows11,Qt6.5,新版的MaintenanceTool.exe linux环境类似,mac环境可以看官方文档。 cmd命令窗口:切换到MaintenanceTool.exe所在目录,可以用“D:”切换到D盘,“cd xxxx”切换到xxxx目录…...
Java 8 Stream API介绍
Java 8引入了Stream API,这是对集合框架的一种增强,它允许你以一种声明式的方式处理数据集合。Stream API的核心在于将数据的操作分为两个主要阶段:中间操作和终端操作。中间操作返回的是一个新的Stream,可以链式调用多个中间操作…...
【前端技巧】css篇
利用counter实现计数器 counter-reset:为计数器设置名称,语法如下: counter-rese: <idntifier><integer>第一个参数为变量名称,第二个参数为初始值,默认为0 counter-increment:设置计数器增…...
2024年6月20日 (周四) 叶子游戏新闻
超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 免费多人沙盒游戏《宝藏世界》推出更新“潮起潮落”,带来全新克苏鲁风冒险准备好迎接一场超凡的冒险吧,MMORPG发行商gamigo宣布《宝藏世界》的最新更新:“潮起潮落”。这次更…...
Zookeeper 一、Zookeeper简介
1.分布式系统定义及面临的问题 分布式系统是同时跨越多给物理主机,独立运行的多个软件所组成的系统。类比一下,分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组…...
普通一本能找到嵌入式linux工作吗?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!首先,普通…...
Effective C++ 改善程序与设计的55个具体做法笔记与心得 3
三. 资源管理 13. 以对象管理资源 请记住: 为防止资源泄露,使用智能指针 14. 在资源管理类中小心copying行为 请记住: 复制RAII对象必须一并复制他所管理的资源,所以资源的copying行为决定RAII对象的copying行为普遍而常见的…...
苹果的后来者居上策略:靠隐私保护打脸微软
01.苹果与微软相比更注重用户隐私 我一直是Windows的忠实用户,但微软疯狂地将人工智能融入一切,让我开始觉得应该咬咬牙换成Mac。 自小我几乎只用Windows电脑,所以我对MacOS一直不太适应。虽然Windows 11有其缺点,但总的来说&am…...
java经典面试题--进程和线程的关系/区别
进程和线程的定义以及作用 进程:进程是操作系统分配资源的基本单位,是程序的一次执行过程,它包括了程序执行的上下文环境,包括程序代码、数据、系统资源(内存、文件、设备等)以及执行状态等信息,其作用是提供一个独立的执行环境,…...
Solr 日志系统7.4.0部署和迁移到本地,Core Admin 添加新的core报错
文章目录 Solr部署Docker部署二进制部署 Tips:Solr设置账号密码方法1:(不使用)方法2: Core Admin 添加新的core报错Solr数据迁移 Solr部署 Docker部署 docker run -d -p 8983:8983 --name solr solr:latest docker run -d -p 8983:8983 -v /opt/solr:/…...
前缀和+双指针,CF 131F - Present to Mom
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑,可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界,把…...
HCIA-速查-ENSP模拟器2步清空配置
需求:清空模拟器配置 清空当前图中配置 步骤1:reset saved-configuration 后输入y确认 步骤2:reboot后输入n否认再输入y确认 验证已经清空配置...
优选算法刷题笔记 2024.6.10-24.6.20
一、双指针算法(快慢指针,对撞指针) 艹,CSDN吞了我是十三题笔记!!! 二、滑动窗口(滑动窗口) 1、找到字符串中所有字母异位词 class Solution {public List<Integer> findAnagrams(String s, String p) {int[] hash1 new in…...
无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何在国内使用 Coze.com 创建的 Bot 📒📝 创建Bot📝 实现国内使用📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 Coze.com 是一个强大的平台,允许用户创建各种类型的 Bot。然而,许多国内用户可能会遇到访问问题,导致无法…...
【车载开发系列】CAN通信总线再理解(中篇)
【车载开发系列】CAN通信总线再理解(中篇) 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1)CAN的通信帧类型2)CAN的标准帧格式1. CAN ID2. 数据场 3)CAN总线仲裁 十二. CAN应用层1)CANopen2)…...
系统编程:互斥锁,条件变量
互斥锁 使用过程: 1,声明锁: pthread_mutex_t lock; 2,初始化锁:pthread_mutex_init(&lock,NULL); 3,在线程的方法函数中上锁和解锁:(成对出现) pthread_mutex_lock(&lock); pthread_mutex_unlock(&lock); 4,销毁锁:pthread_mutex_destroy(&lock); 代码示例:…...
蓝鹏测控公司全长直线度算法项目多部门现场组织验收
关键字:全场直线度算法,直线度测量仪,直线度检测,直线度测量设备, 6月18日上午,蓝鹏测控公司全长直线度算法项目顺利通过多部门现场验收。该项目由公司技术部、开发部、生产部等多个部门共同参与,旨在提高直线度测量精度,满足高精度制造领域需…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
