Предварительное кодирование MIMO-OFDM с фазированными решетками

В этом примере показано, как фазированные решетки используются в системе связи MIMO-OFDM, использующей beamforming. Используя компоненты от Communications Toolbox™ и Phased Array System Toolbox™, это моделирует исходящие элементы, которые включают передатчик и компоненты приемника фронтенда для системы связи MIMO-OFDM. Заданными пользователями параметрами можно подтвердить эффективность системы в терминах частоты ошибок по битам и созвездий для различных пространственных местоположений и размеров массивов.

Пример использует функции и Систему objects™ от Communications Toolbox и Phased Array System Toolbox и требует

  • WINNER II моделей канала для Communications Toolbox

Введение

Системы MIMO-OFDM являются нормой в текущих беспроводных системах (e.g. NR 5G, 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].

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

Выбранная библиография

  1. Perahia, Элдэд и Роберт Стейси. Беспроводная связь следующего поколения LANS: 802.11n и 802.11ac. Издательство Кембриджского университета, 2013.

  2. Стандарт IEEE® Std 802.11™-2012 IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования.

  3. 3GPP TS 36.213. "Процедуры физического уровня". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group; Развитый Универсальный Наземный Радио-доступ (к E-UTRA). URL: https://www.3gpp.org.

  4. 3GPP TS 36.101. "Передача Радио Оборудования пользователя (UE) и Прием". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group; Развитый Универсальный Наземный Радио-доступ (к E-UTRA). URL: https://www.3gpp.org.

  5. Kyosti, Пекка, Juha Meinila, и др. ПОБЕДИТЕЛЬ II Моделей Канала. D1.1.2, V1.2. IST-4-027756 WINNER II, сентябрь 2007.

  6. Джордж Тсуос, Эд., "системная технология MIMO для радиосвязей", нажатие CRC, Бока-Ратон, FL, 2006.