matlab实现在awgn信道下16QAM误码率于理论误码率的对比,并画出图
时间: 2023-05-25 12:07:09 浏览: 473
以下是MATLAB代码实现16QAM误码率与理论误码率的对比,并绘制误码率图像。
```matlab
% 16QAM误码率与理论误码率的对比
clear all;
close all;
clc;
% 参数设置
M = 16; % 调制阶数
k = log2(M); % 每个符号中的比特数
EbNo = 0:2:18; % 信噪比范围
numBits = 1e6; % 要模拟的比特数
numErrs = zeros(size(EbNo)); % 记录误码数
berTheory = zeros(size(EbNo)); % 记录理论误码率
berSimulated = zeros(size(EbNo)); % 记录模拟误码率
% 生成调制符号映射表
mapTable = zeros(M, 1);
for i = 1:M
mapTable(i) = qammod(i-1, M);
end
% 循环进行信噪比的计算与仿真
for n = 1:length(EbNo)
% 把比特流映射成调制符号
txData = randi([0 1], numBits/k, k);
txSym = bi2de(txData, 'left-msb') + 1;
txMod = mapTable(txSym).';
% 加入高斯白噪声
noiseVar = 10^(-EbNo(n)/10);
noise = sqrt(noiseVar/2) * (randn(size(txMod)) + 1j*randn(size(txMod)));
rxMod = txMod + noise;
% 解调
rxSym = qamdemod(rxMod, M);
rxData = de2bi(rxSym-1, k, 'left-msb').';
% 统计误码数
numErrs(n) = biterr(txData, rxData);
berSimulated(n) = numErrs(n)/numBits;
% 计算理论误码率
berTheory(n) = qfunc(sqrt(2*EbNo(n)*k)*sin(pi/M));
end
% 绘制误码率图像
semilogy(EbNo, berTheory, '-o', 'LineWidth', 2);
hold on;
semilogy(EbNo, berSimulated, '-^', 'LineWidth', 2);
grid on;
legend('理论误码率', '仿真误码率');
xlabel('EbNo (dB)');
ylabel('BER');
title('16QAM误码率与理论误码率的对比');
```
阅读全文