%% Setup
% 定义参数
M = 16; % 信号星座图的数目
k = log2(M); % 每个符号代表的位数
n = 3e4; % 位数
nsamp = 1; % 过采样率
%% 产生信号源
% 产生一列二进制数据
% 绘制一列二进制数据中的前40位
x = randint(n,1);
stem(x(1:40),'filled');
title('Random Bits');
xlabel('Bit Index');
ylabel('Binary Value');
%% 重新调整输入二进制序列的位置
%将变换位置的二进制信号转换为十六进制信号
xsym = bi2de(reshape(x,k,length(x)/k).','left-msb');
%% 绘制十六进制信号杆图
% 绘制十六进制信号前十位的杆图
figure;
stem(xsym(1:10));
title('Random Symbols');
xlabel('Symbol Index');
ylabel('Integer Value');
%% 调制
% 运用MATLAB中16-QAM调制方式对十六进制信号进行调制
y = modulate(modem.qammod(M),xsym);
%% 信号传输
ytx = y; %已调qam信号
%% 经过有高斯白噪声的信道
EbNo = -5:0.5:10;
for i=1:length(EbNo)
snr =(i-1)*0.5-5 + 10*log10(k)-10*log10(nsamp);
ynoisy = awgn(ytx,snr,'measured');
%% 信号接收
yrx = ynoisy; %添加了高斯白噪声的已调qam信号
%% 绘制星座图
%已调qam信号星座图
h = scatterplot(yrx(1:nsamp*5e3),nsamp,0,'g.');
hold on;
%添加了高斯白噪声的已调qam信号星座图
scatterplot(ytx(1:5e3),1,0,'k*',h);
title('Received Signal');
legend('Received Signal','Signal Constellation');
axis([-5 5 -5 5]);
hold off;
%% 信号解调
% 运用MATLAB中的16-QAM方式对信号进行解调
%对已调qam信号进行解调,生成十六进制信号
zsym = demodulate(modem.qamdemod(M),yrx);
%% 十六进制信号到二进制信号的映射
% 十六进制信号转换为二进制
z = de2bi(zsym,'left-msb');
%调整二进制信号位置,成为二进制序列数字信号
z = reshape(z.',prod(size(z)),1);
%% 误比特率的估计
%利用MATLAB自带biterr函数
%比较初始输入二进制序列x和解调后恢复二进制序列z
%获取解调后二进制位的错误数量和误比特率
[number_of_errors(i),bit_error_rate(i)] = biterr(x,z)
end
%% 绘制理论和实际上误码率与信噪比的关系图像
%理论上的误码率公式
theoryBer = (1/k)*3/2*erfc(sqrt(k*0.1*(10.^(EbNo/10))));
%绘制实际误码率图像
semilogy(EbNo,bit_error_rate,'bs-','LineWidth',2);
hold on;
%绘制理论上误码率图像
semilogy(EbNo,theoryBer,'ms-','LineWidth',2);
legend('理论上误码率与信噪比的关系', '实际上误码率与信噪比的关系');
xlabel('Eb/No, dB')
ylabel('误码率')
title('16QAM调制解调的误码率曲线')