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

目录

[一. 写在前面](#一. 写在前面)

[二. 如何计算误码率](#二. 如何计算误码率)

[三. 带噪声的误码率分析](#三. 带噪声的误码率分析)

[3.1 代码思路](#3.1 代码思路)

[3.2 MATLAB源代码及分析](#3.2 MATLAB源代码及分析)

[四. 总结](#四. 总结)

[4.1 输入参数](#4.1 输入参数)

[4.2 规定比特长度](#4.2 规定比特长度)

[4.3 特殊形式比较](#4.3 特殊形式比较)


一. 写在前面

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

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

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

二. 如何计算误码率

MATLAB代码及分析:

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源代码及分析

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为比特信噪比,单位也是dB

numSymPerFrame=100;
%一共产生100个QAM symbols

snrdB=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; 
%初始化误差比特数为0

numBits=0;
%初始化总传输比特数为0

while 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进行解调,解调阶数为M

dataOut=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语法为:

Matlab 复制代码
[number,ratio]=biterr(x,y)

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

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

ratio代表误码率。

4.2 规定比特长度

如果使用的语句为:

Matlab 复制代码
biterr(x,y,k)

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

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

4.3 特殊形式比较

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

相关推荐
小_太_阳25 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾28 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
唐 城1 小时前
curl 放弃对 Hyper Rust HTTP 后端的支持
开发语言·http·rust
码银3 小时前
【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割
开发语言·python
从善若水3 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
2401_858286114 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法
Jelena技术达人4 小时前
Java爬虫获取1688关键字 item_search接口返回值详细解析
java·开发语言·爬虫
数据小爬虫@4 小时前
Java爬虫:速卖通(AliExpress)商品评论获取指南
java·开发语言
waterme1onY4 小时前
Spring AOP 中记录日志
java·开发语言·笔记·后端
2401_879103684 小时前
24.12.25 AOP
java·开发语言·笔记