Массивное гибридное формирования луча MIMO

Этот пример показывает, как гибридное формирование луча используется в передающем конце массивной коммуникационной системы MIMO, используя методы как для многопользовательских, так и для однопользовательских систем. В примере используется полное зондирование канала для определения информации о состоянии канала в передатчике. Он разделяет необходимое предварительное кодирование на цифровые модулирующие и аналоговые RF компоненты, используя различные методы для многопользовательских и однопользовательских систем. Упрощенные полностью цифровые приемники восстанавливают множество передаваемых потоков данных, чтобы выделить общие рисунки заслуг коммуникационной системы, а именно EVM и BER.

В примере используется основанная на рассеянии модель пространственного канала, которая учитывает пространственные местоположения передачи/приема и шаблонов антенны. Более простой статический и плоский канал MIMO также предлагается в целях валидации ссылки.

Пример требует Communications Toolbox™ и Phased Array System Toolbox™.

Введение

Постоянно растущий спрос на высокую скорость передачи данных и увеличение емкости пользователей увеличивает необходимость более эффективного использования доступного спектра. Многопользовательский MIMO (MU-MIMO) улучшает эффективность спектра, позволяя передатчику базовой станции (BS) связываться одновременно с множеством приемников мобильных станций (MS), используя одни и те же ресурсы временных частот. Массивный MIMO позволяет количество антенных элементов BS порядка десятков или сотен, тем самым также увеличивая количество потоков данных в камеру до большого значения.

Следующая генерация, 5G, беспроводных систем использует диапазоны волн миллиметра (mmWave), чтобы использовать преимущества более широкой полосы пропускания. Системы 5G также развертывают большие антенные решетки, чтобы уменьшить серьезные потери распространения в полосе mmWave.

По сравнению с текущими беспроводными системами длина волны в полосе mmWave намного меньше. Несмотря на то, что это позволяет массиву содержать больше элементов в пределах одной и той же физической размерности, становится намного дороже обеспечить один модуль приема и передачи (TR) или RF цепь для каждого антенного элемента. Гибридные приемопередатчики являются практичным решением, поскольку они используют комбинацию аналоговых лучевых форматоров в RF и цифровых лучевых форматорах в областях основной полосы частот с меньшим количеством радиочастотных цепей, чем количество передающих элементов [1].

Этот пример использует многопользовательскую систему MIMO-OFDM, чтобы выделить разбиение необходимого предварительного кодирования на цифровую полосу частот и аналоговые компоненты RF на конце передатчика. Основываясь на системе, выделенной в примере MIMO-OFDM Precoding with Фазированные Решетки, этот пример показывает формулировку матриц предварительного кодирования конца передачи и их применение в системе 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 приемника использует для оценки канала. МС передает информацию оценки канала назад в БС для вычисления предварительного кодирования, необходимого для последующей передачи данных.

Следующая схема показывает обработку моделируемого зондирования канала.

Для выбранной системы 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

Для многопользовательской системы оценка канала передается назад от каждой МС и используется БС для определения весов предварительного кодирования. Пример принимает идеальную обратную связь без квантования или задержек реализации.

Гибридное формирования луча

Пример использует алгоритм ортогонального согласования (OMP) [3] для однопользовательской системы и метод совместного пространственного мультиплексирования (JSDM) [2, 4] для многопользовательской системы, чтобы определить цифровую полосу пропускания Fbb и RF-аналоговые Frf веса предварительного кодирования для выбранных системных строений.

Для однопользовательской системы алгоритм разбиения OMP чувствителен к векторам отклика массива At. В идеале эти векторы отклика учитывают все рассеиватели, видимые каналом, но они неизвестны для фактической реализации системы и канала, поэтому используется случайный набор лучей в трехмерном пространстве, чтобы охватить как можно больше рассеивателей. The 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, являются средними весами по нескольким поднесущим. Диаграмма направленности массива показывает отдельные потоки данных, представленные более сильными лепестками. Эти доли указывают на распространение или разделяемость, достигаемые путем формирования луча. Пример Введения в гибридное формирования луча сравнивает шаблоны, реализованные оптимальным, полностью цифровым подходом, с теми, что реализованы из выбранного гибридного подхода, для однопользовательской системы.

Передача данных

Пример моделирует архитектуру, где каждый поток данных преобразуется в индивидуума 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;

Для выбранной, полностью подключенной радиочастотной архитектуры каждый антенный элемент использует prm.numSTS фазы, как задано отдельными столбцами mFrf матрица.

Обработка для смоделированных передачи и приема данных показана ниже.

Распространение сигнала

Пример предлагает опцию для пространственного канала 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] = 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, используется для однопользовательской системы.

Исследуйте следующие вспомогательные функции, используемые в примере:

Ссылки

  1. Molisch, A. F., et al. Гибридное формирование луча для массивного MIMO: A Survey (неопр.). Журнал IEEE ® Communications Magazine, том 55, № 9, сентябрь 2017, стр. 134-141.

  2. Ли З., С. Хань, и А. Ф. Молиш. Гибридный проект формирования луча для многопользовательского MIMO-нисходящего канала с многопользовательской волной. IEEE ICC 2016, Симпозиум по обработке сигналов для связи.

  3. El Ayach, Oma, et al. Пространственно-разреженное предварительное кодирование в системах MIMO волны миллиметра. Транзакции IEEE по беспроводной связи, том 13, № 3, март 2014, стр. 1499-1513.

  4. Adhikary A., J. Nam, J-Y Ahn, and G. Caire. «Совместное пространственное деление и мультиплексирование - широкомасштабный режим массивов». Транзакции IEEE по теории информации, том 59, № 10, октябрь 2013, стр. 6441-6463.

  5. Spencer Q., A. Swindlehurst, M. Haardt, «Методы нулевого форсирования для нисходящего пространственного мультиплексирования в многопользовательских каналах MIMO». Транзакции IEEE по обработке сигналов, том 52, № 2, февраль 2004 года, стр. 461-471.

  6. Шуй, Д. С., Г. Дж. Фоскини, М. Дж. Ганс и Дж. М. Кан. «Затухающая корреляция и ее эффект на пропускную способность многоэлементных антенных систем». Транзакции IEEE по коммуникациям, том 48, № 3, март 2000 года, стр. 502-513.