Этот пример показывает, как гибридное формирование луча используется на передающем конце массивной системы связи MIMO, используя методы как для многопользовательских, так и для однопользовательских систем. В примере используется полное канальное зондирование для определения информации о состоянии канала в передатчике. Он разделяет требуемое предварительное кодирование на цифровые компоненты основной полосы частот и аналоговые радиочастотные компоненты, используя различные методы для многопользовательских и однопользовательских систем. Упрощенные полностью цифровые приемники восстанавливают множество переданных потоков данных, чтобы выделить общие показатели достоинств для системы связи, а именно EVM и BER.
В примере используется модель пространственного канала на основе рассеяния, которая учитывает пространственные местоположения передачи/приема и диаграммы направленности антенн. Более простой статический-плоский канал MIMO также предлагается для целей проверки связи.
Пример требует Коммуникаций Toolbox™ и Поэтапная Система Множества Toolbox™.
Постоянно растущая потребность в высокой скорости передачи данных и большей пропускной способности пользователя увеличивает потребность в более эффективном использовании доступного спектра. Многопользовательский MIMO (MU-MIMO) улучшает эффективность спектра, позволяя передатчику базовой станции (BS) осуществлять связь одновременно с множеством приемников мобильных станций (MS), используя одни и те же ресурсы временной частоты. Массивная MIMO позволяет количеству антенных элементов BS быть порядка десятков или сотен, тем самым также увеличивая число потоков данных в ячейке до большого значения.
Беспроводные системы следующего поколения, 5G, используют полосы миллиметровой волны (mmWave), чтобы использовать преимущества более широкой полосы пропускания. Системы 5G также развертывают крупномасштабные антенные решетки для уменьшения серьезных потерь на распространение в диапазоне mmWave.
По сравнению с современными беспроводными системами длина волны в диапазоне mmWave значительно меньше. Хотя это позволяет решетке содержать больше элементов в пределах одного и того же физического измерения, становится намного дороже обеспечить один модуль приема-передачи (TR) или радиочастотную цепь для каждого антенного элемента. Гибридные приемопередатчики являются практическим решением, поскольку они используют комбинацию аналоговых формирователей луча в радиочастотных и цифровых формирователях луча в модулирующих доменах, с меньшим количеством радиочастотных цепей, чем количество передающих элементов [1].
В этом примере используется многопользовательская система MIMO-OFDM для выделения разделения требуемого предварительного кодирования на его цифровые аналоговые компоненты основной полосы и РЧ на стороне передатчика. Основываясь на системе, выделенной в примере предварительного кодирования MIMO-OFDM с помощью фазированных массивов (панель инструментов системы фазированных массивов), этот пример показывает формулировку матриц предварительного кодирования на передающем конце и их применение к системе 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
Для пространственно мультиплексированной системы наличие канальной информации в передатчике позволяет применять предварительное кодирование для максимизации энергии сигнала в направлении и канале, представляющих интерес. В предположении о медленно изменяющемся канале этому способствует то, что канал звучит первым. БС слышит канал с использованием опорной передачи, которую приемник МС использует для оценки канала. МС передает информацию оценки канала обратно в БС для вычисления предварительного кодирования, необходимого для последующей передачи данных.
На следующей схеме показана обработка для моделируемого зондирующего канала.

Для выбранной системы 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 для определения весов предварительного кодирования. Пример предполагает идеальную обратную связь без задержек квантования или реализации.
В примере используется алгоритм [3] поиска ортогонального согласования (OMP) для однопользовательской системы и метод совместного мультиплексирования с пространственным разделением каналов (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являются усредненными весовыми коэффициентами по нескольким поднесущим. Шаблон отклика массива показывает различные потоки данных, представленные более сильными долями. Эти лепестки указывают на разброс или разделяемость, достигаемую при формировании луча. В примере Введение в гибридное формирование луча (Phased Array System Toolbox) сравниваются шаблоны, реализованные оптимальным, полностью цифровым подходом, с шаблонами, реализованными из выбранного гибридного подхода, для однопользовательской системы.
В примере моделируется архитектура, в которой каждый поток данных отображается на отдельную радиочастотную цепь, и каждый антенный элемент соединен с каждой радиочастотной цепью. Это показано на следующей схеме.

Далее мы конфигурируем передатчик данных системы. Эта обработка включает в себя канальное кодирование, преобразование битов в комплексные символы, разделение отдельного потока данных на множество потоков передачи, предварительное кодирование основной полосы частот потоков передачи, модуляцию OFDM с отображением пилот-сигнала и формирование радиочастотного аналогового луча для всех используемых передающих антенн.
% 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;
Для выбранной полностью подключенной РЧ-архитектуры каждый антенный элемент использует prm.numSTS фазовращатели, как указано отдельными столбцами mFrf матрица.
Ниже показана моделируемая обработка для передачи и приема данных.

В примере предлагается опция для пространственного канала MIMO и более простой статический-плоский канал MIMO для целей проверки.
Модель рассеяния использует аппроксимацию трассировки луча с одним отскоком с параметризованным числом рассеивателей. В этом примере количество рассеивателей устанавливается равным 100. Опция «Рассеяние» моделирует рассеиватели, размещенные случайным образом в сфере вокруг приемника, аналогично однокольцевой модели [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] = helperMIMOEqualize(rxOFDM(:,numSTS+1:end,:),hD(:,stsIdx,:)); % 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. «Гибридное формирование луча для Massive MIMO: A Survey». IEEE ® Communications Magazine, том 55, № 9, сентябрь 2017, стр. 134-141.
Ли З., С. Хань и А. Ф. Молиш. «Гибридный дизайн формирования диаграммы направленности для миллиметровой волны многопользовательской массивной MIMO нисходящей линии связи». IEEE ICC 2016, симпозиум по обработке сигналов для коммуникаций.
El Ayach, Oma и др. «Пространственно разреженное предварительное кодирование в системах MIMO миллиметровой волны». IEEE Transactions on Wireless Communications, том 13, № 3, март 2014 г., стр. 1499-1513.
Adhikary A., J. Nam, J-Y Ahn и G. Caire. «Совместное пространственное разделение и мультиплексирование - режим большого массива». IEEE Transactions on Information Theory, Vol. 59, No. 10, October 2013, pp. 6441-6463.
Спенсер В., А. Суиндлхерст, М. Хаардт, «Методы нулевого форсирования для пространственного мультиплексирования нисходящей линии связи в многопользовательских MIMO-каналах». IEEE Transactions on Signal Processing, том 52, № 2, февраль 2004 года, стр. 461-471.
Шуи, Д. С., Г. Дж. Фоскини, М. Дж. Ганса и Дж. М. Кана. «Корреляция замирания и ее влияние на пропускную способность многоэлементных антенных систем». IEEE Transactions on Communications, Vol. 48, No. 3, March 2000, pp. 502-513.