基于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为比特信噪比,单位也是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,误码率从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”。具体看上面的代码比较好理解,这里就不重复了。

扩频通信系统中,误码率信噪比关系曲线是评估系统性能的一种重要指标。以下是基于MATLAB的扩频通信误码率信噪比关系曲线的仿真实验步骤: 1. 生成扩频码序列 使用MATLAB中的randn函数生成高斯随机序列,再使用Walsh码或Gold码进行扩频。Walsh码是一种正交码,可以通过MATLAB中的hadamard函数生成;Gold码是一种伪随机码,通过两个LFSR(线性反馈移位寄存器)异或得到。在此实验中,我们使用Gold码。 2. 生成基带调制信号 将要传输的二进制数据进行BPSK调制,得到基带调制信号。 3. 加载扩频码 将扩频码和基带调制信号进行卷积,得到载频为1的扩频信号。 4. 加入高斯白噪声 使用MATLAB中的awgn函数模拟信道中的高斯白噪声。 5. 解扩 将接收到的扩频信号与与发送端相同的扩频码进行卷积,得到解扩后的基带信号。 6. 解调 对解扩后的基带信号进行BPSK解调,得到接收到的二进制数据。 7. 计算误码率 将接收到的二进制数据与发送的二进制数据进行比较,计算误码率。 8. 重复实验 重复以上步骤,得到不同信噪比下的误码率数据。 9. 绘制误码率信噪比关系曲线 将不同信噪比下的误码率数据绘制成误码率信噪比关系曲线。 参考MATLAB代码如下: ```matlab clear all; close all; %% 生成扩频码序列 N = 1023; % 扩频码长度 gold1 = [1 0 0 0 0 0 0 0 0 1]; % LFSR1初值 gold2 = [1 1 1 1 1 1 1 1 1 1]; % LFSR2初值 G1 = [1 0 0 0 0 0 0 0 0 0 1]; G2 = [1 1 1 1 1 1 1 1 1 1 1]; for i = 1:N G1_new = mod(gold1(3) + gold1(10), 2); G2_new = mod(gold2(2) + gold2(3) + gold2(6) + gold2(8) + gold2(9) + gold2(10), 2); gold1 = [G1_new gold1(1:9)]; gold2 = [G2_new gold2(1:10)]; G1 = [G1 gold1(10)]; G2 = [G2 gold2(10)]; end code = xor(G1, G2); %% 生成基带调制信号 data = randi([0 1], 1, N); % 发送的二进制数据 mod_signal = 1 - 2 * data; % BPSK调制 %% 加载扩频码 spread_signal = kron(mod_signal, code); % 扩频信号 %% 加入高斯白噪声 EbNo = 0:2:20; % 信噪比范围 for i = 1:length(EbNo) snr = EbNo(i) + 10 * log10(length(code)); noisy_signal = awgn(spread_signal, snr, 'measured'); %% 解扩 received_signal = kron(noisy_signal, code); %% 解调 demod_signal = received_signal < 0; %% 计算误码率 error_count = sum(demod_signal ~= data); ber(i) = error_count / N; end %% 绘制误码率信噪比关系曲线 semilogy(EbNo, ber); xlabel('Eb/No (dB)'); ylabel('Bit Error Rate'); title('BER vs. Eb/No for BPSK with Gold Code'); grid on; ``` 运行以上代码,即可得到误码率信噪比关系曲线。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唠嗑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值