大规模MIMO混合波束形成
这个例子展示了混合波束形成如何在大规模MIMO通信系统的传输端使用,同时使用多用户和单用户系统的技术。本例采用全信道测深来确定发射机的信道状态信息。它将所需的预编码划分为数字基带和模拟RF组件,使用不同的技术用于多用户和单用户系统。简化的全数字接收机恢复多个传输数据流,以突出通信系统的共同优点,即EVM和BER。
该示例采用了基于散射的空间信道模型,该模型考虑了发射/接收空间位置和天线模式。为了链路验证的目的,还提供了一个更简单的静态平面MIMO通道。
该示例需要通信工具箱™和相控阵系统工具箱™。
简介
对高数据速率和更大用户容量的不断增长的需求增加了更有效地使用可用频谱的需求。多用户MIMO (MU-MIMO)通过允许基站(BS)发射机使用相同的时频资源与多个移动站(MS)接收机同时通信,提高了频谱效率。大规模MIMO允许BS天线单元的数量达到数十或数百个数量级,从而也将单元中的数据流数量增加到一个较大的值。
下一代5G无线系统使用毫米波(mmWave)波段来利用其更宽的带宽。5G系统还部署了大规模天线阵列,以减轻毫米波波段的严重传播损失。
与目前的无线系统相比,毫米波波段的波长要小得多。尽管这允许一个阵列在相同的物理尺寸内包含更多的元件,但为每个天线元件提供一个发射-接收(TR)模块或射频链的成本要高得多。混合收发器是一种实用的解决方案,因为它们在射频领域使用模拟波束形成器,在基带领域使用数字波束形成器,其射频链比发射元件数量更少[1].
本例使用多用户MIMO-OFDM系统突出显示了在发射端将所需的预编码划分为其数字基带和射频模拟组件。在系统的基础上重点介绍了相控阵MIMO-OFDM预编码(相控阵系统工具箱)本例展示了传输端预编码矩阵的公式及其在MIMO-OFDM系统中的应用。
S = rng(67);为可重复性设置RNG状态
系统参数
为示例定义系统参数。修改这些参数,了解对系统的影响。
%多用户系统,每个用户有单个/多个流prm.numUsers= 4;%用户数量prm.numSTSVec= [3 2 1 2];%每个用户独立数据流的个数prm.numSTS= sum(prm.numSTSVec);%必须是2的幂人口、难民和移民事务局。numTx = prm.numSTS*8;% BS发射天线数(2的幂)人口、难民和移民事务局。numRx = prm.numSTSVec*4;每个用户接收天线数量% (any >= numSTSVec)每个用户具有相同的调制人口、难民和移民事务局。bitsPerSubCarrier = 4;% 2: qpsk, 4:16 qam, 6:64 qam, 8:256qamprm.numDataSymbols= 10;% OFDM数据符号数% MS位置:假设原点为BS以[方位角;仰角]度表示的角度。% az in range [-180 180], el in range[-90 90],例如[45;0]maxRange = 1000;%在BS 1000米范围内的所有MSs人口、难民和移民事务局。mobileRanges = randi([1 maxRange],1,prm.numUsers);人口、难民和移民事务局。mobileAngles = [rand(1,prm.numUsers)*360-180;...兰特(prm.numUsers) * 180 - 90);人口、难民和移民事务局。Fc = 28e9;% 28 GHz系统人口、难民和移民事务局。chanSRate = 100e6;通道采样率,100 Msps人口、难民和移民事务局。ChanType =“散射”;通道选项:“散射”,“MIMO”人口、难民和移民事务局。NFig = 8;%噪音数值(增加至恶化,5-10分贝)prm.nRays= 500;用于Frf, Fbb分区的射线数
定义用于系统的OFDM调制参数。
人口、难民和移民事务局。FFTLength = 256;人口、难民和移民事务局。CyclicPrefixLength = 64;人口、难民和移民事务局。numCarriers = 234;人口、难民和移民事务局。NullCarrierIndices = [1:7 129 256-5:256]';%卫兵和DC人口、难民和移民事务局。PilotCarrierIndices = [26 54 90 118 140 168 204 232]';nonDataIdx = [prm.NullCarrierIndices;prm.PilotCarrierIndices];人口、难民和移民事务局。CarriersLocations = setdiff((1:prm.FFTLength)', sort(nonDataIdx));numSTS = prm.numSTS;numTx = prm.numTx;numRx = prm.numRx;numSTSVec = prm.numSTSVec; codeRate = 1/3;%每个用户相同的码率numTails = 6;%终止尾位数人口、难民和移民事务局。numFrmBits = numSTSVec.*(prm.numDataSymbols*prm.numCarriers* ....prm.bitsPerSubCarrier * codeRate) -numTails;人口、难民和移民事务局。modMode = 2^prm.bitsPerSubCarrier;调制阶数考虑信道滤波器延迟numPadSym = 3;到零opad的符号数量的%人口、难民和移民事务局。numPadZeros = numPadSym*(prm.FFTLength+prm.CyclicPrefixLength);
定义系统的发送和接收数组和位置参数。
人口、难民和移民事务局。cLight = physconst(“光速”);人口、难民和移民事务局。lambda = prm.cLight/prm.fc;获取发送和接收数组信息[isTxURA,expFactorTx,isRxURA,expFactorRx] = helperArrayInfo(prm,true);发射天线阵列定义%阵列位置和角度人口、难民和移民事务局。posTx = [0;0;0];% BS/发射阵列位置,[x;y;z],米如果isTxURA均匀矩形阵列Txarray =相控。PartitionedArray (...“数组”,分阶段。([expFactorTx numSTS], 0.5 * prm.lambda),...“SubarraySelection”的(numSTS numTx),“SubarraySteering”,“自定义”);其他的均匀线阵Txarray =相控。齿龈(numTx“ElementSpacing”0.5 * prm.lambda...“元素”,分阶段。IsotropicAntennaElement (“BackBaffled”、假));结束人口、难民和移民事务局。posTxElem = getElementPosition(txarray)/prm.lambda;spLoss = 0 (prm.numUsers,1);人口、难民和移民事务局。posRx = 0 (3,prm.numUsers);为uIdx = 1:prm.numUsers%接收数组如果isRxURA (uIdx)均匀矩形阵列Rxarray =相控。PartitionedArray (...“数组”, phased.URA ([expFactorRx (uIdx) numSTSVec (uIdx)],...0.5 * prm.lambda),“SubarraySelection”的(numSTSVec (uIdx),...numRx (uIdx)),“SubarraySteering”,“自定义”);人口、难民和移民事务局。posRxElem = getElementPosition(rxarray)/prm.lambda;其他的如果numRx (uIdx) > 1均匀线阵rxarray = phase . ula (numRx(uIdx),...“ElementSpacing”0.5 * prm.lambda...“元素”, phased.IsotropicAntennaElement);人口、难民和移民事务局。posRxElem = getElementPosition(rxarray)/prm.lambda;其他的rxarray = phase . isotropicantennaelement;人口、难民和移民事务局。posRxElem = [0;0;0);% LCS结束结束%流动职位[xRx,yRx,zRx] = sph2cart(deg2rad(prm.mobileAngles(1,uIdx)),...uIdx函数(prm.mobileAngles (2)),...prm.mobileRanges (uIdx));prm.posRx(:,uIdx) = [xRx;yRx;zRx];[toRxRange,toRxAng] = rangeangle(prm.posTx,prm.posRx(:,uIdx));spLoss(uIdx) = fspl(toRxRange,prm.lambda);结束
通道状态信息
对于空间多路复用系统,发射机上信道信息的可用性允许应用预编码以最大化感兴趣方向和信道上的信号能量。在假设信道变化缓慢的情况下,这可以通过先探测信道来实现。BS通过使用参考传输来探测信道,MS接收机使用参考传输来估计信道。MS将信道估计信息传回BS,用于计算后续数据传输所需的预编码。
下面的原理图显示了通道探测建模的处理过程。
对于所选择的MIMO系统,一个前导信号被发送到所有发射天线元件上,并在接收端处理该信道。接收天线元件对所有链路进行预放大、OFDM解调和频域信道估计。
%产生前导信号prm.numSTS= numTx;%设置为numTx以发出所有通道preambleSig = helperGenPreamble(prm);通过信道传输前导prm.numSTS= numSTS;%保持相同的阵列配置通道[rxPreSig,chanDelay] = helperApplyMUChannel(preambleSig,prm,spLoss);通道状态信息反馈hDp = cell(prm.numUsers,1);prm.numSTS= numTx;%设置为numTx估计所有链接为uIdx = 1:prm.numUsers前端放大器增益和热噪声rxPreAmp =相控的。ReceiverPreamp (...“获得”spLoss (uIdx),...%考虑路径丢失“NoiseFigure”人口、难民和移民事务局。NFig,“ReferenceTemperature”, 290,...“SampleRate”, prm.chanSRate);rxPreSigAmp = rxPreAmp(rxPreSig{uIdx});所使用子载波的%比例功率rxPreSigAmp = rxPreSigAmp *(根号(prm。FFTLength -...长度(prm.NullCarrierIndices)) / prm.FFTLength);% OFDM解调rxOFDM = ofdmdemod(rxPreSigAmp(chanDelay(uIdx)+1:...结束(prm.numPadZeros-chanDelay (uIdx)):), prm.FFTLength,...prm.CyclicPrefixLength prm.CyclicPrefixLength,...prm.NullCarrierIndices prm.PilotCarrierIndices);%来自序言的信道估计% numCarr, numTx, numRxhDp{uIdx} = helperMIMOChannelEstimate(rxOFDM(:,1:numTx,:),prm);结束
对于多用户系统,信道估计由每个MS反馈,并由BS确定预编码权值。该示例假设完美反馈,没有量化或实现延迟。
混合波束形成
本例使用正交匹配追踪(OMP)算法[3.]用于单用户系统和联合空间划分多路复用技术[2,4]用于多用户系统,以确定数字基带Fbb
和射频模拟降维
为所选系统配置预编码权重。
对于单用户系统,OMP分区算法对阵列响应向量敏感在
.理想情况下,这些响应向量可以解释信道中看到的所有散射体,但这些对于实际系统和信道实现是未知的,因此使用三维空间内的随机射线集来覆盖尽可能多的散射体。的prm.nRays
参数指定射线数。
对于多用户系统,JSDM将具有相似发射信道协方差的用户分组在一起,并通过基于块对角化方法的模拟预编码器抑制组间干扰[5].在这里,每个用户都被分配到自己的组中,因此不会减少声音或反馈开销。
在发射端计算混合权重如果prm.numUsers = = 1单用户OMP%散布射线在[az;el]=[-180:180;-90:90] 3D空间,等间距% txang = [-180:360/prm.nRays:180;90:180 / prm.nRays: 90);txang = [rand(1,prm.nRays)*360-180;rand(1,prm.nRays)*180-90];%随机At = steervec(prm.posTxElem,txang);AtExp =复杂(零(prm.numCarriers,大小(At,1),大小(At,2)));为carrIdx = 1:prm。numCarriers AtExp(carrIdx,:,:) = At;%相同的所有子运营商结束%正交匹配追求混合权重[Fbb,Frf] = omphybweights(hDp{1},numSTS,numSTS,AtExp);v = Fbb;设置基带预编码器(Fbb)对于平坦信道,子载波的% Frf是相同的mFrf = permute(mean(Frf,1),[2 3 1]);其他的多用户联合空间分复用[Fbb,mFrf] = helperJSDMTransmitWeights(hDp,prm);%多用户基带预编码将每个用户的CSI打包成一个矩阵(块对角线)steeringMatrix = 0 (prm.numCarriers,sum(numSTSVec),sum(numSTSVec));为uIdx = 1:prm.numUsersstsIdx = sum(numSTSVec(1:uIdx-1))+(1:numSTSVec(uIdx)); steeringMatrix(:,stsIdx,stsIdx) = Fbb{uIdx};% Nst-by-Nsts-by-Nsts结束v = permute(steeringMatrix,[1 3 2]);结束传输阵列模式图如果isTxURA第一个子载波的URA元素响应模式(txarray、prm.fc 180:180 90:90,“类型”,“efield”,...“ElementWeights”, mFrf。*挤压(v (1::)),...“PropagationSpeed”, prm.cLight);其他的%齿龈第一个子载波的阵列响应wts = mFrf.'*挤压(v(1,:,:));模式(txarray、prm.fc 180:180 90:90,“类型”,“efield”,...“重量”出世(:1),“PropagationSpeed”, prm.cLight);结束prm.numSTS= numSTS;%恢复数据传输
对于宽带OFDM系统建模,模拟权值mFrf
,是多个子载波的平均权重。阵列响应模式显示由较强的叶瓣表示的不同数据流。这些裂片表明了波束形成所实现的扩散或可分离性。的混合波束形成简介(相控阵系统工具箱)示例比较了单用户系统中由最优全数字化方法实现的模式与由所选混合方法实现的模式。
数据传输
该示例模拟了一个架构,其中每个数据流映射到一个单独的射频链,每个天线元件连接到每个射频链。如下图所示。
接下来,我们配置系统的数据发送器。该处理包括信道编码、位映射到复杂符号、将单个数据流分割为多个发射流、发射流的基带预编码、使用导频映射的OFDM调制以及所有发射天线的射频模拟波束形成。
%卷积编码器encoder = com . convolutionalencoder (...“TrellisStructure”,poly2trellis(7,[133 171 165]),...“TerminationMethod”,“终止”);txDataBits = cell(prm。numUsers, 1);gridData =复杂(零(prm.numCarriers,prm.numDataSymbols,numSTS));为uIdx = 1:prm.numUsers从每个用户的位生成映射符号txDataBits{uIdx} = randi([0,1],prm.numFrmBits(uIdx),1);encodedBits =编码器(txDataBits{uIdx});位到QAM符号的映射mappedSym = qammod(encodedBits,prm.modMode,“InputType”,“一点”,...“UnitAveragePower”,真正的);映射到层:每个用户、每个符号、每个数据流stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:numSTSVec(uIdx));gridData(:,:,stsIdx) =重塑(mappedSym,prm.numCarriers,...prm.numDataSymbols numSTSVec (uIdx));结束对子载波应用预编码权重,假设完全反馈preData =复杂(零(prm.numCarriers,prm.numDataSymbols,numSTS));为symIdx = 1:prm.numDataSymbols为carrIdx = 1:prm。numCarriers Q = squeeze(v(carrIdx,:,:));normQ = Q *√(numTx)/norm(Q,“摇来摇去”);preData(carrIdx,symIdx,:) = squeeze(gridData(carrIdx,symIdx,:))).'...* normQ;结束结束%多天线飞行员飞行员= helperGenPilots(prm.numDataSymbols,numSTS);% OFDM调制的数据txOFDM = ofdmmod(preData,prm.FFTLength,prm.CyclicPrefixLength,...prm.NullCarrierIndices prm.PilotCarrierIndices,飞行员);所使用子载波的%比例功率txOFDM = txOFDM * (prm。FFTLength /...√(prm.FFTLength-length prm.NullCarrierIndices))));生成带有反馈权重和数据前缀的序文preambleSigD = helperGenPreamble(prm,v);txSigSTS = [preambleSigD;txOFDM];% RF波束形成:将RF应用于数字信号每个天线元件连接到每个数据流txSig = txSigSTS*mFrf;
对于所选的全连接射频架构,每个天线元件使用prm.numSTS
移相器,由各列给出mFrf
矩阵。
数据传输和接收建模的处理如下所示。
信号传播
该示例提供了一个空间MIMO通道选项和一个更简单的静态平面MIMO通道,用于验证目的。
散射模型使用带有参数化散射体数量的单反射射线跟踪近似。对于本例,散射器的数量设置为100。“散射”选项模拟散射器随机放置在接收器周围的球体内,类似于单环模型[6].
信道模型允许路径损失建模以及视线(LOS)和非LOS传播条件。该示例假设非los传播和各向同性天线单元模式具有线性或矩形几何结构。
将空间定义的通道应用到传输信号[rxSig,chanDelay] = helperApplyMUChannel(txSig,prm,spLoss,preambleSig);
同一信道用于测深和数据传输。数据传输具有较长的持续时间,并由数据符号的数量参数控制,prm.numDataSymbols
.探测级和传输级之间的信道演化通过将前导信号前置到数据信号来建模。序文将通道启动为数据传输的有效状态,并且在通道输出中被忽略。
对于多用户系统,对每个用户的独立通道进行建模。
接收放大和信号恢复
每个用户建模的接收机通过放大来补偿路径损失,并添加热噪声。与发射机一样,MIMO-OFDM系统中使用的接收机也包含许多阶段,包括OFDM解调、MIMO均衡、QAM解调和信道解码。
Hfig = figure(“名字”,“每个流的均衡符号星座”);scFact = ((prm.FFTLength-length(prm.NullCarrierIndices)).../ prm.FFTLength ^ 2) / numTx;nVar = noisepow(prm.chanSRate,prm.NFig,290)/scFact;解码器= com . viterbidecoder (“InputFormat”,“Unquantized”,...“TrellisStructure”,poly2trellis(7, [133 171 165]),...“TerminationMethod”,“终止”,“OutputDataType”,“双”);为uIdx = 1:prm.numUsersstsU = numSTSVec(uIdx); stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:stsU);前端放大器增益和热噪声rxPreAmp =相控的。ReceiverPreamp (...“获得”spLoss (uIdx),...%考虑路径丢失“NoiseFigure”人口、难民和移民事务局。NFig,“ReferenceTemperature”, 290,...“SampleRate”, prm.chanSRate);rxSigAmp = rxPreAmp(rxSig{uIdx});已占用子载波的规模功率rxSigAmp = rxSigAmp*(sqrt(prm.FFTLength-length(prm.NullCarrierIndices))).../ prm.FFTLength);% OFDM解调rxOFDM = ofdmdemod(rxSigAmp(chanDelay(uIdx)+1:...结束(prm.numPadZeros-chanDelay (uIdx)):), prm.FFTLength,...prm.CyclicPrefixLength prm.CyclicPrefixLength,...prm.NullCarrierIndices prm.PilotCarrierIndices);来自映射序文的信道估计hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm);% MIMO均衡为感兴趣的用户索引到流中[rxEq, CSI] = helperMIMOEqualize (rxOFDM (numSTS + 1::,:),高清(:,stsIdx:));%软解调rxSymbs = rxEq(:)/sqrt(numTx);rxLLRBits = qamdemod(rxSymbs,prm.modMode,“UnitAveragePower”,真的,...“OutputType”,“approxllr”,“NoiseVariance”据nVar);在解码之前应用CSIrxLLRtmp =重塑(rxLLRBits,prm.bitsPerSubCarrier,[],...prm.numDataSymbols stsU);csitmp =重塑(CSI,1,[],1,numSTSVec(uIdx));rxScaledLLR = rxLLRtmp.*csitmp;%软输入通道解码rxDecoded =解码器(rxScaledLLR(:));%已解码的接收位rxBits = rxDecoded(1:prm.numFrmBits(uIdx));为每个用户的所有流绘制均衡符号标量= ceil(max(abs([real(rxSymbs(:)));图像放大(rxSymbs (:))))));为i = 1:stsU subplot(prm。numUsers, max(numSTSVec), (uIdx-1)*max(numSTSVec)+i);plot(重塑(rxEq(:,:,i)/sqrt(numTx), [], 1),“。”);轴广场甘氨胆酸xlim(、(标量标量));甘氨胆酸ylim(、(标量标量));标题([“U”num2str (uIdx)', ds 'num2str (i)));网格在;结束计算并显示EVMevm = com . evm“归一化”,“平均星座功率”,...“ReferenceSignalSource”,“从参考星座估计”,...“ReferenceConstellation”,...qammod ((0: prm.modMode-1)、prm.modMode“UnitAveragePower”1));rmsEVM = evm(rxSymbs);disp ([“用户”num2str (uIdx)]);disp ([' RMS evm (%) = 'num2str (rmsEVM)]);计算和显示误码率ber = com . errorrate;measures = ber(txDataBits{uIdx},rxBits);流(' BER = %.5f;不。of Bits = %d;不。误差= %d\n',...(1),(3)措施的人,措施(2));结束
用户1 RMS EVM (%) = 0.38361 BER = 0.00000;不。of Bits = 9354;不。用户2 RMS EVM (%) = 1.0311 BER = 0.00000;不。of Bits = 6234;不。用户3 RMS EVM(%) = 2.1462误码率= 0.00000;不。 of Bits = 3114; No. of errors = 0 User 4 RMS EVM (%) = 1.0024 BER = 0.00000; No. of Bits = 6234; No. of errors = 0
对于模拟的MIMO系统,显示的均衡符号的接收星座提供了接收的定性评估。实际误码率通过比较每个用户实际发送的比特和接收的解码比特来提供定量的数字。
rng(年代);%恢复RNG状态
结论及进一步探索
该示例着重介绍了混合波束形成在多用户MIMO-OFDM系统中的应用。它允许您通过更改一些系统范围的参数来探索各种通道模型的不同系统配置。
可配置的参数集包括用户数量、每个用户的数据流数量、发射/接收天线单元数量、阵列位置和信道模型。调整这些参数可以研究参数对整个系统的单独或组合影响。例如:
用户数量,
prm.numUsers
,及其对应的数据流,prm.numSTSVec
,在多用户和单用户系统之间切换,或通道类型,
人口、难民和移民事务局。ChanType
,或射线的数量,
prm.nRays
,用于单用户系统。
探索以下示例中使用的helper函数:
参考文献
Molisch, A. F.等。“大规模MIMO的混合波束形成:一个调查。”IEEE®通信杂志,第55卷,第9期,2017年9月,第134-141页。
李震,韩世山,A. F.莫里施。毫米波多用户大规模MIMO下行链路的混合波束形成设计。IEEE ICC 2016,通信信号处理研讨会。
El Ayach, Oma,等。“毫米波MIMO系统中的空间稀疏预编码”IEEE无线通信汇刊,第13卷,第3期,2014年3月,第1499-1513页。
Adhikary A., J. Nam, J-Y Ahn, G. Caire。联合空间划分和多路复用-大规模阵列体制。《IEEE信息理论汇刊》,2013年10月,第59卷第10期,第6441-6463页。
Spencer Q., A. Swindlehurst, M. Haardt,“多用户MIMO信道下行空间多路复用的零强制方法”。《IEEE信号处理汇刊》,第52卷,第2期,2004年2月,第461-471页。
水德寿,G. J.福斯尼,M. J.甘斯和J. M.卡恩。衰落相关性及其对多单元天线系统容量的影响。IEEE通讯汇刊,第48卷,第3期,2000年3月,第502-513页。