第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
文章目录
- 摘要
- 1 背景意义
- 2 理论基础
- 2.1 大规模MIMO上行链路模型
- 2.2 最大似然检测
- 2.2 匹配滤波(Matched Filter, MF)
- 2.3 最小均方误差检测(MMSE)
- 2.3 SIMO性能上界
- 2.4 诺伊曼级数近似(Neumann Series)
- 2.5 高斯-赛德尔迭代(Gauss-Seidel)
- 2.6共轭梯度法(Conjugate Gradient, CG)
- 2.7优化坐标下降BOX检测器(OCDBOX)
- 2.8 ADMM无穷范数检测器
- 3 仿真结果
摘要
本文提出一个研究了大规模多输入多输出(MIMO)上行链路系统中主流信号检测算法的性能,实现了八种具有代表性的检测器,分为三类:(1)传统线性检测方案,包括匹配滤波(MF)和最小均方误差(MMSE)检测;(2)基于近似求逆的检测方法,包括诺伊曼级数近似、高斯-赛德尔迭代和共轭梯度(CG)检测;(3)基于BOX约束的检测方法,包括基于交替方向乘子法的无穷范数(ADMIN)检测器和优化坐标下降BOX(OCDBOX)检测器。此外,单输入多输出(SIMO)上界作为理想性能基准提供。
参考文章:
S. Shahabddin, M. Juntti and C. Studer, “ADMM-based infinity-norm detector for large-scale MIMO”, IEEE International symposium of circuits and systems, Maryland, USA, May 2017.
1 背景意义
大规模MIMO技术在基站端部署数十至数百根天线,在同一时频资源内服务多个用户终端,能够显著提升系统频谱效率和链路可靠性,已成为5G无线通信系统的关键使能技术之一。然而,大规模MIMO带来的性能增益是以计算复杂度的显著增加为代价的。在上行链路中,基站需要从所有用户同时发送的叠加信号中准确检测出每个用户的发送符号,这一检测过程的计算复杂度随着用户数和调制阶数的增长而急剧上升。
最优的最大似然(ML)检测通过对所有可能的发送符号组合进行穷举搜索实现,其复杂度随用户数呈指数增长[3],在大规模MIMO系统中完全不可行。传统的线性检测算法如匹配滤波(MF)和最小均方误差(MMSE)检测[4]虽然复杂度较低,但在天线数接近用户数时性能严重恶化。
2 理论基础
2.1 大规模MIMO上行链路模型
2.2 最大似然检测
2.2 匹配滤波(Matched Filter, MF)
2.3 最小均方误差检测(MMSE)
2.3 SIMO性能上界
假设在检测第 k 个用户时完美消除了所有其他用户的干扰:
2.4 诺伊曼级数近似(Neumann Series)
2.5 高斯-赛德尔迭代(Gauss-Seidel)
2.6共轭梯度法(Conjugate Gradient, CG)
2.7优化坐标下降BOX检测器(OCDBOX)
2.8 ADMM无穷范数检测器
ADMM将(18)改写为等价形式,采用ADMM求解
3 仿真结果
部分代码:
ifisempty(varargin)disp('使用默认仿真设置和参数...')%设置默认仿真参数 par.suffix='exp';%仿真名称后缀:'exp'实验 par.runId=0;%仿真ID(用于复现结果) par.MR=64;%接收天线数 par.MT=16;%用户终端数(不大于MR!) par.mod='64QAM';%调制类型:'BPSK','QPSK','16QAM','64QAM'par.simName=['ERR_'num2str(par.MR)'x'num2str(par.MT)'_'par.mod'_'par.suffix];%仿真名称(用于保存结果) par.trials=100;%蒙特卡洛试验次数 par.SNRdB_list=10:2:20;%待仿真的SNR[dB]列表 par.detector={'MF','SIMO','Conjugate-Gradient','Neumann','Gauss-Seidel','OCDBOX','ADMIN','MMSE'};%待仿真的检测器列表%算法专用参数 par.alg.maxiter=3;%迭代算法的最大迭代次数elsedisp('使用自定义仿真设置和参数...')par=varargin{1};%唯一参数为par结构体 end%--初始化%使用runId随机种子(保证可复现性)%rng(par.runId);%建立格雷映射的星座字母表(依据IEEE802.11)switch(par.mod)case'BPSK'par.symbols=[-11];case'QPSK'par.symbols=[-1-1i,-1+1i,...+1-1i,+1+1i];case'16QAM'par.symbols=[-3-3i,-3-1i,-3+3i,-3+1i,...-1-3i,-1-1i,-1+3i,-1+1i,...+3-3i,+3-1i,+3+3i,+3+1i,...+1-3i,+1-1i,+1+3i,+1+1i];case'64QAM'par.symbols=[-7-7i,-7-5i,-7-1i,-7-3i,-7+7i,-7+5i,-7+1i,-7+3i,...-5-7i,-5-5i,-5-1i,-5-3i,-5+7i,-5+5i,-5+1i,-5+3i,...-1-7i,-1-5i,-1-1i,-1-3i,-1+7i,-1+5i,-1+1i,-1+3i,...-3-7i,-3-5i,-3-1i,-3-3i,-3+7i,-3+5i,-3+1i,-3+3i,...+7-7i,+7-5i,+7-1i,+7-3i,+7+7i,+7+5i,+7+1i,+7+3i,...+5-7i,+5-5i,+5-1i,+5-3i,+5+7i,+5+5i,+5+1i,+5+3i,...+1-7i,+1-5i,+1-1i,+1-3i,+1+7i,+1+5i,+1+1i,+1+3i,...+3-7i,+3-5i,+3-1i,+3-3i,+3+7i,+3+5i,+3+1i,+3+3i];end%提取平均符号能量 par.Es=mean(abs(par.symbols).^2);%预计算比特标签 par.Q=log2(length(par.symbols));%每个符号的比特数 par.bits=de2bi(0:length(par.symbols)-1,par.Q,'left-msb');%跟踪仿真时间 time_elapsed=0;%--开始仿真%初始化结果数组(检测器 x SNR) res.VER=zeros(length(par.detector),length(par.SNRdB_list));%向量错误率 res.SER=zeros(length(par.detector),length(par.SNRdB_list));%符号错误率 res.BER=zeros(length(par.detector),length(par.SNRdB_list));%比特错误率%生成随机比特流(天线 x 比特 x 试验) bits=randi([01],par.MT,par.Q,par.trials);%试验循环 ticfort=1:par.trials%生成发送符号 idx=bi2de(bits(:,:,t),'left-msb')+1;s=par.symbols(idx).';%生成独立同分布的高斯信道矩阵和噪声向量 n=sqrt(0.5)*(randn(par.MR,1)+1i*randn(par.MR,1));H=sqrt(0.5)*(randn(par.MR,par.MT)+1i*randn(par.MR,par.MT));%通过无噪声信道发送(稍后使用) x=H*s;%SNR 循环fork=1:length(par.SNRdB_list)%当前SNR点(dB) SNR_dB=par.SNRdB_list(k);%线性SNR SNR_lin=10.^(SNR_dB./10);%每根接收天线的复噪声方差 N0=par.Es*par.MT/SNR_lin;%通过有噪声信道发送数据 y=x+sqrt(N0)*n;%算法循环ford=1:length(par.detector)switch(par.detector{d})%选择算法case'MF'%匹配滤波[idxhat,bithat]=MF(par,H,y);case'MMSE'%MMSE检测器[idxhat,bithat]=MMSE(par,H,y,N0);case'SIMO'%SIMO下界[idxhat,bithat]=SIMO(par,H,y,s);case'ADMIN'%基于ADMM的无穷范数检测器[idxhat,bithat]=ADMIN(par,H,y,N0);case'OCDBOX'%优化坐标下降BOX检测器[idxhat,bithat]=OCDBOX(par,H,y);case'Neumann'%诺伊曼级数近似[idxhat,bithat]=Neumann(par,H,y,N0);case'Gauss-Seidel'%高斯-赛德尔检测器[idxhat,bithat]=Gauss_Seidel(par,H,y,N0);case'Conjugate-Gradient'%共轭梯度检测器[idxhat,bithat]=CG(par,H,y,N0);otherwiseerror('par.detector 类型未定义。')end%--计算错误指标 err=(idx~=idxhat);res.VER(d,k)=res.VER(d,k)+any(err);res.SER(d,k)=res.SER(d,k)+sum(err)/par.MT;res.BER(d,k)=res.BER(d,k)+sum(sum(bits(:,:,t)~=bithat))/(par.MT*par.Q);end%算法循环结束 end%SNR循环结束%跟踪仿真时间iftoc>10time=toc;time_elapsed=time_elapsed+time;fprintf('预计剩余仿真时间: %3.0f 分钟。\n',time_elapsed*(par.trials/t-1)/60);tic end end%试验循环结束%归一化结果 res.VER=res.VER/par.trials;res.SER=res.SER/par.trials;res.BER=res.BER/par.trials;res.time_elapsed=time_elapsed;%--保存最终结果(par和res结构体)%save([par.simName'_'num2str(par.runId)],'par','res');%--显示结果(生成美观的Matlab图形) marker_style={'bo-','rs--','mv-.','kp:','g*-','c>--','yx:','k--'};figure(1)ford=1:length(par.detector)ifd==1semilogy(par.SNRdB_list,res.BER(d,:),marker_style{d},'LineWidth',2)hold onelsesemilogy(par.SNRdB_list,res.BER(d,:),marker_style{d},'LineWidth',2)end end hold off grid onxlabel('每根接收天线的平均SNR [dB]','FontSize',12)ylabel('比特误码率 (BER)','FontSize',12)axis([min(par.SNRdB_list)max(par.SNRdB_list)1e-41])legend(par.detector,'FontSize',12)set(gca,'FontSize',12)end