基于 Matlab 的微波分集接收系统的仿真,第一步,生成随机二进制序列;第二步,将序列信息映射到星座图上;第三步;利用 rayleighchan 函数仿真经过瑞利信;第四步,添加高斯白噪声 模拟接收信号;第五步,在接收端使用最大值合并,选择式合并,等增益合并;第六步,判决 计算误码率 绘制瀑布曲线,要求在matlab2022b版本上运行,并保证rxSig的第二个维度长度大于等于2
时间: 2023-12-07 09:03:38 浏览: 195
好的,我来帮你分步解决这个仿真问题。
第一步,生成随机二进制序列:
```matlab
% 生成随机二进制序列,长度为 seqLen
seqLen = 10000;
bits = randi([0,1],seqLen,1);
```
第二步,将序列信息映射到星座图上:
```matlab
% 星座图定义,这里使用 16QAM 星座图
M = 16;
constellation = qammod(0:M-1,M);
% 将二进制序列映射到星座图上
msg = bi2de(reshape(bits,log2(M),[]).','left-msb') + 1;
modSig = constellation(msg).';
```
第三步,利用 rayleighchan 函数仿真经过瑞利信道:
```matlab
% 定义瑞利衰落信道参数,这里使用 1 Hz 的最大多普勒频移
maxDopplerShift = 1;
chan = rayleighchan(1/100e3,maxDopplerShift);
chan.StoreHistory = true;
% 信号经过瑞利衰落信道
rxSig = filter(chan,modSig);
```
第四步,添加高斯白噪声模拟接收信号:
```matlab
% 定义噪声功率
EbNo = 10; % 信噪比为 10 dB
noisePower = 10^(-EbNo/10);
% 生成高斯白噪声
noise = sqrt(noisePower/2)*(randn(size(rxSig)) + 1j*randn(size(rxSig)));
% 接收信号加上高斯白噪声
rxSig = rxSig + noise;
```
第五步,最大值合并:
```matlab
% 最大值合并
maxComb = max(rxSig,[],2);
```
选择式合并:
```matlab
% 选择式合并
thresh = 0.5; % 设置阈值
selComb = zeros(size(rxSig,1),1);
for i = 1:size(rxSig,1)
if abs(rxSig(i,1)) > thresh*abs(rxSig(i,2))
selComb(i) = rxSig(i,1);
else
selComb(i) = rxSig(i,2);
end
end
```
等增益合并:
```matlab
% 等增益合并
eqComb = sum(rxSig,2)/sqrt(2);
```
第六步,判决计算误码率绘制瀑布曲线:
```matlab
% 判决
maxBits = de2bi(find(constellation==maxComb)-1,log2(M));
selBits = de2bi(find(constellation==selComb)-1,log2(M));
eqBits = de2bi(find(constellation==eqComb)-1,log2(M));
% 计算误码率
maxBer = mean(bits~=maxBits,'all');
selBer = mean(bits~=selBits,'all');
eqBer = mean(bits~=eqBits,'all');
% 绘制瀑布曲线
EbNoVec = -5:2:20;
maxBerVec = zeros(size(EbNoVec));
selBerVec = zeros(size(EbNoVec));
eqBerVec = zeros(size(EbNoVec));
for i = 1:length(EbNoVec)
% 计算噪声功率
EbNo = EbNoVec(i);
noisePower = 10^(-EbNo/10);
% 生成高斯白噪声
noise = sqrt(noisePower/2)*(randn(size(rxSig)) + 1j*randn(size(rxSig)));
% 计算接收信号
rxSig = filter(chan,modSig);
rxSig = rxSig + noise;
% 最大值合并
maxComb = max(rxSig,[],2);
maxBits = de2bi(find(constellation==maxComb)-1,log2(M));
maxBerVec(i) = mean(bits~=maxBits,'all');
% 选择式合并
selComb = zeros(size(rxSig,1),1);
for j = 1:size(rxSig,1)
if abs(rxSig(j,1)) > thresh*abs(rxSig(j,2))
selComb(j) = rxSig(j,1);
else
selComb(j) = rxSig(j,2);
end
end
selBits = de2bi(find(constellation==selComb)-1,log2(M));
selBerVec(i) = mean(bits~=selBits,'all');
% 等增益合并
eqComb = sum(rxSig,2)/sqrt(2);
eqBits = de2bi(find(constellation==eqComb)-1,log2(M));
eqBerVec(i) = mean(bits~=eqBits,'all');
end
% 绘制瀑布曲线图
semilogy(EbNoVec,maxBerVec,'-o',EbNoVec,selBerVec,'-x',EbNoVec,eqBerVec,'-+');
xlabel('Eb/No (dB)');
ylabel('BER');
legend('Max Combining','Selection Combining','Equal Gain Combining');
grid on;
```
需要注意的是,生成的随机二进制序列和星座图、瑞利信道的参数,以及信噪比和阈值等参数,都可以根据具体情况进行调整。另外,为了绘制更加平滑的瀑布曲线,可以增加仿真次数并取平均误码率。
阅读全文