✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知,完整Matlab代码及仿真咨询内容私信。
🌿 往期回顾可以关注主页,点击搜索
⛄ 内容介绍
在无线通信系统中,接收性能的优化是一个重要的研究领域。Vblast(垂直布置的多天线)是一种多天线技术,通过在发送端和接收端使用多个天线来提高系统的性能。然而,为了实现Vblast系统,我们需要一些先进的算法来处理多天线之间的干扰。
本文将介绍基于最大比合并(MRC)、零离子(ZF)、最小均方误差(MMSE)、零离子-干扰消除(ZF-SIC)和最小均方误差-干扰消除(MMSE-SIC)算法的Vblast接收性能检测。我们将使用这些算法来绘制误比特率-接收天线数曲线,以评估它们在不同接收天线数下的性能。
首先,我们将简要介绍这些算法的原理。MRC算法通过将来自不同天线的信号进行合并,选择最强的信号来进行解调。这样可以有效地提高信号的质量。ZF算法通过将接收到的信号与信道矩阵的逆矩阵相乘,消除了多天线之间的干扰。MMSE算法则通过最小化均方误差来优化接收信号的质量。
接下来,我们将介绍ZF-SIC和MMSE-SIC算法。这些算法在ZF和MMSE的基础上,进一步消除了多天线之间的干扰。ZF-SIC算法首先使用ZF算法进行解调,然后对解调后的信号进行干扰消除。类似地,MMSE-SIC算法首先使用MMSE算法进行解调,然后对解调后的信号进行干扰消除。这样,我们可以进一步提高接收性能。
为了评估这些算法的性能,我们将绘制误比特率-接收天线数曲线。误比特率是衡量接收信号质量的指标,它表示在接收到的信号中每个比特错误的概率。我们将在不同的接收天线数下,使用MRC、ZF、MMSE、ZF-SIC和MMSE-SIC算法进行接收,并记录误比特率。然后,我们将这些数据绘制成曲线,以比较不同算法在不同接收天线数下的性能。
通过绘制误比特率-接收天线数曲线,我们可以看到不同算法的性能差异。在接收天线数较少的情况下,MRC算法可能表现较好。随着接收天线数的增加,ZF算法的性能可能逐渐超过MRC算法。而MMSE算法则可能在更高的接收天线数下表现更好。ZF-SIC和MMSE-SIC算法可以进一步提高性能,尤其是在较高的接收天线数下。
综上所述,基于MRC、ZF、MMSE、ZF-SIC和MMSE-SIC算法的Vblast接收性能检测可以帮助我们评估不同算法在多天线系统中的性能。通过绘制误比特率-接收天线数曲线,我们可以比较不同算法在不同接收天线数下的性能差异。这些算法可以为无线通信系统的优化提供有价值的参考。
⛄ 部分代码
% 仿真五种(MRC,ZF,MMSE,ZF-SIC,MMSE-SIC) Vblast接收的检测性能,绘制误比特率~接收天线数曲线。
% 发端初始化===============================================================
% 发射天线数tx,接收天线数rx,发射矩阵长度L(帧长)
clear all;
clc;
tx=10;
rx_number=[20:20:200];
L=10000;
Modulation='QPSK';
EbN0=5;
B=30000;Ts=1/24300;
SNR=EbN0-10*log10(Ts*B);
% SNR=5;
% 信源A
A=randi([0,3],tx*L,1);
% 经过QPSK调制的V-Blast发射矩阵X
X1=reshape(A,tx,L);
X=zeros(tx,L);
for k=1:L
X(:,k)=pskmod(X1(:,k),4);
end
% 检测
% MRC======================================================================
disp('MRC');
berm=[];
for rx=rx_number
rx
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
snr=10^(SNR/10);
R_noised=R+sqrt(1/snr)*n;
x=[];
% 逐时隙对接收符号矢量进行检测,合并得到一帧发射矩阵X的估计x
for t=1:L
r=R_noised(:,t);
HH=H(:,:,t);
G=HH';
y=G*r;
xtemp=zeros(tx,1);
for k=1:tx
if imag(y(k))<real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=1;
elseif imag(y(k))>real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=i;
elseif imag(y(k))>real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-1;
elseif imag(y(k))<real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-i;
end
end
x=[x,xtemp];
end
% 从x求A的估计a
x1=zeros(tx,L);
for k=1:L
x1(:,k)=pskdemod(x(:,k),4);
end
a=reshape(x1,tx*L,1);
% 比较A和a计算错值率temp_ber
[errbit,temp_ber]=biterr(A,a,2);
berm=[berm,temp_ber];
end
figure
semilogy(rx_number,berm,'*- g');
hold on
% ZF=======================================================================
disp('ZF');
berz=[];
for rx=rx_number
rx
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
snr=10^(SNR/10);
R_noised=R+sqrt(1/snr)*n;
x=[];
% 逐时隙对接收符号矢量进行检测,合并得到一帧发射矩阵X的估计x
for t=1:L
r=R_noised(:,t);
HH=H(:,:,t);
G=pinv(HH);
y=G*r;
xtemp=zeros(tx,1);
for k=1:tx
if imag(y(k))<real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=1;
elseif imag(y(k))>real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=i;
elseif imag(y(k))>real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-1;
elseif imag(y(k))<real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-i;
end
end
x=[x,xtemp];
end
% 从x求A的估计a
x1=zeros(tx,L);
for k=1:L
x1(:,k)=pskdemod(x(:,k),4);
end
a=reshape(x1,tx*L,1);
% 比较A和a计算错值率temp_ber
[errbit,temp_ber]=biterr(A,a,2);
berz=[berz,temp_ber];
end
semilogy(rx_number,berz,'o- b');
% MMSE=====================================================================
disp('MMSE');
bermm=[];
for rx=rx_number
rx
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
snr=10^(SNR/10);
R_noised=R+sqrt(1/snr)*n;
x=[];
% 逐时隙对接收符号矢量进行检测,合并得到一帧发射矩阵X的估计x
for t=1:L
r=R_noised(:,t);
HH=H(:,:,t);
G=inv(HH'*HH+(1/snr)*eye(tx))*HH';
y=G*r;
xtemp=zeros(tx,1);
for k=1:tx
if imag(y(k))<real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=1;
elseif imag(y(k))>real(y(k)) && imag(y(k))>-real(y(k))
xtemp(k)=i;
elseif imag(y(k))>real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-1;
elseif imag(y(k))<real(y(k)) && imag(y(k))<-real(y(k))
xtemp(k)=-i;
end
end
x=[x,xtemp];
end
% 从x求A的估计a
x1=zeros(tx,L);
for k=1:L
x1(:,k)=pskdemod(x(:,k),4);
end
a=reshape(x1,tx*L,1);
% 比较A和a计算错值率temp_ber
[errbit,temp_ber]=biterr(A,a,2);
bermm=[bermm,temp_ber];
end
semilogy(rx_number,bermm,'o- r');
% ZF-SIC===================================================================
disp('ZF-SIC');
berzs=[];
for rx=rx_number
rx
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
snr=10^(SNR/10);
R_noised=R+sqrt(1/snr)*n;
x=[];
for t=1:L
r=R_noised(:,t);
HH=H(:,:,t);
G=pinv(HH);
S=[1:tx];
xtemp=zeros(tx,1);
for k=1:tx
[wki,ki]=minnorm(G);
y=wki*r;
if imag(y)<real(y) && imag(y)>-real(y)
xtemp(S(ki))=1;
elseif imag(y)>real(y) && imag(y)>-real(y)
xtemp(S(ki))=i;
elseif imag(y)>real(y) && imag(y)<-real(y)
xtemp(S(ki))=-1;
elseif imag(y)<real(y) && imag(y)<-real(y)
xtemp(S(ki))=-i;
end
r=r-sqrt(1/tx)*xtemp(S(ki))*H(:,S(ki),t);
HH(:,ki)=[];
S(ki)=[];
G=pinv(HH);
end
x=[x,xtemp];
end
% 从x求A的估计a
x1=zeros(tx,L);
for k=1:L
x1(:,k)=pskdemod(x(:,k),4);
end
a=reshape(x1,tx*L,1);
% 比较A和a计算错值率temp_ber
[errbit,temp_ber]=biterr(A,a,2);
berzs=[berzs,temp_ber];
end
semilogy(rx_number,berzs,'s- b');
% MMSE-SIC=================================================================
disp('MMSE-SIC')
bermms=[];
for rx=rx_number
rx
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
snr=10^(SNR/10);
R_noised=R+sqrt(1/snr)*n;
x=[];
for t=1:L
r=R_noised(:,t);
HH=H(:,:,t);
% G=pinv(HH);
G=inv(HH'*HH+(1/snr)*eye(tx))*HH';
S=[1:tx];
xtemp=zeros(tx,1);
for k=1:tx
[wki,ki]=minnorm(G);
% w=inv(HH'*HH+(1/snr)*eye(tx-k+1))*HH';
% y=w(ki,:)*r;
y=wki*r;
if imag(y)<real(y) && imag(y)>-real(y)
xtemp(S(ki))=1;
elseif imag(y)>real(y) && imag(y)>-real(y)
xtemp(S(ki))=i;
elseif imag(y)>real(y) && imag(y)<-real(y)
xtemp(S(ki))=-1;
elseif imag(y)<real(y) && imag(y)<-real(y)
xtemp(S(ki))=-i;
end
r=r-sqrt(1/tx)*xtemp(S(ki))*H(:,S(ki),t);
HH(:,ki)=[];
S(ki)=[];
% G=pinv(HH);
G=inv(HH'*HH+(1/snr)*eye(tx-k))*HH';
end
x=[x,xtemp];
end
% 从x求A的估计a
x1=zeros(tx,L);
for k=1:L
x1(:,k)=pskdemod(x(:,k),4);
end
a=reshape(x1,tx*L,1);
% 比较A和a计算错值率temp_ber
[errbit,temp_ber]=biterr(A,a,2);
bermms=[bermms,temp_ber];
end
semilogy(rx_number,bermms,'s- r');
grid on
legend('MRC','ZF','MMSE','ZF-SIC','MMSE-SIC');
xlabel('接收天线数');
ylabel('误比特率(BER)');
title('blast检测比较')
⛄ 运行结果
⛄ 参考文献
[1]杨敬畏.大规模MIMO系统的检测算法研究[D].杭州电子科技大学[2023-08-14].