目录
一. 写在前面
(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为比特信噪比,单位也是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语法为:
[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”。具体看上面的代码比较好理解,这里就不重复了。