Massive MIMO ハイブリッド ビームフォーミング
この例では、マルチユーザー システムおよびシングルユーザー システムの両方の手法を使用して、ハイブリッド ビームフォーミングが Massive MIMO 通信システムの送信端でどのように使われるかを示します。この例では、送信機のチャネル状態情報を特定するためにフル チャネル サウンディングを使用します。マルチユーザー システムとシングルユーザー システムに異なる手法を使用して、必要なプリコーディングをデジタル ベースバンドとアナログ RF 成分に分割します。簡易なオールデジタル受信機は、複数の送信されたデータ ストリームを再生し、通信システムにとって有用かつ共通な数値、すなわち EVM および BER を明らかにします。
この例では、送信/受信の空間的位置とアンテナ パターンを考慮する、散乱ベースの空間チャネル モデルを使用します。リンクの検証のために、より単純で静的なフラット MIMO チャネルも提供されます。
この例には、Communications Toolbox™ および Phased Array System Toolbox™ が必要です。
はじめに
ますます増加する高いデータ レートとユーザー容量の需要によって、利用可能なスペクトルのより効率的な利用に対するニーズが高まっています。マルチユーザー MIMO (MU-MIMO) では、同じ時間-周波数リソースを使用して基地局 (BS) の送信機が複数の移動局 (MS) の受信機と同時に通信できるようにすることによってスペクトル効率を改善します。Massive MIMO では、BS アンテナ素子数を数十から数百の規模にできるため、セル内のデータ ストリーム数も大きな値に増やすことができます。
次世代の 5G 無線システムでは、ミリメートル波 (mmWave) 帯を使用してより広い帯域を活用できます。5G システムでは、大規模アンテナ アレイも展開し、mmWave 帯における著しい伝播損失を軽減します。
現在の無線システムと比較して、mmWave 帯における波長はかなり短くなります。これにより同じ物理的寸法のアレイにより多くの素子を含めることができますが、1 つの送信-受信 (TR) モジュール、または各アンテナ素子への RF チェーンの提供はずっと高価になります。ハイブリッド トランシーバーは、RF ではアナログ ビームフォーマー、ベースバンド領域ではデジタル ビームフォーマーの組み合わせを使用するので、RF チェーンが送信素子数よりも少なく、現実的な解決策です [1]。
この例では、マルチユーザー MIMO-OFDM システムを使用し、送信機端における必要なプリコーディングのデジタル ベースバンドと RF アナログ成分への分割を示します。MIMO-OFDM Precoding with Phased Arrays (Phased Array System Toolbox)の例で示したシステムを基に、この例では送信端のプリコーディング行列の公式化と、それらの MIMO-OFDM システムへの適用を示します。
s = rng(67); % Set RNG state for repeatability
システム パラメーター
例として、システム パラメーターを定義します。これらのパラメーターを変更するとシステムへの影響を調べることができます。
% Multi-user system with single/multiple streams per user prm.numUsers = 4; % Number of users prm.numSTSVec = [3 2 1 2]; % Number of independent data streams per user prm.numSTS = sum(prm.numSTSVec); % Must be a power of 2 prm.numTx = prm.numSTS*8; % Number of BS transmit antennas (power of 2) prm.numRx = prm.numSTSVec*4; % Number of receive antennas, per user (any >= numSTSVec) % Each user has the same modulation prm.bitsPerSubCarrier = 4; % 2: QPSK, 4: 16QAM, 6: 64QAM, 8: 256QAM prm.numDataSymbols = 10; % Number of OFDM data symbols % MS positions: assumes BS at origin % Angles specified as [azimuth;elevation] degrees % az in range [-180 180], el in range [-90 90], e.g. [45;0] maxRange = 1000; % all MSs within 1000 meters of BS prm.mobileRanges = randi([1 maxRange],1,prm.numUsers); prm.mobileAngles = [rand(1,prm.numUsers)*360-180; ... rand(1,prm.numUsers)*180-90]; prm.fc = 28e9; % 28 GHz system prm.chanSRate = 100e6; % Channel sampling rate, 100 Msps prm.ChanType = 'Scattering'; % Channel options: 'Scattering', 'MIMO' prm.NFig = 8; % Noise figure (increase to worsen, 5-10 dB) prm.nRays = 500; % Number of rays for Frf, Fbb partitioning
システムに使用する OFDM 変調パラメーターを定義します。
prm.FFTLength = 256; prm.CyclicPrefixLength = 64; prm.numCarriers = 234; prm.NullCarrierIndices = [1:7 129 256-5:256]'; % Guards and DC prm.PilotCarrierIndices = [26 54 90 118 140 168 204 232]'; nonDataIdx = [prm.NullCarrierIndices; prm.PilotCarrierIndices]; prm.CarriersLocations = setdiff((1:prm.FFTLength)', sort(nonDataIdx)); numSTS = prm.numSTS; numTx = prm.numTx; numRx = prm.numRx; numSTSVec = prm.numSTSVec; codeRate = 1/3; % same code rate per user numTails = 6; % number of termination tail bits prm.numFrmBits = numSTSVec.*(prm.numDataSymbols*prm.numCarriers* ... prm.bitsPerSubCarrier*codeRate)-numTails; prm.modMode = 2^prm.bitsPerSubCarrier; % Modulation order % Account for channel filter delay numPadSym = 3; % number of symbols to zeropad prm.numPadZeros = numPadSym*(prm.FFTLength+prm.CyclicPrefixLength);
送信および受信アレイとシステムの位置的パラメーターを定義します。
prm.cLight = physconst('LightSpeed'); prm.lambda = prm.cLight/prm.fc; % Get transmit and receive array information [isTxURA,expFactorTx,isRxURA,expFactorRx] = helperArrayInfo(prm,true); % Transmit antenna array definition % Array locations and angles prm.posTx = [0;0;0]; % BS/Transmit array position, [x;y;z], meters if isTxURA % Uniform Rectangular array txarray = phased.PartitionedArray(... 'Array',phased.URA([expFactorTx numSTS],0.5*prm.lambda),... 'SubarraySelection',ones(numSTS,numTx),'SubarraySteering','Custom'); else % Uniform Linear array txarray = phased.ULA(numTx, 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',false)); end prm.posTxElem = getElementPosition(txarray)/prm.lambda; spLoss = zeros(prm.numUsers,1); prm.posRx = zeros(3,prm.numUsers); for uIdx = 1:prm.numUsers % Receive arrays if isRxURA(uIdx) % Uniform Rectangular array rxarray = phased.PartitionedArray(... 'Array',phased.URA([expFactorRx(uIdx) numSTSVec(uIdx)], ... 0.5*prm.lambda),'SubarraySelection',ones(numSTSVec(uIdx), ... numRx(uIdx)),'SubarraySteering','Custom'); prm.posRxElem = getElementPosition(rxarray)/prm.lambda; else if numRx(uIdx)>1 % Uniform Linear array rxarray = phased.ULA(numRx(uIdx), ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement); prm.posRxElem = getElementPosition(rxarray)/prm.lambda; else rxarray = phased.IsotropicAntennaElement; prm.posRxElem = [0; 0; 0]; % LCS end end % Mobile positions [xRx,yRx,zRx] = sph2cart(deg2rad(prm.mobileAngles(1,uIdx)), ... deg2rad(prm.mobileAngles(2,uIdx)), ... prm.mobileRanges(uIdx)); prm.posRx(:,uIdx) = [xRx;yRx;zRx]; [toRxRange,toRxAng] = rangeangle(prm.posTx,prm.posRx(:,uIdx)); spLoss(uIdx) = fspl(toRxRange,prm.lambda); end
チャネル状態情報
空間的に多重化されたシステムの場合、送信機でのチャネル情報を利用できることで、対象の方向とチャネルにおける信号エネルギーを最大化するためのプリコーディングの適用が可能になります。チャネルがゆっくり変化するという仮定の下で、これはチャネルを最初にサウンディングすることによって容易になります。BS は、MS 受信機がチャネルを推定するために使用する基準伝送を用いて、チャネルをサウンディングします。MS は、後続のデータ送信に必要なプリコーディングの計算のために、チャネル推定情報を BS に送り返します。
次の図は、モデル化されたチャネル サウンディングの処理を示します。
選択した MIMO システムの場合、プリアンブル信号がすべての送信アンテナ素子全体から送信され、チャネルを調整する受信機で処理されます。受信機アンテナ素子は、すべてのリンクに対して事前増幅、OFDM 復調、および周波数領域チャネル推定を実行します。
% Generate the preamble signal prm.numSTS = numTx; % set to numTx to sound out all channels preambleSig = helperGenPreamble(prm); % Transmit preamble over channel prm.numSTS = numSTS; % keep same array config for channel [rxPreSig,chanDelay] = helperApplyMUChannel(preambleSig,prm,spLoss); % Channel state information feedback hDp = cell(prm.numUsers,1); prm.numSTS = numTx; % set to numTx to estimate all links for uIdx = 1:prm.numUsers % Front-end amplifier gain and thermal noise rxPreAmp = phased.ReceiverPreamp( ... 'Gain',spLoss(uIdx), ... % account for path loss 'NoiseFigure',prm.NFig,'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); rxPreSigAmp = rxPreAmp(rxPreSig{uIdx}); % scale power for used sub-carriers rxPreSigAmp = rxPreSigAmp * (sqrt(prm.FFTLength - ... length(prm.NullCarrierIndices))/prm.FFTLength); % OFDM demodulation rxOFDM = ofdmdemod(rxPreSigAmp(chanDelay(uIdx)+1: ... end-(prm.numPadZeros-chanDelay(uIdx)),:),prm.FFTLength, ... prm.CyclicPrefixLength,prm.CyclicPrefixLength, ... prm.NullCarrierIndices,prm.PilotCarrierIndices); % Channel estimation from preamble % numCarr, numTx, numRx hDp{uIdx} = helperMIMOChannelEstimate(rxOFDM(:,1:numTx,:),prm); end
マルチユーザー システムでは、各 MS からチャネル推定がフィード バックされ、BS がプリコーディングの重みを決定するために使用します。この例では、量子化または実装遅延のない完全なフィードバックを想定しています。
ハイブリッド ビームフォーミング
この例では、シングルユーザー システムには直交マッチング追跡 (OMP) アルゴリズム [3] を、マルチユーザー システムにはジョイント空間分割多重 (JSDM) 手法 [2、4] を使用して、選択したシステム構成のデジタル ベースバンド Fbb
と RF アナログ Frf
プリコーディングの重みを決定します。
シングルユーザー システムでは、OMP 分割アルゴリズムは、アレイ応答ベクトル At
の影響を受けます。理想的には、これらの応答ベクトルがチャネルから見えるすべての分布点を構成します。しかしこれらは、実際のシステムやチャネルの実現の場合には不明であるため、可能な限り多くの分布点をカバーするために 3 次元空間内の波の無作為な集合が使用されます。prm.nRays
パラメーターは、波の数を指定します。
マルチユーザー システムでは、JSDM は類似の送信チャネル共分散を持つユーザーをまとめてグループ化し、ブロック対角化法 [5] に基づいたアナログ事前コーダーによってグループ間の干渉を抑制します。ここでは各ユーザーをその独自のグループに割り当てることで、サウンディングとフィードバックのオーバーヘッドの削減につなげます。
% Calculate the hybrid weights on the transmit side if prm.numUsers==1 % Single-user OMP % Spread rays in [az;el]=[-180:180;-90:90] 3D space, equal spacing % txang = [-180:360/prm.nRays:180; -90:180/prm.nRays:90]; txang = [rand(1,prm.nRays)*360-180;rand(1,prm.nRays)*180-90]; % random At = steervec(prm.posTxElem,txang); AtExp = complex(zeros(prm.numCarriers,size(At,1),size(At,2))); for carrIdx = 1:prm.numCarriers AtExp(carrIdx,:,:) = At; % same for all sub-carriers end % Orthogonal matching pursuit hybrid weights [Fbb,Frf] = omphybweights(hDp{1},numSTS,numSTS,AtExp); v = Fbb; % set the baseband precoder (Fbb) % Frf is same across subcarriers for flat channels mFrf = permute(mean(Frf,1),[2 3 1]); else % Multi-user Joint Spatial Division Multiplexing [Fbb,mFrf] = helperJSDMTransmitWeights(hDp,prm); % Multi-user baseband precoding % Pack the per user CSI into a matrix (block diagonal) steeringMatrix = zeros(prm.numCarriers,sum(numSTSVec),sum(numSTSVec)); for uIdx = 1:prm.numUsers stsIdx = sum(numSTSVec(1:uIdx-1))+(1:numSTSVec(uIdx)); steeringMatrix(:,stsIdx,stsIdx) = Fbb{uIdx}; % Nst-by-Nsts-by-Nsts end v = permute(steeringMatrix,[1 3 2]); end % Transmit array pattern plots if isTxURA % URA element response for the first subcarrier pattern(txarray,prm.fc,-180:180,-90:90,'Type','efield', ... 'ElementWeights',mFrf.'*squeeze(v(1,:,:)), ... 'PropagationSpeed',prm.cLight); else % ULA % Array response for first subcarrier wts = mFrf.'*squeeze(v(1,:,:)); pattern(txarray,prm.fc,-180:180,-90:90,'Type','efield', ... 'Weights',wts(:,1),'PropagationSpeed',prm.cLight); end prm.numSTS = numSTS; % revert back for data transmission
モデル化された広帯域 OFDM システムでは、アナログの重み mFrf
は複数のサブキャリアの平均の重みです。アレイ応答パターンは、より強いローブで表されるはっきりしたデータ ストリームを示します。これらのローブは、ビームフォーミングによって実現された広がりと分離可能性を示します。Introduction to Hybrid Beamforming (Phased Array System Toolbox)の例では、最適な完全デジタル方式のアプローチによって実現したパターンと、シングルユーザーのシステム向けに選択されたハイブリッド方式のアプローチで実現したパターンとの比較を行います。
データ送信
この例では、各データ ストリームが個々の RF チェーンにマッピングされ、各アンテナ素子が各 RF チェーンに接続されているアーキテクチャをモデル化します。これを次の図に示します。
次に、システムのデータの送信機を構成します。この処理には、チャネル符号化、複素数シンボルへのビット マッピング、個別のデータ ストリームの複数の送信ストリームへの分割、送信ストリームのベースバンドプリコーディング、パイロット マッピングによる OFDM 変調、および使用されているすべての送信アンテナの RF アナログ ビームフォーミングが含まれます。
% Convolutional encoder encoder = comm.ConvolutionalEncoder( ... 'TrellisStructure',poly2trellis(7,[133 171 165]), ... 'TerminationMethod','Terminated'); txDataBits = cell(prm.numUsers, 1); gridData = complex(zeros(prm.numCarriers,prm.numDataSymbols,numSTS)); for uIdx = 1:prm.numUsers % Generate mapped symbols from bits per user txDataBits{uIdx} = randi([0,1],prm.numFrmBits(uIdx),1); encodedBits = encoder(txDataBits{uIdx}); % Bits to QAM symbol mapping mappedSym = qammod(encodedBits,prm.modMode,'InputType','bit', ... 'UnitAveragePower',true); % Map to layers: per user, per symbol, per data stream stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:numSTSVec(uIdx)); gridData(:,:,stsIdx) = reshape(mappedSym,prm.numCarriers, ... prm.numDataSymbols,numSTSVec(uIdx)); end % Apply precoding weights to the subcarriers, assuming perfect feedback preData = complex(zeros(prm.numCarriers,prm.numDataSymbols,numSTS)); for symIdx = 1:prm.numDataSymbols for carrIdx = 1:prm.numCarriers Q = squeeze(v(carrIdx,:,:)); normQ = Q * sqrt(numTx)/norm(Q,'fro'); preData(carrIdx,symIdx,:) = squeeze(gridData(carrIdx,symIdx,:)).' ... * normQ; end end % Multi-antenna pilots pilots = helperGenPilots(prm.numDataSymbols,numSTS); % OFDM modulation of the data txOFDM = ofdmmod(preData,prm.FFTLength,prm.CyclicPrefixLength,... prm.NullCarrierIndices,prm.PilotCarrierIndices,pilots); % scale power for used sub-carriers txOFDM = txOFDM * (prm.FFTLength/ ... sqrt((prm.FFTLength-length(prm.NullCarrierIndices)))); % Generate preamble with the feedback weights and prepend to data preambleSigD = helperGenPreamble(prm,v); txSigSTS = [preambleSigD;txOFDM]; % RF beamforming: Apply Frf to the digital signal % Each antenna element is connected to each data stream txSig = txSigSTS*mFrf;
選択した、完全接続型の RF アーキテクチャでは、各アンテナ素子は、mFrf
行列の個々の列によって指定されるように prm.numSTS
フェーズ シフターを使用します。
モデル化されているデータの送信と受信の処理を次に示します。
信号伝播
この例では、空間 MIMO チャネルのオプションと、検証目的用のより簡潔な静的フラット MIMO チャネルを提供します。
分布モデルでは、パラメーター化された分布点の数で単一バウンスのレイトレーシング近似を使用します。この例では、分布点の数は 100 に設定されています。'Scattering' オプションは、ワンリング モデル [6] と同様に、受信機を中心とした球体内にランダムに配置された分布点をモデル化します。
チャネル モデルでは、パス損失のモデル化、および見通し内 (LOS) と非 LOS の両方の伝播条件が許可されます。この例では、非 LOS 伝播と線形または矩形ジオメトリを持つ等方性アンテナ素子パターンを想定しています。
% Apply a spatially defined channel to the transmit signal
[rxSig,chanDelay] = helperApplyMUChannel(txSig,prm,spLoss,preambleSig);
サウンディングとデータ伝送の両方に同じチャネルが使用されます。データ送信は、期間がより長く、データ シンボル数のパラメーター prm.numDataSymbols
によって制御されます。サウンディング段階と伝送段階の間のチャネルの変化は、プリアンブル信号をデータ信号の前に付加することによってモデル化されます。プリアンブルは、データ送信が有効な状態になるようチャネルを準備し、チャネル出力では無視されます。
マルチユーザー システムでは、ユーザーごとの独立したチャネルがモデル化されます。
受信増幅と信号再生
ユーザーごとにモデル化された受信機は、増幅によってパス損失を補正し、熱ノイズを追加します。送信機と同様に、MIMO-OFDM システムで使用される受信機には、OFDM 復調、MIMO イコライズ、QAM デマッピング、チャネル復号化など、多くの段階が含まれます。
hfig = figure('Name','Equalized symbol constellation per stream'); scFact = ((prm.FFTLength-length(prm.NullCarrierIndices))... /prm.FFTLength^2)/numTx; nVar = noisepow(prm.chanSRate,prm.NFig,290)/scFact; decoder = comm.ViterbiDecoder('InputFormat','Unquantized', ... 'TrellisStructure',poly2trellis(7, [133 171 165]), ... 'TerminationMethod','Terminated','OutputDataType','double'); for uIdx = 1:prm.numUsers stsU = numSTSVec(uIdx); stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:stsU); % Front-end amplifier gain and thermal noise rxPreAmp = phased.ReceiverPreamp( ... 'Gain',spLoss(uIdx), ... % account for path loss 'NoiseFigure',prm.NFig,'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); rxSigAmp = rxPreAmp(rxSig{uIdx}); % Scale power for occupied sub-carriers rxSigAmp = rxSigAmp*(sqrt(prm.FFTLength-length(prm.NullCarrierIndices)) ... /prm.FFTLength); % OFDM demodulation rxOFDM = ofdmdemod(rxSigAmp(chanDelay(uIdx)+1: ... end-(prm.numPadZeros-chanDelay(uIdx)),:),prm.FFTLength, ... prm.CyclicPrefixLength,prm.CyclicPrefixLength, ... prm.NullCarrierIndices,prm.PilotCarrierIndices); % Channel estimation from the mapped preamble hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm); % MIMO equalization % Index into streams for the user of interest [rxEq,CSI] = ofdmEqualize(rxOFDM(:,numSTS+1:end,:),hD(:,stsIdx,:),'Algorithm','zf'); % Soft demodulation rxSymbs = rxEq(:)/sqrt(numTx); rxLLRBits = qamdemod(rxSymbs,prm.modMode,'UnitAveragePower',true, ... 'OutputType','approxllr','NoiseVariance',nVar); % Apply CSI prior to decoding rxLLRtmp = reshape(rxLLRBits,prm.bitsPerSubCarrier,[], ... prm.numDataSymbols,stsU); csitmp = reshape(CSI,1,[],1,numSTSVec(uIdx)); rxScaledLLR = rxLLRtmp.*csitmp; % Soft-input channel decoding rxDecoded = decoder(rxScaledLLR(:)); % Decoded received bits rxBits = rxDecoded(1:prm.numFrmBits(uIdx)); % Plot equalized symbols for all streams per user scaler = ceil(max(abs([real(rxSymbs(:)); imag(rxSymbs(:))]))); for i = 1:stsU subplot(prm.numUsers, max(numSTSVec), (uIdx-1)*max(numSTSVec)+i); plot(reshape(rxEq(:,:,i)/sqrt(numTx), [], 1), '.'); axis square xlim(gca,[-scaler scaler]); ylim(gca,[-scaler scaler]); title(['U ' num2str(uIdx) ', DS ' num2str(i)]); grid on; end % Compute and display the EVM evm = comm.EVM('Normalization','Average constellation power', ... 'ReferenceSignalSource','Estimated from reference constellation', ... 'ReferenceConstellation', ... qammod((0:prm.modMode-1)',prm.modMode,'UnitAveragePower',1)); rmsEVM = evm(rxSymbs); disp(['User ' num2str(uIdx)]); disp([' RMS EVM (%) = ' num2str(rmsEVM)]); % Compute and display bit error rate ber = comm.ErrorRate; measures = ber(txDataBits{uIdx},rxBits); fprintf(' BER = %.5f; No. of Bits = %d; No. of errors = %d\n', ... measures(1),measures(3),measures(2)); end
User 1 RMS EVM (%) = 0.38361 BER = 0.00000; No. of Bits = 9354; No. of errors = 0 User 2 RMS EVM (%) = 1.0311 BER = 0.00000; No. of Bits = 6234; No. of errors = 0 User 3 RMS EVM (%) = 2.1462 BER = 0.00000; No. 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(s); % restore RNG state
まとめとその他の調査
この例では、マルチユーザー MIMO-OFDM システムのハイブリッド ビームフォーミングの使用について示しています。これにより、いくつかのシステム全体のパラメーターを変更して、多様なチャネル モデル向けのさまざまなシステム構成を調べることができます。
構成可能なパラメーター セットには、ユーザーの数、ユーザーごとのデータ ストリームの数、送信/受信アンテナの素子の数、アレイの位置、チャネル モデルが含まれます。これらのパラメーターを調節することで、システム全体への個々のパラメーターの影響や組み合わせた場合の影響を調査できます。例として、次を変えてみます。
ユーザーの数、
prm.numUsers
、およびそれらの対応するデータ ストリーム、prm.numSTSVec
。マルチユーザーとシングルユーザーのシステムを切り替えます。あるいは、チャネル タイプ、
prm.ChanType
、またはシングルユーザー システムに使用する波の数、
prm.nRays
。
例で使用されている次の補助関数について調査します。
参考文献
Molisch, A. F., et al. "Hybrid Beamforming for Massive MIMO: A Survey." IEEE® Communications Magazine, Vol. 55, No. 9, September 2017, pp. 134-141.
Li Z., S. Han, and A. F. Molisch."Hybrid Beamforming Design for Millimeter-Wave Multi-User Massive MIMO Downlink."IEEE ICC 2016, Signal Processing for Communications Symposium.
El Ayach, Oma, et al. "Spatially Sparse Precoding in Millimeter Wave MIMO Systems." IEEE Transactions on Wireless Communications, Vol. 13, No. 3, March 2014, pp. 1499-1513.
Adhikary A., J. Nam, J-Y Ahn, and G. Caire."Joint Spatial Division and Multiplexing - The Large-Scale Array Regime."IEEE Transactions on Information Theory, Vol. 59, No. 10, October 2013, pp. 6441-6463.
Spencer Q., A. Swindlehurst, M. Haardt, "Zero-Forcing Methods for Downlink Spatial Multiplexing in Multiuser MIMO Channels."IEEE Transactions on Signal Processing, Vol. 52, No. 2, February 2004, pp. 461-471.
Shui, D. S., G. J. Foschini, M. J. Gans and J. M. Kahn."Fading Correlation and its Effect on the Capacity of Multielement Antenna Systems."IEEE Transactions on Communications, Vol. 48, No. 3, March 2000, pp. 502-513.