基于 Matlab 的微波分集接收系统的仿真,第一步,生成随机二进制序列;第二步,将序列信息映射到星座图上;第三步;利用 rayleighchan 函数仿真经过瑞利信;第四步,添加高斯白噪声 模拟接收信号;第五步,在接收端使用最大值合并,选择式合并,等增益合并;第六步,判决 计算误码率 绘制瀑布曲线,要求在matlab2022b版本上运行
时间: 2023-12-07 16:03:28 浏览: 160
下面是一个基于 Matlab 的微波分集接收系统的仿真的示例代码,包括以上提到的六个步骤:
```
% 生成随机二进制序列
N = 100000; % 生成的序列长度
bits = randi([0 1], N, 1);
% 映射到星座图上
M = 16; % 星座图大小
symbols = qammod(bits, M);
% 仿真经过瑞利信道
chan = rayleighchan(1/1e6, 10, [0 1/5 1/2], [0 -6 -9], 0); % 定义瑞利信道
txSig = filter(chan, symbols); % 信号经过信道
rxSig = awgn(txSig, 10, 'measured'); % 添加高斯白噪声
% 最大值合并
rxSigMax = max(rxSig, [], 2);
% 选择式合并
rxSigSel = zeros(N, 1);
for i = 1:N
if abs(rxSig(i, 1)) > abs(rxSig(i, 2))
rxSigSel(i) = rxSig(i, 1);
else
rxSigSel(i) = rxSig(i, 2);
end
end
% 等增益合并
rxSigAvg = mean(rxSig, 2);
% 判决
rxBitsMax = qamdemod(rxSigMax, M);
rxBitsSel = qamdemod(rxSigSel, M);
rxBitsAvg = qamdemod(rxSigAvg, M);
% 计算误码率
berMax = sum(bits ~= rxBitsMax) / N;
berSel = sum(bits ~= rxBitsSel) / N;
berAvg = sum(bits ~= rxBitsAvg) / N;
% 绘制瀑布曲线
EbN0dB = 0:1:20; % 信噪比范围
berMaxVec = zeros(size(EbN0dB));
berSelVec = zeros(size(EbN0dB));
berAvgVec = zeros(size(EbN0dB));
for i = 1:length(EbN0dB)
snr = 10^(EbN0dB(i)/10);
noiseVar = 1 / (2 * snr);
rxSig = awgn(txSig, noiseVar, 'measured');
rxSigMax = max(rxSig, [], 2);
rxBitsMax = qamdemod(rxSigMax, M);
berMaxVec(i) = sum(bits ~= rxBitsMax) / N;
rxSigSel = zeros(N, 1);
for j = 1:N
if abs(rxSig(j, 1)) > abs(rxSig(j, 2))
rxSigSel(j) = rxSig(j, 1);
else
rxSigSel(j) = rxSig(j, 2);
end
end
rxBitsSel = qamdemod(rxSigSel, M);
berSelVec(i) = sum(bits ~= rxBitsSel) / N;
rxSigAvg = mean(rxSig, 2);
rxBitsAvg = qamdemod(rxSigAvg, M);
berAvgVec(i) = sum(bits ~= rxBitsAvg) / N;
end
semilogy(EbN0dB, berMaxVec, EbN0dB, berSelVec, EbN0dB, berAvgVec);
legend('最大值合并', '选择式合并', '等增益合并');
xlabel('信噪比(dB)');
ylabel('误码率');
```
注意,这只是一个示例代码,实际应用中可能需要根据具体情况进行修改和调整。另外,需要确保 Matlab 版本为 2022b,并且已经安装了通信工具箱。
阅读全文