Этот пример показывает, как фазированные решетки используются в системе связи MIMO-OFDM, использующей формирование луча. Используя компоненты из 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]. Формирование луча является одним из таких методов, который используется для улучшения отношения сигнал/шум (ОСШ), которое в конечном счете улучшает производительность системы, как измерено здесь с точки зрения частоты битовой ошибки (BER) [1].
Этот пример иллюстрирует асимметричную однопользовательскую систему MIMO-OFDM, где максимальное количество антенных элементов на передающем и приемном концах может составлять 1024 и 32 соответственно с 16 независимыми потоками данных. Он моделирует пространственный канал, где местоположения массивов и шаблонов антенны включены в общую разработку системы. Для простоты моделируется одна ссылка «точка-точка» (одна базовая станция, связанная с одним мобильным пользователем). Ссылка использует зондирование канала, чтобы предоставить передатчику информацию канала, необходимую для формирования луча.
Пример предлагает выбор нескольких пространственно определенных моделей канала, в частности модель 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. Опция 'Scattering' моделирует рассеиватели, расположенные случайным образом в пределах круга между передатчиком и приемником, в то время как '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
Пример высветил использование фазированных антенных решеток для лучистой системы MIMO-OFDM. Он учитывал пространственную геометрию и расположение массивов в базовой станции и мобильной станции для одной пользовательской системы. Используя зондирование канала, оно проиллюстрировало, как осуществляется предварительное кодирование в текущих беспроводных системах и как моделируется управление антенными решетками.
В наборе конфигурируемых параметров можно варьировать количество потоков данных, антенные элементы передачи/приема, местоположения станции или решётки и геометрию, модели канала и их строений, чтобы изучить индивидуальные или комбинированные эффекты параметров на систему. Например, варьируйте только количество передающих антенн, чтобы увидеть эффект на основной лепесток управляемого луча и результаты производительности системы.
Пример также сделал упрощающие допущения для моделей синхронизации переднего плана, обратной связи канала, скорости пользователя и потерь пути, которые должны быть дополнительно рассмотрены для практической системы. Отдельные системы также имеют свои собственные процедуры, которые должны быть сложены в моделирование [2, 3, 4].
Исследуйте следующие используемые вспомогательные функции:
Перахия, Элдад и Роберт Стейси. Беспроводные LANS следующей генерации: 802.11n и 802.11ac. Cambridge University Press, 2013.
Стандарт IEEE ® Std 802.11™-2012 IEEE на информационные технологии - Телекоммуникации и обмен информацией между системами - Локальные и столичные сети - Особые требования - Часть 11. Спецификации беспроводного управления доступом к среде локальной сети (MAC) и физического слоя (PHY).
3GPP ТС 36.213. «Процедуры физического слоя». 3-ья Генерация Партнерский проект; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL-адрес: https://www.3gpp.org.
3GPP TS 36.101. «Пользовательское оборудование (UE) Радиопередача и прием». 3-ья Генерация Партнерский проект; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL-адрес: https://www.3gpp.org.
Kyosti, Pekka, Juha Meinila, et al. WINNER II Модели канала. D1.1.2, V1.2. IST-4-027756 WINNER II, сентябрь 2007 года.
Джордж Цулос, Ред., «MIMO System Technology for Wireless Communications», CRC Press, Boca Raton, FL, 2006.