Этот пример показывает, как гибридное формирование луча используется в передающем конце массивной коммуникационной системы 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
, используется для однопользовательской системы.
Исследуйте следующие вспомогательные функции, используемые в примере:
Molisch, A. F., et al. Гибридное формирование луча для массивного MIMO: A Survey (неопр.). Журнал IEEE ® Communications Magazine, том 55, № 9, сентябрь 2017, стр. 134-141.
Ли З., С. Хань, и А. Ф. Молиш. Гибридный проект формирования луча для многопользовательского MIMO-нисходящего канала с многопользовательской волной. IEEE ICC 2016, Симпозиум по обработке сигналов для связи.
El Ayach, Oma, et al. Пространственно-разреженное предварительное кодирование в системах MIMO волны миллиметра. Транзакции IEEE по беспроводной связи, том 13, № 3, март 2014, стр. 1499-1513.
Adhikary A., J. Nam, J-Y Ahn, and G. Caire. «Совместное пространственное деление и мультиплексирование - широкомасштабный режим массивов». Транзакции IEEE по теории информации, том 59, № 10, октябрь 2013, стр. 6441-6463.
Spencer Q., A. Swindlehurst, M. Haardt, «Методы нулевого форсирования для нисходящего пространственного мультиплексирования в многопользовательских каналах MIMO». Транзакции IEEE по обработке сигналов, том 52, № 2, февраль 2004 года, стр. 461-471.
Шуй, Д. С., Г. Дж. Фоскини, М. Дж. Ганс и Дж. М. Кан. «Затухающая корреляция и ее эффект на пропускную способность многоэлементных антенных систем». Транзакции IEEE по коммуникациям, том 48, № 3, март 2000 года, стр. 502-513.