Этот пример показывает, как используются фазированные массивы в системе связи MIMO-OFDM, использующей формирование луча. Используя компоненты из Communications Toolbox™ и Phased Array System Toolbox™, он моделирует излучающие элементы, которые содержат передатчик и компоненты переднего приемника, для системы связи MIMO-OFDM. С помощью пользовательских параметров можно проверить производительность системы с точки зрения частоты битовых ошибок и совокупностей для различных пространственных местоположений и размеров массива.
В примере используются функции и системные objects™ из Communications Toolbox и Phased Array System Toolbox и требуется
Модель канала WINNER II для панели инструментов связи
Системы MIMO-OFDM являются нормой в современных беспроводных системах (например, 5G NR, LTE, WLAN) из-за их устойчивости к частотно-избирательным каналам и высокой разрешенной скорости передачи данных. С постоянно возрастающими требованиями к скоростям передачи данных эти системы становятся все более сложными и более крупными в конфигурациях с возрастающим числом антенных элементов и выделенными ресурсами (поднесущими).
С антенными решетками и пространственным мультиплексированием необходимы эффективные способы реализации передач [6]. Формирование диаграммы направленности является одной из таких методик, которая используется для улучшения отношения сигнал/шум (SNR), которое в конечном счете улучшает производительность системы, как измеряется здесь в терминах частоты ошибок в битах (BER) [1].
Этот пример иллюстрирует асимметричную однопользовательскую систему MIMO-OFDM, в которой максимальное количество антенных элементов на передающем и приемном концах может составлять 1024 и 32 соответственно, с до 16 независимыми потоками данных. Он моделирует пространственный канал, где местоположения решеток и диаграммы направленности антенн включены в общую конструкцию системы. Для простоты моделируется одна двухточечная линия связи (одна базовая станция, связывающаяся с одним мобильным пользователем). Линия связи использует канальное зондирование для предоставления передатчику канальной информации, необходимой для формирования луча.
В примере предлагается выбор нескольких пространственно определенных моделей каналов, в частности модели канала WINNER II и модели на основе рассеяния, обе из которых учитывают пространственные местоположения передачи/приема и диаграммы направленности антенн.
s = rng(61); % Set RNG state for repeatability
Определите параметры для системы. Эти параметры могут быть изменены для изучения их влияния на систему.
% Single-user system with multiple streams prm.numUsers = 1; % Number of users prm.numSTS = 16; % Number of independent data streams, 4/8/16/32/64 prm.numTx = 32; % Number of transmit antennas prm.numRx = 16; % Number of receive antennas prm.bitsPerSubCarrier = 6; % 2: QPSK, 4: 16QAM, 6: 64QAM, 8: 256QAM prm.numDataSymbols = 10; % Number of OFDM data symbols prm.fc = 4e9; % 4 GHz system prm.chanSRate = 100e6; % Channel sampling rate, 100 Msps prm.ChanType = 'Scattering'; % Channel options: 'WINNER', 'Scattering', % 'ScatteringFcn', 'StaticFlat' prm.NFig = 5; % Noise figure, dB % Array locations and angles prm.posTx = [0;0;0]; % BS/Transmit array position, [x;y;z], meters prm.mobileRange = 300; % meters % Angles specified as [azimuth;elevation], az=[-90 90], el=[-90 90] prm.mobileAngle = [33; 0]; % degrees prm.steeringAngle = [30; -20]; % Transmit steering angle (close to mobileAngle) prm.enSteering = true; % Enable/disable steering
Параметры для определения модуляции OFDM, используемой для системы, определены ниже.
prm.FFTLength = 256; prm.CyclicPrefixLength = 64; prm.numCarriers = 234; prm.NumGuardBandCarriers = [7 6]; prm.PilotCarrierIndices = [26 54 90 118 140 168 204 232]; nonDataIdx = [(1:prm.NumGuardBandCarriers(1))'; prm.FFTLength/2+1; ... (prm.FFTLength-prm.NumGuardBandCarriers(2)+1:prm.FFTLength)'; ... prm.PilotCarrierIndices.';]; prm.CarriersLocations = setdiff((1:prm.FFTLength)',sort(nonDataIdx)); numTx = prm.numTx; numRx = prm.numRx; numSTS = prm.numSTS; prm.numFrmBits = numSTS*prm.numDataSymbols*prm.numCarriers* ... prm.bitsPerSubCarrier*1/3-6; % Account for termination bits prm.modMode = 2^prm.bitsPerSubCarrier; % Modulation order % Account for channel filter delay prm.numPadZeros = 3*(prm.FFTLength+prm.CyclicPrefixLength); % Get transmit and receive array information prm.numSTSVec = numSTS; [isTxURA,expFactorTx,isRxURA,expFactorRx] = helperArrayInfo(prm,true);
Обработка для канального зондирования, передачи данных и приема, смоделированная в примере, показана на следующих блок-схемах.

Потери в тракте свободного пространства вычисляются на основе местоположения базовой станции и мобильной станции для смоделированной пространственно-осведомленной системы.
prm.cLight = physconst('LightSpeed'); prm.lambda = prm.cLight/prm.fc; % Mobile position [xRx,yRx,zRx] = sph2cart(deg2rad(prm.mobileAngle(1)),... deg2rad(prm.mobileAngle(2)),prm.mobileRange); prm.posRx = [xRx;yRx;zRx]; [toRxRange,toRxAng] = rangeangle(prm.posTx,prm.posRx); spLoss = fspl(toRxRange,prm.lambda); gainFactor = 1;
Для пространственно мультиплексированной системы наличие канальной информации в передатчике позволяет применять предварительное кодирование для максимизации энергии сигнала в направлении и канале, представляющих интерес. В предположении о медленно изменяющемся канале это облегчается первым зондированием канала, в котором для опорной передачи приемник оценивает канал и подает эту информацию обратно в передатчик.
Для выбранной системы сигнал преамбулы посылается по всем передающим антенным элементам и обрабатывается в приемнике, учитывающем канал. Компоненты приемника выполняют предварительное усиление, демодуляцию OFDM, оценку канала в частотной области и вычисление весов обратной связи на основе диагонализации канала с использованием разложения сингулярных значений (SVD) на поднесущую данных.
% Generate the preamble signal preambleSigSTS = helperGenPreamble(prm); % repeat over numTx preambleSig = zeros(size(preambleSigSTS,1),numTx); for i = 1:numSTS preambleSig(:,(i-1)*expFactorTx+(1:expFactorTx)) = ... repmat(preambleSigSTS(:,i),1,expFactorTx); end % Transmit preamble over channel [rxPreSig,chanDelay] = helperApplyChannel(preambleSig,prm,spLoss); % Front-end amplifier gain and thermal noise rxPreAmp = phased.ReceiverPreamp( ... 'Gain',gainFactor*spLoss, ... % account for path loss 'NoiseFigure',prm.NFig, ... 'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); rxPreSigAmp = rxPreAmp(rxPreSig); rxPreSigAmp = rxPreSigAmp * ... % scale power (sqrt(prm.FFTLength-sum(prm.NumGuardBandCarriers)-1)/(prm.FFTLength)); % OFDM Demodulation demodulatorOFDM = comm.OFDMDemodulator( ... 'FFTLength',prm.FFTLength, ... 'NumGuardBandCarriers',prm.NumGuardBandCarriers.', ... 'RemoveDCCarrier',true, ... 'PilotOutputPort',true, ... 'PilotCarrierIndices',prm.PilotCarrierIndices.', ... 'CyclicPrefixLength',prm.CyclicPrefixLength, ... 'NumSymbols',numSTS, ... % preamble symbols alone 'NumReceiveAntennas',numRx); rxOFDM = demodulatorOFDM( ... rxPreSigAmp(chanDelay+1:end-(prm.numPadZeros-chanDelay),:)); % Channel estimation from preamble % numCarr, numSTS, numRx hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm); % Calculate the feedback weights v = diagbfweights(hD);
Для краткости представления предполагается синхронизация внешнего интерфейса, включая восстановление несущей и восстановление синхронизации. Веса, вычисленные с помощью diagbfweights следовательно, подаются обратно в передатчик для последующего применения для фактической передачи данных.
Далее мы конфигурируем передатчик данных системы. Эта обработка включает в себя канальное кодирование, преобразование битов в комплексные символы, разделение отдельного потока данных на множество потоков передачи, предварительное кодирование потоков передачи, модуляцию OFDM с отображением пилот-сигнала и репликацию для используемых передающих антенн.
% Convolutional encoder encoder = comm.ConvolutionalEncoder( ... 'TrellisStructure',poly2trellis(7,[133 171 165]), ... 'TerminationMethod','Terminated'); % Generate mapped symbols from bits txBits = randi([0, 1],prm.numFrmBits,1); encodedBits = encoder(txBits); % Bits to QAM symbol mapping mappedSym = qammod(encodedBits,prm.modMode,'InputType','Bit', ... 'UnitAveragePower',true); % Map to layers: per symbol, per data stream gridData = reshape(mappedSym,prm.numCarriers,prm.numDataSymbols,numSTS); % 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 % OFDM modulation of the data modulatorOFDM = comm.OFDMModulator( ... 'FFTLength',prm.FFTLength,... 'NumGuardBandCarriers',prm.NumGuardBandCarriers.',... 'InsertDCNull',true, ... 'PilotInputPort',true,... 'PilotCarrierIndices',prm.PilotCarrierIndices.',... 'CyclicPrefixLength',prm.CyclicPrefixLength,... 'NumSymbols',prm.numDataSymbols,... 'NumTransmitAntennas',numSTS); % Multi-antenna pilots pilots = helperGenPilots(prm.numDataSymbols,numSTS); txOFDM = modulatorOFDM(preData,pilots); txOFDM = txOFDM * (prm.FFTLength/ ... sqrt(prm.FFTLength-sum(prm.NumGuardBandCarriers)-1)); % scale power % Generate preamble with the feedback weights and prepend to data preambleSigD = helperGenPreamble(prm,v); txSigSTS = [preambleSigD;txOFDM]; % Repeat over numTx txSig = zeros(size(txSigSTS,1),numTx); for i = 1:numSTS txSig(:,(i-1)*expFactorTx+(1:expFactorTx)) = ... repmat(txSigSTS(:,i),1,expFactorTx); end
Для предварительного кодирования сигнал преамбулы регенерируется, чтобы разрешить оценку канала. Он предшествует части данных для формирования пакета передачи, который затем реплицируется через передающие антенны.
Phased Array System Toolbox предлагает компоненты, подходящие для проектирования и моделирования фазированных массивов, используемых в системах беспроводной связи.
Для пространственно осведомленной системы сигнал, передаваемый от базовой станции, направляется в направлении подвижной станции так, чтобы фокусировать излучаемую энергию в желаемом направлении. Это достигается путем применения фазового сдвига к каждому антенному элементу для управления передачей.
В примере используется линейная или прямоугольная матрица в передатчике в зависимости от количества потоков данных и количества выбранных передающих антенн.
% Gain per antenna element amplifier = phased.Transmitter('PeakPower',1/numTx,'Gain',0); % Amplify to achieve peak transmit power for each element for n = 1:numTx txSig(:,n) = amplifier(txSig(:,n)); end % Transmit antenna array definition if isTxURA % Uniform Rectangular array arrayTx = phased.URA([expFactorTx,numSTS],[0.5 0.5]*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); else % Uniform Linear array arrayTx = phased.ULA(numTx, ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); end % For evaluating weights for steering SteerVecTx = phased.SteeringVector('SensorArray',arrayTx, ... 'PropagationSpeed',prm.cLight); % Generate weights for steered direction wT = SteerVecTx(prm.fc,prm.steeringAngle); % Radiate along the steered direction, without signal combining radiatorTx = phased.Radiator('Sensor',arrayTx, ... 'WeightsInputPort',true, ... 'PropagationSpeed',prm.cLight, ... 'OperatingFrequency',prm.fc, ... 'CombineRadiatedSignals',false); if prm.enSteering txSteerSig = radiatorTx(txSig,repmat(prm.mobileAngle,1,numTx), ... conj(wT)); else txSteerSig = txSig; end % Visualize the array h = figure('Position',figposition([10 55 22 35]),'MenuBar','none'); h.Name = 'Transmit Array Geometry'; viewArray(arrayTx); % Visualize the transmit pattern and steering h = figure('Position',figposition([32 55 22 30]),'MenuBar','none'); h.Name = 'Transmit Array Response Pattern'; pattern(arrayTx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wT); h = figure('Position',figposition([54 55 22 35]),'MenuBar','none'); h.Name = 'Transmit Array Azimuth Pattern'; patternAzimuth(arrayTx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wT); if isTxURA h = figure('Position',figposition([76 55 22 35]),'MenuBar','none'); h.Name = 'Transmit Array Elevation Pattern'; patternElevation(arrayTx,prm.fc,'PropagationSpeed',prm.cLight, ... 'Weights',wT); end




Графики показывают геометрию массива и ответ передающего массива в нескольких видах. Отклик показывает направление передачи, определяемое углом поворота.
В примере предполагается, что угол поворота известен и близок к подвижному углу. В реальных системах это будет оцениваться по оценке угла прихода в приемнике как часть процедур зондирования канала или отслеживания начального луча.
В примере предлагаются три варианта пространственных каналов MIMO и более простой статический-плоский канал MIMO для целей оценки.
Модель канала WINNER II [5] является пространственно определенным MIMO-каналом, который позволяет указать геометрию массива и информацию о местоположении. Он сконфигурирован для использования типичного сценария городской микросоты в помещении с очень низкой скоростью мобильной связи.
Два основанных на рассеянии канала используют путь с одним отскоком через каждый рассеиватель, где количество рассеивателей задано пользователем. В этом примере количество рассеивателей устанавливается равным 100. Опция «Рассеяние» моделирует рассеиватели, размещенные случайным образом в пределах круга между передатчиком и приемником, в то время как «Рассеяние Fcn» моделирует их размещение совершенно случайным образом.
Модели позволяют моделировать потери в тракте и условия распространения как линии визирования (LOS), так и не LOS. В примере предполагается не-LOS распространение и изотропные диаграммы направленности антенных элементов с линейной геометрией.
% Apply a spatially defined channel to the steered signal
[rxSig,chanDelay] = helperApplyChannel(txSteerSig,prm,spLoss,preambleSig);
Один и тот же канал используется как для зондирования, так и для передачи данных, причем передача данных имеет большую длительность, управляемую параметром количества символов данных, prm.numDataSymbols.
Приемник управляет падающими сигналами так, чтобы они совпадали с рулевым управлением передающего конца на приемный элемент. Применяют тепловой шум и коэффициент усиления приемника. Однородные линейные или прямоугольные матрицы с изотропными откликами моделируются для согласования с матрицами каналов и передатчиков.
rxPreAmp = phased.ReceiverPreamp( ... 'Gain',gainFactor*spLoss, ... % accounts for path loss 'NoiseFigure',prm.NFig, ... 'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); % Front-end amplifier gain and thermal noise rxSigAmp = rxPreAmp(rxSig); rxSigAmp = rxSigAmp * ... % scale power (sqrt(prm.FFTLength - sum(prm.NumGuardBandCarriers)-1)/(prm.FFTLength)); % Receive array if isRxURA % Uniform Rectangular array arrayRx = phased.URA([expFactorRx,numSTS],0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); else % Uniform Linear array arrayRx = phased.ULA(numRx, ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement); end % For evaluating receive-side steering weights SteerVecRx = phased.SteeringVector('SensorArray',arrayRx, ... 'PropagationSpeed',prm.cLight); % Generate weights for steered direction towards mobile wR = SteerVecRx(prm.fc,toRxAng); % Steer along the mobile receive direction if prm.enSteering rxSteerSig = rxSigAmp.*(wR'); else rxSteerSig = rxSigAmp; end % Visualize the array h = figure('Position',figposition([10 20 22 35]),'MenuBar','none'); h.Name = 'Receive Array Geometry'; viewArray(arrayRx); % Visualize the receive pattern and steering h = figure('Position',figposition([32 20 22 30])); h.Name = 'Receive Array Response Pattern'; pattern(arrayRx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wR); h = figure('Position',figposition([54 20 22 35]),'MenuBar','none'); h.Name = 'Receive Array Azimuth Pattern'; patternAzimuth(arrayRx,prm.fc,'PropagationSpeed',prm.cLight,'Weights',wR); if isRxURA figure('Position',figposition([76 20 22 35]),'MenuBar','none'); h.Name = 'Receive Array Elevation Pattern'; patternElevation(arrayRx,prm.fc,'PropagationSpeed',prm.cLight, ... 'Weights',wR); end



Диаграмма направленности приемной антенны зеркально отражает управление передачей.
Приемная антенная решетка передает распространенный сигнал в приемник для восстановления исходной информации, внедренной в сигнал. Подобно передатчику, приемник, используемый в системе MIMO-OFDM, содержит множество компонентов, включая демодулятор OFDM, эквалайзер MIMO, демодулятор QAM и канальный декодер.
demodulatorOFDM = comm.OFDMDemodulator( ... 'FFTLength',prm.FFTLength, ... 'NumGuardBandCarriers',prm.NumGuardBandCarriers.', ... 'RemoveDCCarrier',true, ... 'PilotOutputPort',true, ... 'PilotCarrierIndices',prm.PilotCarrierIndices.', ... 'CyclicPrefixLength',prm.CyclicPrefixLength, ... 'NumSymbols',numSTS+prm.numDataSymbols, ... % preamble & data 'NumReceiveAntennas',numRx); % OFDM Demodulation rxOFDM = demodulatorOFDM( ... rxSteerSig(chanDelay+1:end-(prm.numPadZeros-chanDelay),:)); % Channel estimation from the mapped preamble hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm); % MIMO Equalization [rxEq,CSI] = helperMIMOEqualize(rxOFDM(:,numSTS+1:end,:),hD); % Soft demodulation scFact = ((prm.FFTLength-sum(prm.NumGuardBandCarriers)-1) ... /prm.FFTLength^2)/numTx; nVar = noisepow(prm.chanSRate,prm.NFig,290)/scFact; 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,numSTS); csitmp = reshape(CSI,1,[],1,numSTS); rxScaledLLR = rxLLRtmp.*csitmp; % Soft-input channel decoding decoder = comm.ViterbiDecoder(... 'InputFormat','Unquantized', ... 'TrellisStructure',poly2trellis(7, [133 171 165]), ... 'TerminationMethod','Terminated', ... 'OutputDataType','double'); rxDecoded = decoder(rxScaledLLR(:)); % Decoded received bits rxBits = rxDecoded(1:prm.numFrmBits);
Для смоделированной системы MIMO отображаемая совокупность приема выровненных символов предлагает качественную оценку приема. Фактическая частота битовых ошибок обеспечивает количественный показатель путем сравнения фактических переданных битов с принятыми декодированными битами.
% Display received constellation constDiag = comm.ConstellationDiagram( ... 'SamplesPerSymbol',1, ... 'ShowReferenceConstellation',true, ... 'ReferenceConstellation', ... qammod((0:prm.modMode-1)',prm.modMode,'UnitAveragePower',true), ... 'ColorFading',false, ... 'Position',figposition([20 20 35 40]), ... 'Title','Equalized Symbols', ... 'EnableMeasurements',true, ... 'MeasurementInterval',length(rxSymbs)); constDiag(rxSymbs); % Compute and display bit error rate ber = comm.ErrorRate; measures = ber(txBits,rxBits); fprintf('BER = %.5f; No. of Bits = %d; No. of errors = %d\n', ... measures(1),measures(3),measures(2)); rng(s); % Restore RNG state
BER = 0.00000; No. of Bits = 74874; No. of errors = 0

Пример подчеркивает использование фазированных антенных решеток для системы MIMO-OFDM с формированием луча. Он учитывает пространственную геометрию и местоположение массивов на базовой станции и мобильной станции для системы с одним пользователем. Используя канальное зондирование, оно проиллюстрировало, как предварительное кодирование реализуется в современных беспроводных системах и как моделируется управление антенными решетками.
В наборе конфигурируемых параметров можно изменять количество потоков данных, антенные элементы передачи/приема, местоположения и геометрию станций или решеток, модели каналов и их конфигурации для изучения индивидуальных или комбинированных эффектов параметров на систему. Например, варьировать только количество передающих антенн, чтобы видеть влияние на главный лепесток управляемого луча и результирующую производительность системы.
В примере также сделаны упрощающие допущения для фронтальной синхронизации, канальной обратной связи, пользовательской скорости и моделей потерь в тракте, которые необходимо дополнительно рассмотреть для практической системы. Отдельные системы также имеют свои собственные процедуры, которые необходимо сложить в модели [2, 3, 4].
Ознакомьтесь со следующими вспомогательными функциями:
Перахия, Эльдад и Роберт Стейси. Беспроводные LANS следующего поколения: 802.11n и 802.11ac. Издательство Кембриджского университета, 2013 год.
Стандарт IEEE ® Std 802.11™-2012 IEEE для информационных технологий - Связь и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY).
3GPP TS 36.213. «Процедуры физического уровня». Проект партнерства третьего поколения; техническая спецификация на сеть радиодоступа группы; Усовершенствованный универсальный наземный радиодоступа (E-UTRA). URL: https://www.3gpp.org.
3GPP ТС 36.101. «Пользовательское оборудование (UE) радиопередача и прием». Проект партнерства 3-го поколения; техническая спецификация на сеть радиодоступа группы; Усовершенствованный универсальный наземный радиодоступа (E-UTRA). URL: https://www.3gpp.org.
Kyosti, Pekka, Juha Meinila и др. Модели каналов WINNER II. D1.1.2, V1.2. IST-4-027756 ПОБЕДИТЕЛЬ II, сентябрь 2007 года.
Джордж Цулос, ред., «Системная технология MIMO для беспроводной связи», CRC Press, Boca Raton, FL, 2006.