MATLAB通信工具箱仿真16QAM系统

目录

产生随机二进制比特流

将比特映射为符号(将二进制数据映射为整数)

16QAM调制

加入高斯白噪声

解调16QAM信号

将整数值转化为二进制数

计算系统误码率

完整代码

参考文献


产生随机二进制比特流

M = 16;%调制顺序(信号星座点数)
k = log2(M);%每符号的比特位数
n = 30000;%处理的比特总数
sps = 1;%每个符号的样本数(过采样因子)

使用rng设置为默认状态,以便生成重复的随机数

rng default;%每次都产生相同的随机数
dataIn = randi([0 1],n,1); % 产生0和1之间的整数,输出一个n*1的向量

使用stem画出产生的前40个随机数,使用冒号调用随机数的前40个值

stem(dataIn(1:40),'filled');%filled参数将图形填充为实心
title('Random Bits');
xlabel('Bit Index');
ylabel('Binary Value');

MATLAB通信工具箱仿真16QAM系统_第1张图片

将比特映射为符号(将二进制数据映射为整数)

即,每4个比特一组,映射为[0,15]中的一个数

由于qammod函数的输入要求是整数,故需要该步操作

dataInMatrix = reshape(dataIn,length(dataIn)/k,k);
% 重组dataIn,使其每行只有4列
dataSymbolsIn = bi2de(dataInMatrix);%将每行转化为十进制数,[0,15]
%该函数在MATAB R2021b及以后不推荐使用

 画出前10个符号

figure; % 创建图窗
stem(dataSymbolsIn(1:10));
title('Random Symbols');
xlabel('Symbol Index');
ylabel('Integer Value');

MATLAB通信工具箱仿真16QAM系统_第2张图片

16QAM调制

dataMod = qammod(dataSymbolsIn,M,'bin'); 
% 使用自然二进制编码排序
dataModG = qammod(dataSymbolsIn,M); 
% 默认使用格雷码编码

计算Eb/N0=10dB时的SNR

EbNo = 10;
snr = EbNo+10*log10(k)-10*log10(sps);
%转换方法见参考文献

加入高斯白噪声

receivedSignal = awgn(dataMod,snr,'measured');
receivedSignalG = awgn(dataModG,snr,'measured');
%awgn函数中输入的信噪比要求是SNR(dB)值

看看此时加噪后的星座图

sPlotFig = scatterplot(receivedSignal,1,0,'g.');
% scatterplot用来观察接收信号的星座图
hold on
scatterplot(dataMod,1,0,'k*',sPlotFig)

MATLAB通信工具箱仿真16QAM系统_第3张图片

解调16QAM信号

dataSymbolsOut = qamdemod(receivedSignal,M,'bin');
dataSymbolsOutG = qamdemod(receivedSignalG,M);

将整数值转化为二进制数

dataOutMatrix = de2bi(dataSymbolsOut,k);
%恢复成矩阵,每一行是一个符号,包含k列
dataOut = dataOutMatrix(:); 
% 将矩阵中所有元素按列重构成一个列向量
dataOutMatrixG = de2bi(dataSymbolsOutG,k);
dataOutG = dataOutMatrixG(:); % Return data in column vector

计算系统误码率

[numErrors,ber] = biterr(dataIn,dataOut);
%该函数比较两种数据,并返回不同的个数以及占比
fprintf('\nThe binary coding bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
[numErrorsG,berG] = biterr(dataIn,dataOutG);
fprintf('\nThe Gray coding bit error rate is %5.2e, based on %d errors.\n', ...
    berG,numErrorsG)
%格雷码编码显著改善了信噪比

看看自然与格雷编码的映射关系

M = 16; % 调制阶数
x = (0:15); % 符号(整数)输出
symbin = qammod(x,M,'bin'); % 16-QAM output (natural-coded binary)
symgray = qammod(x,M,'gray'); % 16-QAM output (Gray-coded)
scatterplot(symgray,1,0,'b*');
for k = 1:M
    text(real(symgray(k)) - 0.0,imag(symgray(k)) + 0.3,...
        dec2base(x(k),2,4));
    text(real(symgray(k)) - 0.5,imag(symgray(k)) + 0.3,...
         num2str(x(k)));
    text(real(symbin(k)) - 0.0,imag(symbin(k)) - 0.3,...
        dec2base(x(k),2,4),'Color',[1 0 0]);
    text(real(symbin(k)) - 0.5,imag(symbin(k)) - 0.3,...
        num2str(x(k)),'Color',[1 0 0]);
end
title('16-QAM Symbol Mapping')
axis([-4 4 -4 4])

完整代码

clc;clear;close all;
M = 16;%调制顺序(信号星座点数)
k = log2(M);%每符号的比特位数
n = 30000;%处理的比特总数
sps = 1;%每个符号的样本数(过采样因子)
rng default;%每次都产生相同的随机数
dataIn = randi([0 1],n,1); % 产生0和1之间的整数,输出一个n*1的向量
stem(dataIn(1:40),'filled');
title('Random Bits');
xlabel('Bit Index');
ylabel('Binary Value');
dataInMatrix = reshape(dataIn,length(dataIn)/k,k);
% 重组dataIn,使其每行只有4列
dataSymbolsIn = bi2de(dataInMatrix);%将每行转化为十进制数,[0,15]
%该函数在MATAB R2021b及以后不推荐使用
figure; % 创建图窗
stem(dataSymbolsIn(1:10),'filled');
title('Random Symbols');
xlabel('Symbol Index');
ylabel('Integer Value');
dataMod = qammod(dataSymbolsIn,M,'bin'); 
% 使用自然二进制编码排序
dataModG = qammod(dataSymbolsIn,M); 
% 默认使用格雷码编码
EbNo = 10;
snr = EbNo+10*log10(k)-10*log10(sps);
receivedSignal = awgn(dataMod,snr,'measured');
receivedSignalG = awgn(dataModG,snr,'measured');
sPlotFig = scatterplot(receivedSignal,1,0,'g.');
% scatterplot用来观察接收信号的星座图
hold on
scatterplot(dataMod,1,0,'k*',sPlotFig)
dataSymbolsOut = qamdemod(receivedSignal,M,'bin');
dataSymbolsOutG = qamdemod(receivedSignalG,M);
dataOutMatrix = de2bi(dataSymbolsOut,k);
dataOut = dataOutMatrix(:); % Return data in column vector
dataOutMatrixG = de2bi(dataSymbolsOutG,k);
dataOutG = dataOutMatrixG(:); % Return data in column vector
[numErrors,ber] = biterr(dataIn,dataOut);
%该函数比较两种数据,并返回不同的个数以及占比
fprintf('\nThe binary coding bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
[numErrorsG,berG] = biterr(dataIn,dataOutG);
fprintf('\nThe Gray coding bit error rate is %5.2e, based on %d errors.\n', ...
    berG,numErrorsG)

参考文献

[1]张少侃,吕聪敏,甘浩.数字通信系统中Eb/N0与SNR转换方法的研究[J].现代计算机,2019(12):33-36.

[2]MATLAB. Communications Toolbox[M]. R2021b.

[3]周炯磐. 通信原理[M]. 北京邮电大学出版社, 2002.

你可能感兴趣的:(matlab,开发语言)