Крупный гибрид MIMO Beamforming

В этом примере показано, как гибрид beamforming используется в конце передачи крупной системы связи 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 и цифровых формирователей луча в основополосных областях с меньшим количеством цепей RF, чем количество элементов передачи [1].

Этот пример использует многопользовательскую систему MIMO-OFDM, чтобы подсветить разделение необходимого предварительного кодирования в его цифровую основную полосу и аналоговые компоненты RF в конце передатчика. Основываясь на системе, подсвеченной в Предварительном кодировании 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

Информация о состоянии канала

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

Гибридный Beamforming

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

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

Пример демонстрирует архитектуру, где каждый поток данных сопоставляет с отдельной цепью RF, и каждый антенный элемент соединяется с каждой цепью RF. Это показывают в следующей схеме.

Затем мы конфигурируем передатчик данных системы. Эта обработка включает кодирование канала, побитовое отображение, чтобы объединить символы, разделение отдельного потока данных к нескольким потокам передачи, основополосному предварительному кодированию потоков передачи, модуляции OFDM с экспериментальным отображением и аналогом RF beamforming для всех используемых антенн передачи.

% 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 каждый антенный элемент использует 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 demapping, и декодирование канала.

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

Заключение и дальнейшее исследование

Пример подсвечивает использование гибрида beamforming для многопользовательских систем MIMO-OFDM. Это позволяет вам исследовать различные конфигурации системы для множества моделей канала путем изменения нескольких параметров в масштабе всей системы.

Набор конфигурируемых параметров включает количество пользователей, количество потоков данных на пользователя, количество передают/получают антенные элементы, местоположения массивов и модели канала. При корректировке этих параметров можно изучить отдельное или совместное воздействие параметров на полную систему. Как примеры, варьируйтесь:

  • количество пользователей, prm.numUsers, и их соответствующие потоки данных, prm.numSTSVec, переключаться между многопользовательскими и однопользовательскими системами, или

  • тип канала, prm.ChanType, или

  • количество лучей, prm.nRays, используемый для однопользовательской системы.

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

Ссылки

  1. Molisch, A. F. и др. "Гибридный Beamforming для Крупного MIMO: Обзор". Журнал IEEE® Communications, Издание 55, № 9, сентябрь 2017, стр 134-141.

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

  3. El Ayach, Oma, и др. "Пространственно Разреженное Предварительное кодирование в Волне Миллиметра Системы MIMO". Транзакции IEEE на Радиосвязях, Издании 13, № 3, март 2014, стр 1499-1513.

  4. Адхикэри А., Дж. Нэм, J-Y Ан и Г. Кэр. "Соедините Пространственное Деление и Мультиплексирующий - Режим Большого массива". Транзакции IEEE на Теории информации, Издании 59, № 10, октябрь 2013, стр 6441-6463.

  5. Спенсер К., А. Свиндлехерст, М. Хардт, "Обеспечивающие нуль Методы для Нисходящего Пространственного Мультиплексирования в Многопользовательских Каналах MIMO". Транзакции IEEE на Обработке сигналов, Издании 52, № 2, февраль 2004, стр 461-471.

  6. Шуй, D. S. Г. Й. Фоскини, М. Дж. Гэнс и Дж. М. Кан. "Исчезающая Корреляция и ее Эффект на Способности Многоэлементных Систем Антенны". Транзакции IEEE на Коммуникациях, Издании 48, № 3, март 2000, стр 502-513.