В этом примере показано, как поэтапные массивы используются в системе связи MIMO-OFDM, использующей beamforming. Используя компоненты от Communications Toolbox™ и Phased Array System Toolbox™, это моделирует исходящие элементы, которые включают передатчик и компоненты получателя фронтенда для системы связи MIMO-OFDM. Заданными пользователями параметрами можно подтвердить производительность системы в терминах частоты ошибок по битам и созвездий для различных пространственных местоположений и размеров массивов.
Пример использует функции и Систему objects™ от Communications Toolbox и Phased Array System Toolbox и требует
WINNER II моделей канала для Communications Toolbox
Системы MIMO-OFDM являются нормой в текущих беспроводных системах (например, 5G NR, LTE, WLAN) из-за их робастности к выборочным частотой каналам, и высокие скорости передачи данных включили. С постоянно увеличивающимися требованиями на поддерживаемые скорости передачи данных эти системы становятся более комплексными и больше в настройках с растущим числом элементов антенны и ресурсах выделенные (поднесущие).
С антенными решетками и пространственным мультиплексированием, эффективные методы, чтобы понять передачи необходимы [6]. Beamforming является одним таким методом, который используется, чтобы улучшить сигнал до шумового отношения (ОСШ), который в конечном счете улучшает производительность системы, как измерено здесь в терминах частоты ошибок по битам (BER) [1].
Этот пример иллюстрирует асимметричный MIMO-OFDM однопользовательская система, где максимальное количество элементов антенны на передаче и получает концы, может быть 1024 и 32 соответственно, максимум с 16 независимыми потоками данных. Это моделирует пространственный канал, где местоположения массивов и шаблоны антенны включены в полную разработку системы. Для простоты моделируется одна магистральная линия (одна базовая станция, связывающаяся с одним мобильным пользователем). Канал использования ссылки, звучащий, чтобы предоставить передатчику информацию о канале, этому нужно для beamforming.
Пример предлагает выбор нескольких пространственно заданных моделей канала, в частности модели WINNER II Channel и основанной на рассеивании модели, оба из которых составляют передавание/получение пространственных местоположений и шаблонов антенны.
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. 'Рассеивающаяся' опция моделирует рассеиватели, помещенные случайным образом в кругу, промежуточном передатчик и получатель, в то время как модели 'ScatteringFcn' их размещение полностью случайным образом.
Модели позволяют моделирование пути потерь и и угол обзора (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
Пример подсветил использование поэтапных антенных решеток для beamformed системы MIMO-OFDM. Это составляло пространственную геометрию и местоположение массивов в базовой станции и мобильной станции для системы отдельного пользователя. Используя звучание канала, это проиллюстрировало, как предварительное кодирование понято в текущих беспроводных системах и как регулирование антенных решеток моделируется.
В наборе конфигурируемых параметров можно варьироваться количество потоков данных, передать/получить элементы антенны, станцию или местоположения массивов и геометрию, модели канала и их настройки, чтобы изучить отдельное или совместное воздействие параметров на систему. Например, варьируйтесь только количество антенн передачи, чтобы видеть эффект на основном лепестке управляемого луча и получившейся производительности системы.
Пример также сделал упрощение предположений для синхронизации фронтенда, обратной связи канала, пользовательской скорости и моделей пути потерь, которые должны быть далее рассмотрены для практической системы. Отдельные системы также имеют свои собственные процедуры, которые должны быть свернуты в к моделированию [2, 3, 4].
Исследуйте следующие используемые функции помощника:
Perahia, Элдэд и Роберт Стейси. Беспроводная связь следующего поколения LANS: 802.11n и 802.11ac. Издательство Кембриджского университета, 2013.
Стандарт IEEE® Std 802.11™-2012 IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования.
3GPP TS 36.213. "Процедуры физического уровня". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group; Развитый Универсальный Наземный Радио-доступ (к E-UTRA). URL: https://www.3gpp.org.
3GPP TS 36.101. "Передача радио оборудования пользователя (UE) и прием". Проект партнерства третьего поколения; сеть радиодоступа Technical Specification Group; развитый Универсальный наземный радио-доступ (к E-UTRA). URL: https://www.3gpp.org.
Kyosti, Пекка, Juha Meinila, и др. ПОБЕДИТЕЛЬ II Моделей Канала. D1.1.2, V1.2. IST-4-027756 WINNER II, сентябрь 2007.
Джордж Тсуос, Эд., "системная технология MIMO для радиосвязей", нажатие CRC, Бока-Ратон, FL, 2006.